OpenFeign的9个坑,每个都能让你的系统崩溃

作者:微信小助手

发布时间:2021-09-24T13:41:48

OpenFeign 是 SpringCloud 中的重要组件,它是一种声明式的 HTTP 客户端。使用OpenFeign 调用远程服务就像调用本地方法一样,但是如果使用不当,很容易踩到坑。


坑一、用对 Http Client


1.1 feign 中 http client


如果不做特殊配置,OpenFeign 默认使用 JDK 自带的 HttpURLConnection。


我们知道,HttpURLConnection 没有连接池、性能和效率比较低,如果采用默认,很可能会遇到性能问题导致系统故障。


可以采用 Apache HttpClient,properties 文件中增加下面配置:


feign.httpclient.enabled=true

pom 文件中增加依赖:


<dependency>    <groupId>io.github.openfeign</groupId>    <artifactId>feign-httpclient</artifactId>    <version>9.3.1</version></dependency>

也可以采用 OkHttpClient,properties 文件中增加下面配置:


feign.okhttp.enabled=true

pom文件中增加依赖:


<dependency>    <groupId>io.github.openfeign</groupId>    <artifactId>feign-okhttp</artifactId>    <version>10.2.0</version></dependency>

1.2 ribbon 中的 Http Client


通过 OpenFeign 作为注册中心的客户端时,默认使用 Ribbon 做负载均衡,Ribbon 默认也是用 JDK 自带的 HttpURLConnection。需要给 Ribbon 也设置一个 Http client,比如使用 okhttp,在 properties 文件中增加下面配置:


ribbon.okhttp.enabled=true


坑二、全局超时时间


OpenFeign 可以设置超时时间,简单粗暴。


设置一个全局的超时时间,如下:


feign.client.config.default.connectTimeout=2000feign.client.config.default.readTimeout=60000

如果不配置超时时间,默认是连接超时 10s,读超时 60s。在源码 feign.Request 的内部类 Options 中定义。


这个接口设置了最大的 readTimeout 是 60s。这个时间必须大于调用的所有外部接口的 readTimeout,否则处理时间大于 readTimeout 的接口就会调用失败。


如下图,在一个系统中使用 OpenFeign 调用外部三个服务,每个服务提供两个接口。其中,serviceC 的一个接口需要 60s 才能返回,那上面的 readTimeout 必须设置成60s。