背景:
最近再鼓捣公司微服务上service_mesh,在使用istio进行流量分发的过程中遇到了一个让人头疼的问题,流量分发并没有按照预期中的来,配置什么的也完全正确,百思不得其解。最终发现源头在于业务代码中使用的http连接池。
Istio配置:
说说istio配置,我们希望有三个环境,stage、gray和online。
stage:预发布,仅公司内部测试机使用,数据与线上联通。
gray:灰度小流量,预期承载1%的线上真实流量。
online:剩下的线上全部流量。
配置了2个subsets,具有特定请求头的流量走stage,否则根据规则分流到gray和online上
问题:
配置反复确认是没有问题的,并且使用了ingressgateway配置的外部dns来访问的话,是能够正确按照比重配比分流的。
原因:
经过反复的尝试和排查,最终确定问题所在,是业务代码中使用了连接池保持了tcp层的长链接,结果流量分发只作用在了第一次的链接建立的时候,随后的请求都直接作用在了长链接上,并没有经过istio的流量分发,从而导致最后观察到的流量分配不均。
解决:
思路是,一是业务代码取消使用连接池,使用http.DefaultClient即可,已验证可行。
二是可以考虑看看有没有istio什么地方可以通过配置来解决这个问题,正在探索中。