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