Feign简介

Feign是Netflix开发的轻量级Restful的HTTP服务客户端(用它来发起请求,远程调用)。
以Java接口注解的方式调用http请求,不用通过封装http请求报文的方式调用。
类似于Dubbo,服务消费者拿到服务提供者的接口,像调用本地接口方法一样去调用(实际发出的远程请求)。

  • Feign可以更加便捷和优雅的调用http api:不需要去拼接url然后调用restTemplate的api。在Spring Cloud中,使用Feign只需要创建一个接口(在消费者服务调用方端),并在接口上添加一些注解,就可以完成远程调用。
  • Spring Colud对Feign进行了增强,是Fegin支持SpringMVC注解(OpenFeign)。
  • 本质:封装了Http调用流程,更符合面向接口化的编程习惯,类似Dubbo的服务调用。

    Feign配置应用

    Feign = RestTemplate + Ribbon + Hystrix
    (1)在服务消费者工程引入Feign依赖(或者父类工程)

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>

    (2)服务消费者工程启动类使用注解 @EnalbeFeignClients 添加Feign支持。

    1. @SpringBootApplication
    2. @EnableDiscoveryClient // 开启服务发现
    3. @EnableFeignClients // 开启Feign
    4. public class AutodeliverFeignApplication8092 {
    5. public static void main(String[] args) {
    6. SpringApplication.run(AutodeliverFeignApplication8092.class, args);
    7. }
    8. }

    (3)创建Feign接口

    1. // name:调⽤的服务名称,和服务提供者yml⽂件中spring.application.name保持⼀致
    2. @FeignClient(name="lagou-service-resume")
    3. public interface ResumeFeignClient {
    4. //调⽤的请求路径
    5. @RequestMapping(value = "/resume/openstate/{userId}", method = RequestMethod.GET)
    6. public Integer findResumeOpenState(@PathVariable(value = "userId") Long userId);
    7. }

    注意

  • @FeignClient注解的name属性用于指定要调用的服务提供者名称,和服务提供者yml文件中的 spring.application.name 保持一致。

  • 接口中的接口方法,就好比是远程服务提供者Controller中的Handler方法。在进行参数绑定的时候,可以使用@PathVariable、@RequestParam、@RequestHeader等,这是OpenFeign对Spring MVC注解的支持,但是需要注意value必须设置,否则会抛出异常。

(4) 使用接口中方法完成远程调用(注入接口即可,实际注入注入的是接口的实现)

  1. @Autowired
  2. private ResumeFeignClient resumeFeignClient;
  3. @Test
  4. public void testFeignClient(){
  5. Integer resumeOpenState = resumeFeignClient.findResumeOpenState(1545132l);
  6. System.out.println("=======>>>resumeOpenState:" + resumeOpenState);
  7. }

Feign对负载均衡的支持

Feign本身已经集成了Ribbon依赖和自动配置,因此不需要额外引入依赖,可以通过 ribbon.xx 来进行全局配置,也可以通过 服务名.ribbon.xx 来对指定服务进行细节配置。
Feign默认的请求处理超时时长1s,可以根据业务场景适当进行调整。
如果配置了Ribbon的超时,则会以Ribbon的为准,Feign的超时设置会失效。

Ribbon设置

  1. #针对的被调⽤⽅微服务名称,不加就是全局⽣效
  2. lagou-service-resume:
  3. ribbon:
  4. #请求连接超时时间
  5. #ConnectTimeout: 2000
  6. #请求处理超时时间
  7. #ReadTimeout: 5000
  8. #对所有操作都进⾏重试
  9. OkToRetryOnAllOperations: true
  10. ####根据如上配置,当访问到故障请求的时候,它会再尝试访问⼀次当前实例(次数由MaxAutoRetries配置),
  11. ####如果不⾏,就换⼀个实例进⾏访问,如果还不⾏,再换⼀次实例访问(更换次数由MaxAutoRetriesNextServer配置),
  12. ####如果依然不⾏,返回失败信息。
  13. MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第⼀次调⽤
  14. MaxAutoRetriesNextServer: 0 #切换实例的重试次数
  15. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整

Feign对熔断器的支持

1. 开启对熔断器的支持

(1)在Feign客户端配置文件application.yml 中开启Feign对熔断器的支持。

  1. # 开启Feign的熔断功能
  2. feign:
  3. hystrix:
  4. enabled: true

2. Hystrix超时设置

  1. hystrix:
  2. command:
  3. default:
  4. execution:
  5. isolation:
  6. thread:
  7. ##Hystrix的超时时⻓设置
  8. timeoutInMilliseconds: 15000

注意: (1)开启Hystrix之后,Feign中的方法都会被进行一个管理,一旦出现问题就进入对应的回退逻辑处理。 (2)针对超时,当前两个超时时间设置(Feign/Hystrix),熔断的时候会根据这两个时间的最小值来进行,即处理时间超过最短的超时时间就会熔断进入回退降级逻辑。

3. 自定义Fallback处理类(需事先FeignClient接口)

  1. /**
  2. * 降级回退逻辑需要定义⼀个类,实现FeignClient接⼝,实现接⼝中的⽅法
  3. */
  4. @Component // 别忘了这个注解,还应该被扫描到
  5. public class ResumeFallback implements ResumeServiceFeignClient {
  6. @Override
  7. public Integer findDefaultResumeState(Long userId) {
  8. return -6;
  9. }
  10. }

4. 在@FeignClient注解中关联Fallback处理类

  1. // 使⽤fallback的时候,类上的@RequestMapping的url前缀限定,改成配置在@FeignClient的path属性中
  2. @FeignClient(value = "lagou-service-resume",fallback = ResumeFallback.class,path = "/resume")
  3. //@RequestMapping("/resume")
  4. public interface ResumeServiceFeignClient {

Feign对请求压缩和响应压缩的支持

Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
通过下面的参数即可开启请求与响应的压缩功能。

  1. feign:
  2. compression:
  3. request:
  4. enabled: true # 开启请求压缩
  5. # 设置压缩的数据类型,此处也是默认值
  6. mime-types: text/html,application/xml,application/json
  7. # 设置触发压缩的⼤⼩下限,此处也是默认值
  8. min-request-size: 2048
  9. response:
  10. enabled: true # 开启响应压缩

Feign的日志级别配置

Feign是http请求客户端,类似浏览器,它在请求和接收响应的时候,是可以打印出详细的日志信息(响应头,状态码等)。可以通过配置日志级别,开启Feign的日志显示。

1. 开启Feign日志功能及级别

  1. // Feign的⽇志级别(Feign请求过程信息)
  2. // NONE:默认的,不显示任何⽇志----性能最好
  3. // BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪
  4. // HEADERS:在BASIC级别的基础上,记录请求和响应的header
  5. // FULL:记录请求和响应的header、body和元数据----适⽤于开发及测试环境定位问题
  6. @Configuration
  7. public class FeignConfig {
  8. @Bean
  9. Logger.Level feignLevel() {
  10. return Logger.Level.FULL;
  11. }
  12. }

2. 配置log日志级别为debug

  1. logging:
  2. level:
  3. # Feign⽇志只会对⽇志级别为debug的做出响应
  4. com.lagou.edu.controller.service.ResumeServiceFeignClient: debug