Feign
前面我们虽然使用了Ribbon和Hystrix进行了负载均衡和服务熔断,但是我们的消费方代码中由于要调用提供方的服务,比如:
String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
使用了链接直接拼接的方式,这样的硬编码不太优雅,这样我们就需要使用Feign。
Feign在英语中是伪装的意思,这里Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。
这样我们就不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
Feign也是Netflix开发的,是一种声明式、模板化的HTTP客户端,Feign可以让我们更加便捷地调用HTTP API。
Feign支持自带注解或JAX-RS注解。SpringCloud对Feign进行了增强,使Feign支持SpringMVC注解,并整合了Ribbon和Erueka。
Feign使用:
1.引入openFeign启动器
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2.feign.hystrix.enable=true,开启feign的熔断功能(Feign默认不开启熔断)
feign:hystrix:enabled: true # 开启Feign的熔断功能
3.在引导类上 @EnableFeignClients,不需要使用RestTemplate了,feign已经自动集成了Ribbon负载均衡的RestTemplate。
@SpringCloudApplication
4.创建一个接口,在接口添加@FeignClient(value="服务id", fallback=实现类.class)。
这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像。
在接口中定义一些方法,这些方法的书写方式跟之前controller类似。
@FeignClient
5.在controller中注入userClient
@Controller
6.创建了一个熔断类,实现feign接口,实现对应的方法,这些实现方法就是熔断方法
@Component
这样,如果服务正常调用,则正常输出
如果停掉提供方服务,则会服务熔断,用户端提示熔断信息
设置feign的日志级别
1、首先设置cn.figo包下的日志级别都为debug
logging:level:cn.figo: debug
2、编写Frign配置类,定义日志级别
@Configuration
这里指定的Level级别是FULL,Feign支持4种级别:
- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
3、在FeignClient接口上指定配置类
@FeignClient
这样设置后,可以看到每次访问的日志
请求压缩
Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:
feign:compression:request:enabled: true # 开启请求压缩response:enabled: true # 开启响应压缩
同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:(这里的数据类型、压缩大小下限均为默认值。)
feign:compression:request:enabled: true # 开启请求压缩mime-types: text/html,application/xml,application/json # 设置压缩的数据类型min-request-size: 2048 # 设置触发压缩的大小下限