是一个轻量级RESTful的HTTP服务客户端(用它来发起请求, 远程调用的组件)
以Java接口注解的方式调用Http请求,而不用像Java中通过封装 HTTP请求报文的方式直接调用
类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样去调用,实际发出的是远程的请求
1、 使用Feign非常简单,创建一个接口(在消费者,也就是服务调用方这一端),并在接口上添加一些注解
2、 SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解
本质:封装了Http调用流程,更符合面向接口化的编程习惯,类似于Dubbo的服务调用。 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、启动类开启Feign远程支持

服务消费者工程(自动投递微服务)启动类使用注解@EnableFeignClients 添加 Feign支持
注意:此时去掉Hystrix熔断的支持注解**reaker即可包括引入的依赖,因为Feign会自动引入

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableFeignClients // 开启Feign 客户端功能
  4. public class AutodeliverApplication8096 {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AutodeliverApplication8096.class,args);
  7. }
  8. }

3、创建Feign接口

1、@FeignClient表明当前类是一个Feign客户端,value是指向要请求的服务名称(登记到注册中心上的服务提供者的服务名称)
2、接口中的接口方法,就好比是远程服务提供者Controller中的Hander方法 (只不过如同本地调用了),那么在进行参数绑定的时,可以使用@PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign 对SpringMVC注解的支持,但是需要注意value必须设置,否则会抛出异常

  1. @FeignClient(value = "lagou-service-resume",path = "/resume")
  2. public interface ResumeServiceFeignClient {
  3. // Feign要做的事情就是,拼装url发起请求
  4. // 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求
  5. @GetMapping("/openstate/{userId}")
  6. public Integer findDefaultResumeState(@PathVariable("userId") Long userId);
  7. }

4、注入接口再进行远程调用

  1. @RestController
  2. @RequestMapping("/autodeliver")
  3. public class AutodeliverController { //在controller中
  4. // 注入远程调用的接口类
  5. @Autowired
  6. private ResumeServiceFeignClient resumeServiceFeignClient;
  7. @GetMapping("/checkState/{userId}")
  8. public Integer findResumeOpenState(@PathVariable Long userId) {
  9. //通过调用接口的方式进行远程调用
  10. Integer defaultResumeState = resumeServiceFeignClient.findDefaultResumeState(userId);
  11. return defaultResumeState;
  12. }
  13. }

Feign对负载均衡的支持

Feign 本身已经集成了Ribbon依赖和自动配置 , Feign默认的请求处理超时时长1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处理超时时长,Feign自己有超时设置,如果配置 Ribbon的超时,则会以Ribbon的为准。
可以继续在application.yml中配置

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

Feign对熔断器的支持

1、配置中开启Feign对熔断器的支持 、

Feign的超时时长设置那其实就上面Ribbon的超时时长设置

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

2、配置中进行Hystrix超时设置

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

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

3、创建回退类并实现远程调用接口

降级回退逻辑需要自定义一个类,实现FeignClient接口,实现接口中的方法

  1. @Component // 别忘了这个注解,还应该被扫描到
  2. public class ResumeFallback implements ResumeServiceFeignClient {
  3. @Override
  4. public Integer findDefaultResumeState(Long userId) {
  5. return -6;
  6. }
  7. }

4、FeignClient注解中关联fallback类

这里已经添加了自定义的服务降级的类ResumeFallback

  1. @FeignClient(value = "lagou-service-resume",fallback = ResumeFallback.class,path = "/resume")
  2. public interface ResumeServiceFeignClient {
  3. // Feign要做的事情就是,拼装url发起请求
  4. // 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求
  5. @GetMapping("/openstate/{userId}")
  6. public Integer findDefaultResumeState(@PathVariable("userId") Long userId);
  7. }

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

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

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

Feign的日志级别配置

如果我们想看到Feign请求时的日志,我们可以进行配置,默认情况下Feign的日志 没有开启。

1、创建Feign日志类并设置级别

// Feign的日志级别(Feign请求过程信息)
// NONE:默认的,不显示任何日志——性能最好
// BASIC:仅记录请求方法、URL、响应状态码以及执行时间——日产问题追踪
// HEADERS:在BASIC级别的基础上,记录请求和响应的header
// FULL:记录请求和响应的header、body和元数据——适合于开发及测试环境定位问 题

  1. @Configuration
  2. public class FeignLog {
  3. @Bean
  4. Logger.Level feignLevel() {
  5. return Logger.Level.FULL;
  6. }
  7. }

2、 配置log日志级别为debug

  1. logging:
  2. level:
  3. # Feign日志只会对日志级别为debug的做出响应
  4. com.lagou.edu.controller.service.ResumeServiceFeignClient: debug
  5. org.springframework.web.servlet.DispatcherServlet: debug
  6. org.springframework.cloud.sleuth: debug