文章目录
- OpenFeign可配置事项
- 日志配置
- 异常解码器
- 拦截器
- 更改 OpenFeign 默认的负载均衡策略
- 开启默认的 OpenFeign 数据压缩功能
- 替换默认通信组件
OpenFeign可配置事项
日志配置
当 API 调用失败后,需要有详细的请求信息来分析失败原因,我们可以设置 Feign 的日志级别来输出详细的请求信息,Feign 的日志级别有四种:
- NONE 表示不输出日志。
- BASIC 表示只输出请求方法的 URL 和响应的状态码以及执行的时间。
- HEADERS 将 BASIC 信息和请求头信息输出。
- FULL 会输出全部完整的请求信息。
了解了日志级别后,我们就可以为 Feign Client 设置不同的级别了,级别不同输出的请求信息的详细程度也不一样,后面的课时我会介绍动态的去调整日志级别,这样在平时是不输出日志的,一旦需要排查问题的时候就可以动态的将日志打开,非常方便。
异常解码器
Feign 中提供了异常的解码器,但我们也可以自定义异常解码器,自定义异常解码器可以用于内部服务之间调用的异常传递。比如说 A 服务调用 B 服务,B 服务中出现异常后,会由 B 服务中的全局异常处理器进行处理,然后返回给 A 服务的数据格式是固定的 code 是多少,message 是什么。
拦截器
Feign 中提供了拦截器机制,我们可以添加自己的拦截器来实现某些场景下的需求。BasicAuth 在 Feign 中默认提供了拦截器,我们只需要配置一下就可以使用,如果我们需要自定义拦截器,可以参考 BasicAuth 的代码,只要实现 RequestInterceptor 接口,在 apply 方法中编写你自己的逻辑就可以了,通过 RequestTemplate 可以进行很多操作,比如添加指定的请求头信息,这个可以用在服务间传递某些信息的时候。
更改 OpenFeign 默认的负载均衡策略
前面提到,在 OpenFeign 使用时默认引用 Ribbon 实现客户端负载均衡。那如何设置 Ribbon 默认的负载均衡策略呢?在 OpenFeign 环境下,配置方式其实与之前 Ribbon RestTemplate 方案完全相同,只需在 application.yml 中调整微服务通信时使用的负载均衡类即可。
代码语言:javascript复制warehouse-service: #服务提供者的微服务ID
ribbon:
#设置对应的负载均衡类
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
开启默认的 OpenFeign 数据压缩功能
在 OpenFeign 中,默认并没有开启数据压缩功能。但如果你在服务间单次传递数据超过 1K 字节,强烈推荐开启数据压缩功能。默认 OpenFeign 使用 Gzip 方式压缩数据,对于大文本通常压缩后尺寸只相当于原始数据的 10%~30%,这会极大提高带宽利用率。但有一种情况除外,如果应用属于计算密集型,CPU 负载长期超过 70%,因数据压缩、解压缩都需要 CPU 运算,开启数据压缩功能反而会给 CPU 增加额外负担,导致系统性能降低,这是不可取的。
代码语言:javascript复制feign:
compression:
request:
# 开启请求数据的压缩功能
enabled: true
# 压缩支持的MIME类型
mime-types: text/xml,application/xml, application/json
# 数据压缩下限 1024表示传输数据大于1024 才会进行数据压缩(最小压缩值标准)
min-request-size: 1024
# 开启响应数据的压缩功能
response:
enabled: true
替换默认通信组件
OpenFeign 默认使用 Java 自带的 URLConnection 对象创建 HTTP 请求,但接入生产时,如果能将底层通信组件更换为 Apache HttpClient、OKHttp 这样的专用通信组件,基于这些组件自带的连接池,可以更好地对 HTTP 连接对象进行重用与管理。作为 OpenFeign 目前默认支持 Apache HttpClient 与 OKHttp 两款产品。我以OKHttp配置方式为例,为你展现配置方法。 1.引入 feign-okhttp 依赖包。
代码语言:javascript复制<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>11.0</version>
</dependency>
2.在应用入口,利用 Java Config 形式初始化 OkHttpClient 对象。
代码语言:javascript复制@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
//Spring IOC容器初始化时构建okHttpClient对象
@Bean
public okhttp3.OkHttpClient okHttpClient(){
return new okhttp3.OkHttpClient.Builder()
//读取超时时间
.readTimeout(10, TimeUnit.SECONDS)
//连接超时时间
.connectTimeout(10, TimeUnit.SECONDS)
//写超时时间
.writeTimeout(10, TimeUnit.SECONDS)
//设置连接池
.connectionPool(new ConnectionPool())
.build();
}
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
3.在 application.yml 中启用 OkHttp。
代码语言:javascript复制feign:
okhttp:
enabled: true
做到这里,我们已将OpenFeign的默认通信对象从URLConnection调整为OKHttp,至于替换为HttpClient组件的配置思路是基本相同的。
本文内容到此结束了, 如有收获欢迎点赞