openfeign异步调用,openfeign使用
目录
OpenFeign服务调用什么是OpenFeign,它能做什么?Feign集成了RibbonFeign和OpenFeign之间的区别服务调用OpenFeign超时控制OpenFeign日志增强
OpenFeign服务调用
00-1010正式文件
Github地址
Feign是一个声明性的web服务客户端。它使得编写web服务客户端更加容易。使用Feign创建一个接口并对其进行注释。它有可插入的注释支持,包括假造注释和JAX-RS注释。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并支持使用Spring Web中默认使用的相同的HttpMessageConverters。Spring Cloud集成了Ribbon和Eureka,以及Spring Cloud LoadBalancer,在使用Feign时提供负载均衡的http客户端。环
Feign是一个声明性的web服务客户端。使用Feign可以更容易地编写Web服务客户端。其使用方法是定义一个服务接口然后在上面添加注解. Feign还支持可插拔编码器和解码器。Spring Cloud封装了Feign,以支持Spring MVC标准注释和HttpMessageConverters。Feign可以与Eureka和Ribbon结合使用,以支持负载平衡。
OpenFeign是什么
Feign旨在让服务被调用时编写Java Http客户端变得更容易。
在使用Ribbon RestTemplate时,通过使用RestTemplate封装http请求,形成了一套模板化的调用方法。但在实际开发中,由于服务依赖的调用可能不止一个,往往一个接口会在很多地方被调用,所以通常会为每个微服务打包一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步的封装,他帮助我们定义并实现了服务依赖接口的定义。在Feign的实现下,我们只需要创建一个接口,并通过标注进行配置(以前Dao接口是用Mapper标注标注的,现在是用Feign标注的微服务接口),就可以完成对服务提供者的接口绑定,从而简化了使用Spring cloud Ribbon时自动封装服务调用客户端的开发。
00-1010付费的服务列表信息由Ribbon维护,通过轮询实现客户端的负载均衡。与Ribbon不同,通过feign只需要定义服务绑定接口且以声明式的方法优雅而简单地实现了服务调用。
00-1010Feign是Spring Cloud组件中的一个轻量级RESTful HTTP服务客户端Feign。内置Ribbon,用来平衡客户端的负载,调用服务注册中心的服务。用的是Feign。接口由Feign的注释定义,调用这个接口就可以调用服务注册中心的服务。
依赖groupIdorg.springframework.cloud/groupId神器Spring-Cloud-Starter-Feign/Artifact ID/DependencyOpenFeign是Spring Cloud在Feign的基础上支持SpringMVC的注解,比如@RequesMapping等等。OpenFeign的@Feignclient可以解析SpringMVc的@RequestMapping注释下的接口,通过动态代理生成实现类,可以做负载均衡,调用其他服务。
dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
OpenFeign服务调用
接口+注解:微服务调用接口 + @FeignClient
1.新建cloud-consumer-feign-order80
2.POM
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>LearnCloud</artifactId> <groupId>com.lun.springcloud</groupId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-feign-order80</artifactId> <dependencies> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.lun.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基础通用配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies></project>
3.YML
server: port: 80eureka: client: register-with-eureka: false service-url: defaultZone: http://localhost:7001/eureka, http://localhost:7002/eureka
4.主启动
package cn.kt.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.openfeign.EnableFeignClients;/** * Created by tao. * Date: 2022/7/6 23:01 * 描述: */@SpringBootApplication@EnableFeignClients // 开启feign客户端 public class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class, args); }}
5.业务类
业务逻辑接口+@FeignClient配置调用provider服务
新建PaymentFeignService接口并新增注解@FeignClient
import com.lun.springcloud.entities.CommonResult;import com.lun.springcloud.entities.Payment;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;@Component@FeignClient(value = "CLOUD-PAYMENT-SERVICE")public interface PaymentFeignService{ @GetMapping(value = "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);}
控制层Controller
package cn.kt.springcloud.controller;import cn.kt.springcloud.entities.CommonResult;import cn.kt.springcloud.entities.Payment;import cn.kt.springcloud.service.PaymentFeignService;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/** * Created by tao. * Date: 2022/7/6 23:07 * 描述: */@RestController@Slf4jpublic class OrderFeignController { @Resource private PaymentFeignService paymentFeignService; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) { return paymentFeignService.getPaymentById(id); }}
6.测试
先启动2个eureka集群7001/7002
再启动2个微服务8001/8002
启动OpenFeign80启动
http://localhost/consumer/payment/get/31
Feign自带负载均衡配置项
配置对应关系如下图:
OpenFeign超时控制
超时设置,故意设置超时演示出错情况
1.服务提供方8001/8002故意写暂停程序
@RestController@Slf4jpublic class PaymentController { ... @Value("${server.port}") private String serverPort; ... @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout() { // 业务逻辑处理正确,但是需要耗费3秒钟 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return serverPort; } ...}
2.服务消费方80添加超时方法PaymentFeignService
@Component@FeignClient(value = "CLOUD-PAYMENT-SERVICE")public interface PaymentFeignService{ ... @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout();}
3.服务消费方80添加超时方法OrderFeignController
@RestController@Slf4jpublic class OrderFeignController{ @Resource private PaymentFeignService paymentFeignService; ... @GetMapping(value = "/consumer/payment/feign/timeout") public String paymentFeignTimeout() { // OpenFeign客户端一般默认等待1秒钟 return paymentFeignService.paymentFeignTimeout(); }}
4.测试:
多次刷新: http://localhost/consumer/payment/feign/timeout
将会跳出错误Spring Boot默认错误页面,主要异常:feign.RetryableException:Read timed out executing GET http://CLOUD-PAYMENT-SERVCE/payment/feign/timeout
。
OpenFeign默认等待1秒钟,超过后报错
YML文件里需要开启OpenFeign客户端超时控制
#设置feign客户端超时时间(OpenFeign默认支持ribbon)(单位:毫秒)ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000
OpenFeign日志增强
日志打印功能
Feign提供了日志打印功能,我们可以通过配置来调整日恙级别,从而了解Feign 中 Http请求的细节。
说白了就是对Feign接口的调用情况进行监控和输出
日志级别
NONE:默认的,不显示任何日志;BASIC:仅记录请求方法、URL、响应状态码及执行时间;HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。配置日志bean
package cn.kt.springcloud.config;import feign.Logger;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * Created by tao. * Date: 2022/7/7 00:01 * 描述: */@Configurationpublic class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }}
YML文件里需要开启日志的Feign客户端
logging: level: # feign日志以什么级别监控哪个接口 cn.kt.springcloud.service.PaymentFeignService: debug
打开刷新:http://localhost/consumer/payment/get/31
后台日志查看
得到更多日志信息。
到此这篇关于OpenFeign服务调用的文章就介绍到这了,更多相关OpenFeign服务调用内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。