目录
一、问题背景
Ribbon对于部分关键配置的读取是没有躺平策略的,获取不到动态配置时可能会将后端服务器列表全部下掉。
如果刚好碰到Properties字符集操作不当,引起配置文件膨胀到1.6G,它根本读取不完这个配置文件,在这种特殊情况下,Ribbon还能正常转发请求到下游吗?
答案是能,但是只能转发一点点。
二、问题分析
先上图(这种情况下,服务器会呈现怎样的现象):
CPU和内存的情况:
JAVA堆的情况:
服务器的这种现象是如何引起的?
Ribbon会不断的尝试加载配置文件,读到了乱码且很大的数据行时,它会读不下去,同时,他会会不断的占用资源,不断申请内存,最后出现OOM。
对于动态配置来说,提供给Ribbon使用的上游的数据是正常的,因为它能读取到;而对于下游的数据,Ribbon会认为拿到的动态配置就是空,下游的listOfServers就会更新为空,从而出现故障。
举个例子:
serviceA.ribbon.listOfServers=127.0.0.1\:80
route.default.serviceName=我是一段乱码并且很大的中文
serviceB.ribbon.listOfServers=127.0.0.1\:8080
properties实际上是按行读取的,在这种情况下,ServiceB无法提供服务,在Zuul中Ribbon将会把ServiceB后端服务器列表置为空,而ServiceA是能够正常提供服务的。