Spring Cloud——OpenFeign
- 一、OpenFeign能干嘛
- 二、OpenFeign的基本使用
- 三、Feign的高级特性
- 1.OpenFeign超时控制
- 2.OpenFeign重试机制
- 3.OpenFeign之性能优化HttpClient5
- 4.OpenFeign请求和响应压缩
- 5.OpenFeign之Feign日志打印
- 四、参考
OpenFeign
是一个声明式的Web服务客户端
。OpenFeign
基本上就是当前微服务之间调用的事实标准。- 使用OpenFeign只需创建一个Rest接口并在该接口上添加注解
@FeignClient
即可。
一、OpenFeign能干嘛
- 我们之前使用
Spring Cloud LoadBalancer + RestTemplate
时,利用RestTemplate
对http
请求的封装处理形成了一套模板化的调用方法。 - 但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可。
- 可以在使用OpenFeign时提供客户端的负载均衡,也可以集成阿里巴巴
Sentinel
来提供熔断、降级等功能。而与Spring Cloud LoadBalancer
不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。 - OpenFeign默认就支持负载均衡。
二、OpenFeign的基本使用
- 第一步,修改
pom.xml
添加依赖- 注意: 对于feign依赖的添加,是谁想获取其他的服务就在谁的pom文件中添加feign依赖。
<!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 第二步,在主启动类上添加注解
@EnableFeignClients
表示开启OpenFeign
功能并激活@SpringBootApplication @EnableFeignClients public class MainFeign80 { public static void main(String[] args) { SpringApplication.run(MainFeign80.class, args); } }
- 第三步,定义
Feign
客户端- 注意:如果是在一个单独的通用模块中进行
Feign
接口定义的,这个模块中也需要添加Feign
相关的依赖。
/** * 注解的value属性就是想要调用服务的名称, * 注意: 如果参数列表中如果有参数, 注解不可以省略,注解不可以省略,注解不可以省略, feign不支持, 踩过 * 错: String getDesc(String name); * 对: String getDesc(@RequestParam(“name”) String name); */ @FeignClient("cloud-payment-service") public interface PayFeignAPI { @GetMapping(value = "/pay/get/info") String getInfoByConsul(); }
- 注意:如果是在一个单独的通用模块中进行
- 第四步,定义控制器
@Slf4j @RestController @RequestMapping("/feign") public class OrderController { @Resource private PayFeignAPI payFeignAPI; @GetMapping("/pay/get/info") public String getPort() { return payFeignAPI.getInfoByConsul(); } }
三、Feign的高级特性
1.OpenFeign超时控制
OpenFeign
客户端默认等待60秒钟,但是服务端处理超过规定时间会导致Feign
客户端返回报错。为了避免这样的情况,有时候我们需要设置Feign
客户端的超时控制,默认60秒太长或者业务时间太短都不好。OpenFeign
主要通过两个参数来进行超时控制。
- 全局配置和局部配置
spring: cloud: openfeign: client: config: # 全局配置 openfeign 的超时时间限制 default: # 连接超时时间 connectTimeout: 3000 # 读取超时时间(业务处理时间) readTimeout: 3000 # 局部 openfeign 的超时时间限制,全局配置和局部配置可以同时存在,遵循局部优先原则 cloud-payment-service: # 这里写的是具体配置的服务名 # 连接超时时间 connectTimeout: 20000 # 读取超时时间(业务处理时间) readTimeout: 20000
2.OpenFeign重试机制
OpenFeign
的重试机制默认是关闭的。
- 添加配置类开启重试机制
@Configuration public class FeignConfig { /** * 设置 feign 的重试机制 */ @Bean public Retryer myRetryer() { //Feign 默认配置是不走重试策略的 // return Retryer.NEVER_RETRY; //最大请求次数为 3, 初始时间间隔为 100ms,重试最大间隔为 1s. return new Retryer.Default(100, 1, 3); } }
3.OpenFeign之性能优化HttpClient5
OpenFeign
中httpClient
如果不做特殊配置,OpenFeign
默认使用JDK
自带的HttpURLConnection
发送请求,由于默认HttpURLConnection
没有连接池,性能和效率比较低。- 使用
Apache HttpClient5
替换OpenFeign
默认的HttpURLConnection
。
- 第一步,修改
pom.xml
添加依赖<!-- httpclient5--> <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.3</version> </dependency> <!-- feign-hc5--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hc5</artifactId> <version>13.1</version> </dependency>
- 添加配置开启
HttpClient5
# Apache HttpClient5 配置开启 spring: cloud: openfeign: httpclient: hc5: enabled: true
4.OpenFeign请求和响应压缩
spring:
cloud:
# 配置OpenFeign
openfeign:
# 设置 request 和 response 是否进行 gzip 压缩
compression:
request:
# 开启请求压缩
enabled: true
# 请求触发压缩的最小值
min-request-size: 2048
# 请求触发压缩的数据类型
mime-types: text/html, application/xml, application/json
response:
# 开启响应压缩
enabled: true
- 使用
gizp
压缩前
- 使用
gizp
压缩后
5.OpenFeign之Feign日志打印
-
Feign
提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign
中Http
请求的细节,对Feign接口的调用情况进行监控和输出。 -
Feign
的日志级别
NONE
:默认的,不显示任何日志;BASIC
:仅记录请求方法、URL、响应状态码及执行时间;HEADERS
:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;FULL
:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
-
第一步,配置日志Bean
@Configuration public class FeignConfig { /** * 设置 feign 的日志级别 */ @Bean public Logger.Level feigenLoggerLevel() { return Logger.Level.FULL; } }
-
第二步,开启Feign日志功能
- 公式(三段):logging.level + 含有@FeignClient注解的完整带包名的接口名+debug
# feign日志以什么级别监控哪个接口 logging: level: com: atguigu: cloud: apis: PayFeignApi: debug
四、参考
[1]. feign的启动异常:The bean ‘XXX.FeignClientSpecification’, defined in null, could not be registered