| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> OpenFeign 的 9 个坑,每个都能让你的系统奔溃 -> 正文阅读 |
|
[开发测试]OpenFeign 的 9 个坑,每个都能让你的系统奔溃 |
OpenFeign是SpringCloud中的重要组件,它是一种声明式的HTTP客户端。使用OpenFeign调用远程服务就像调用本地方法一样,但是如果使用不当,很容易踩到坑。 坑一:用对Http Client feign中http client 如果不做特殊配置,OpenFeign默认使用jdk自带的HttpURLConnection,我们知道HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,很可能会遇到性能问题导致系统故障。 可以采用Apache HttpClient,properties文件中增加下面配置:
pom文件中增加依赖:
也可以采用OkHttpClient,properties文件中增加下面配置:
pom文件中增加依赖:
ribbon中的Http Client 通过OpenFeign作为注册中心的客户端时,默认使用Ribbon做负载均衡,Ribbon默认也是用jdk自带的HttpURLConnection,需要给Ribbon也设置一个Http client,比如使用okhttp,在properties文件中增加下面配置:
坑二:全局超时时间 OpenFeign可以设置超时时间,简单粗暴,设置一个全局的超时时间,如下:
这个接口设置了最大的readTimeout是60s,这个时间必须大于调用的所有外部接口的readTimeout,否则处理时间大于readTimeout的接口就会调用失败。 如下图,在一个系统中使用OpenFeign调用外部三个服务,每个服务提供两个接口,其中serviceC的一个接口需要60才能返回,那上面的readTimeout必须设置成60s。 但是如果serviceA出故障了,表现是接口1超过60s才能返回,这样OpenFeign只能等到读超时,如果调用这个接口的并发量很高,会大量占用连接资源直到资源耗尽系统奔溃。要防止这样的故障发生,就必须保证接口1能fail-fast。最好的做法就是给serviceC单独设置超时时间。 坑三:单服务设置超时时间 从上一节的讲解我们看到,需要对serviceC单独设置一个超时时间,代码如下:
这个时间会覆盖第一节中默认的超时时间。但是问题又来了,serviceC中又掉了serviceD,因为serviceD的故障导致接口6发生了读超时的情况,为了不让系统奔溃,不得不对serviceC的接口5单独设置超时时间。如下图: 坑四:熔断超时时间 怎样给单个接口设置超时时间,查看网上资料,必须开启熔断,配置如下:
开启熔断后,就可以给单个接口配置超时了。如果调用serviceC的接口5的声明如下:
根据上面interface5接口的声明,在properties文件中增加如下配置:
网上资料说的并不准确,这个超时时间并没有起作用。为什么不生效呢? 使用feign超时 最终使用的超时时间来自于Options类。如果我们配置了feign的超时时间,会选择使用feign超时时间,下面代码在FeignClientFactoryBean类的configureUsingProperties方法:
使用ribbon超时 如果没有配置feign,但是配置了ribbon的超时时间,会使用ribbon的超时时间。我们看下这段源代码,FeignLoadBalancer里面的execute方法,
使用自定义Options 对于单个接口怎么配置超时时间,我这里给出一个方案,如果你有其他方案,欢迎探讨。我的方案是使用RestTemplate来调这个接口,单独配置超时时间,配置代码如下,这里使用OkHttpClient:
如果使用RestTemplate,就会使用OkHttp3ClientHttpRequestFactory中配置的时间。 坑五:ribbon超时时间 作为负载均衡,ribbon超时时间也是可以配置的,可以在properties增加下面配置: ribbon.ConnectTimeout=2000?ribbon.ReadTimeout=11000 有文章讲ribbon配置的超时时间必须要满足接口响应时间,其实不然,配置feign的超时时间就足够了,因为它可以覆盖掉ribbon的超时时间。 坑六:重试默认不开启 OpenFeign默认是不支持重试的,可以在源代码FeignClientsConfiguration中feignRetryer中看出。
要开启重试,我们可以自定义Retryer,比如下面这行代码:
表示每间隔100ms,最大间隔1000ms重试一次,最大重试次数是1,因为第三个参数包含了第一次请求。 坑七:Ribbon重试 拉取服务列表 Ribbon默认从服务端拉取列表的时间间隔是30s,这个对优雅发布很不友好,一般我们会把这个时间改短,如下改成3s:
重试 Ribbon重试有不少需要注意的地方,这里分享4个。 1.同一实例最大重试次数,不包括首次调用,配置如下:
2.同一个服务其他实例的最大重试次数,这里不包括第一次调用的实例。默认值为1:
3.是否对所有操作都重试,如果改为true,则对所有操作请求都进行重试,包括post,建议采用默认配置false。
4.对指定的http状态码进行重试
坑八:hystrix超时 如下图: hystrix默认不开启,但是如果开启了hystrix,因为hystrix是在Ribbon外面,所以超时时间需要符合下面规则:hystrix超时 >= (MaxAutoRetries + 1) * (ribbon ConnectTimeout + ribbon ReadTimeout)
根据上面公式,假如我们配置熔断超时时间如下:
这个配置是不会重试一次的。serviceA调用serviceB时,hystrix会等待Ribbon返回的结果,如果Ribbon配置了重试,hystrix会一直等待直到超时。上面的配置,因为第一次请求已经耗去了8s,剩下时间7s不够请求一次了,所以是不会进行重试的。 坑九:使用OpenFeign做http客户端 即使不用注册中心,使用OpenFeign做普通http客户端也是很方便的,但是有三点需要注意:
|
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 0:39:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |