前面的学习中,要调用另一个服务,用的是RestTemplate,自己封装url,比较麻烦。使用feign就比较简单了,一个注解搞定。 它其实就是一个轻量级http的服务客户端,并且,并且,它还有负载均衡和断路器的能力:Feign = RestTemplate+Ribbon+Hystrix
feign的基本使用:
1、在消费者服务中导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2、启动类使⽤注解@EnableFeignClients
注意:此时去掉Hystrix熔断的⽀持注解@EnableCircuitBreaker即可包括引⼊的依赖,因为Feign会⾃动引⼊
3、创建feign接口
// @FeignClient表明当前类是一个Feign客户端,value指定该客户端要请求的服务名称(登记到注册中心上的服务提供者的服务名称) @FeignClient(value = "lagou-service-resume") @RequestMapping("/resume") public interface ResumeServiceFeignClient { // Feign要做的事情就是,拼装url发起请求 // 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求 @GetMapping("/openstate/{userId}") public Integer findDefaultResumeState(@PathVariable("userId") Long userId); }
如上,url的指定,都是用springmvc的方式,很方便。指明调用的服务和接口,然后使用的时候,使用@Autowire注入即可。
feign对负载均衡的支持:
Feign 本身已经集成了Ribbon依赖和⾃动配置,因此我们不需要额外引⼊依赖,可以通过 ribbon.xx 来进⾏配置(就是之前学习的ribbon的配置方式)。另外,feign调用时,可以指定接口超时时间(默认1s),但是如果使用ribbon配置后,则会以ribbon的为准。
feign对熔断的支持:
对于熔断hystrix的支持,也不需要再单独引入依赖了,只需要配置文件开启支持即可:
# 开启Feign的熔断功能 feign: hystrix: enabled: true
其他的按照之前hystrix的方式使用即可。值得注意的是,feign本身有超时时间的设置,如果此时又设置了hystrix的熔断超时时间,则会以较小的那个时间为准,超过该时间就进入熔断机制。 那之前也说了,熔断后可以指定降级的方法,feign接口这里也可以指定:
1、定义fallback处理类:
/** * 降级回退逻辑需要定义一个类,实现FeignClient接口,实现接口中的方法 * * */ @Component // 别忘了这个注解,还应该被扫描到 public class ResumeFallback implements ResumeServiceFeignClient { @Override public Integer findDefaultResumeState(Long userId) { return -6; } }
直接实现feign接口,重写所有原方法逻辑即可。
2、在feign接口中指定
@FeignClient(value = "lagou-service-resume",fallback = ResumeFallback.class,path = "/resume") //@RequestMapping("/resume") public interface ResumeServiceFeignClient { // Feign要做的事情就是,拼装url发起请求 // 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求 @GetMapping("/openstate/{userId}") public Integer findDefaultResumeState(@PathVariable("userId") Long userId); }
如上,在FeignClient注解中指定fallback属性即可。 值得注意的是,使用fallback后,要把@RequestMapping("/resume")注释掉,把前缀/resume放到FeignClient的path属性中,否则可能会报错。
feign对压缩的支持:
feign调用时,可能存在请求或者相应体过大的情况。 feign可以支持压缩,直接配值开启即可:
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请求过程信息) // NONE:默认的,不显示任何⽇志----性能最好 // BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪 // HEADERS:在BASIC级别的基础上,记录请求和响应的header // FULL:记录请求和响应的header、body和元数据----适⽤于开发及测试环境定位问题 @Configuration public class FeignConfig { @Bean Logger.Level feignLevel() { return Logger.Level.FULL; } }
还可以对某个feign接口修改日志级别:
logging: level: # Feign⽇志只会对⽇志级别为debug的做出响应 com.lagou.edu.controller.service.ResumeServiceFeignClient:debug