一、简介
1、OpenFeign简介
Feign 是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。具有可插入注释支持,包括Feign注释和JAX-RS注释;支持可插拔式的编码器和解码器。Spring Cloud 对Feign进行了封装,使其支持了SpringMVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。官方文档地址:https://cloud.spring.io/spring-cloud-openfeign/reference/html/ 。
2、Feign 与OpenFeign 的区别
-
Feign 是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式:使用Feign的注解定义接口,调用这个接口就可以调用服务注册中心的服务。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
-
OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
二、OpenFeign使用步骤
1、建立一个新模块,在pom文件中引入Feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在主启动类上加注解 @EnableFeignClients 开启Feign;
3、在消费者端创建一个接口,接口中的方法是服务提供者中的方法;
@Component
//添加Feign注解,value=要寻找的微服务名称
@FeignClient("CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping("/payment/get/{id}")
CommonResult getPaymentById(@PathVariable("id") Long id);
}
4、定义自己的业务类,调用 Feign 接口中的方法即可,不用在手动的去引入RestTempLate。
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
三、OpenFeign超时控制
1、描述
消费者方与服务提供方之间对于服务的请求处理时间存在时间差,会超时导致程序报错。为解决这个问题,需要双方对于某些业务进行一些约定,保证程序正常运行。超时请求报错页面如下:
2、超时设置,在消费端的application.yml添加以下配置。
#设置feign客户端超时时间(OpenFeign默认支持Ribbon)
ribbon:
# 指的是建立连接后从服务器读取到可用资源所用的时间,单位ms
ReadTimeout: 5000
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间,单位ms
ConnectTimeout: 5000
四、OpenFeign 日志打印
1、Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而了解Feign中的Http请求的细节,对接口的调用情况进行监控和输出。
2、日志级别
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:处了Basic中定义的信息之外,还有请求和响应的头信息;
- FULL:处了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
3、配置方法
-
定义一个配置类
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
-
修改yml文件
logging: level: # feign日志以什么级别监控哪个接口 com.xhanglog.springcloud.service.PaymentFeignService: debug