Feign远程调用组件

150 阅读4分钟

一、Feign 简介

Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求, 远程调⽤的),是以Java接⼝注解的⽅式调⽤Http请求,有两种调用方式,如下:

  • 基于 restTemplate 的api(一般不用,需要拼接url,容易出错)
  • SpringCloud对Feign进⾏了增强,使Feign⽀持了SpringMVC注解(基于OpenFeign的接口方式)

二、Feign 配置应用

Feign = RestTemplate + Ribbon + Hystrix

  • 服务消费端引入 Feign 依赖包
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 服务消费端工程启动类增加注解
@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现
@EnableFeignClients // 开启Feign
public class AutodeliverFeignApplication8092 {
    public static void main(String[] args) {
        SpringApplication.run(AutodeliverFeignApplication8092.class,args);
    }
}
  • 服务消费端创建Feign接口
// name:调⽤的服务名称,和服务提供者yml⽂件中spring.application.name保持⼀致
@FeignClient(name="lagou-service-resume")
public interface ResumeFeignClient {
    //调⽤的请求路径
    @RequestMapping(value = "/resume/openstate/{userId}",method=RequestMethod.GET)
    public Integer findResumeOpenState(@PathVariable(value ="userId") Long userId);
}

注意:

1)@FeignClient注解的name属性⽤于指定要调⽤的服务提供者名称,和服务提供者yml⽂件中spring.application.name保持⼀致。

2)接⼝中的接⼝⽅法,就好⽐是远程服务提供者Controller中的Hander⽅法(只不过如同本地调⽤了),那么在进⾏参数绑定的时,可以使⽤@PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign对SpringMVC注解的⽀持,但是需要注意value必须设置,否则会抛出异常。

  • 使⽤接⼝中⽅法完成远程调⽤(注⼊接⼝即可,实际注⼊的是接⼝的实现)
@Autowired
private ResumeFeignClient resumeFeignClient;

@Test
public void testFeignClient(){
    Integer resumeOpenState =resumeFeignClient.findResumeOpenState(1545132l);
    System.out.println("=======>>>resumeOpenState:" +resumeOpenState);
}

三、Feign 对负载均衡的支持

Feign 本身已经集成了Ribbon依赖和⾃动配置,因此我们不需要额外引⼊依赖,可以通过 ribbon.xx 来进 ⾏全局配置,也可以通过服务名.ribbon.xx 来对指定服务进⾏细节配置配置。

Feign默认的请求处理超时时⻓1s,有时候我们的业务确实执⾏的需要⼀定时间,那么这个时候,我们就需要调整请求处理超时时⻓,Feign⾃⼰有超时设置,如果配置Ribbon的超时,则会以Ribbon的为准。

Ribbon设置:

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

四、Feign 对熔断器的支持

  • application.yml 开启熔断器
feign:
  hystrix:
    enabled: true

开启熔断器功能之后,Feign 中的方法则会被容器进行管理,一但出现错误就会调用自定义的降级回退方法(fallback)。

注意一点,Feign 和 hystrix 都可以进行处理时长的超时配置,当两者都有配置的话,则按照其中一个配置的最低时长进行生效,则当处理时长超过两者之间的最小时长,则会进行熔断处理。

hystrix 的超时配置如下:

hystrix:
 command:
  default:
   execution:
    isolation:
     thread:
      timeoutInMilliseconds: 15000 #超时时长配置
  • MessageRemoteHyx.java 熔断器继承Feign的调用接口
@Component
public class MessageRemoteHyx implements MessageRemote{

    @Override
    public Map hello() {
        Map map=new HashMap();
        map.put("message","hello world is error!!");
        return map;
    }
}
  • MessageRemote接口中添加fallback = MessageRemoteHyx.class
@FeignClient(name = "PROVIDER",fallback = MessageRemoteHyx.class)
public interface MessageRemote {
    @RequestMapping(value = "/provider/hello")
    Map hello();
}

五、Feign对请求压缩和响应压缩的⽀持

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

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

六、Feign的⽇志级别配置

Feign是http请求客户端,类似于咱们的浏览器,它在请求和接收响应的时候,可以 打印出⽐较详细的⼀些⽇志信息(响应头,状态码等等),如果我们想看到Feign请求时的⽇志,我们可以进⾏配置,默认情况下Feign的⽇志没有开启。

  1. 开启Feign⽇志功能及级别
// Feign的⽇志级别(Feign请求过程信息)
// NONE:默认的,不显示任何⽇志----性能最好
// BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪
// HEADERS:在BASIC级别的基础上,记录请求和响应的header
// FULL:记录请求和响应的header、body和元数据----适⽤于开发及测试环境定位问@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLevel() {
        return Logger.Level.FULL;
    }
}
  1. 配置log⽇志级别为debug
logging:
  level:
 #Feign⽇志只会对⽇志级别为debug的做出响应
   com.lagou.edu.controller.service.ResumeServiceFeignClient: debug