docker容器优雅停机导致的问题说明
现象 测试同学反馈页面某功能有时候不能使用。 分析 根据页面返回结果和URL,从开发同学那里了解到该现象是新环境里a服务调b服务返回异常导致的。从多次请求的结果看来,大概50%的几率返回异常。按常理判断如果b服务有多个节点的,可能有其中个别节点异常会导致此现象发生,但是b服务只有一个节点,请求的同时,观察b服务的日志,在a调用结果异常的情况下,b没有任何日志输出,正常情况日志输出返回结果,说明请求没有到达b服务,如果对调用链路不熟的情况下完全可以抓包明确请求是否到达。那么调用失败的请求是去哪里了呢?调用链路如下: 图1 图1可以看出a调用b的地址是从consul-server上拿到的,在consul-server控制台看到的情况入下图: 图2 注:图中gw-mini是服务b 图2 中看到单节点的b服务,在consul注册中心上注册了两个实例,实际是这样吗?继续看下图: 图3 图3中b服务是单节点,ip是10.100.73.72,而consul-server中的另外一个地址10.100.73.75是其他服务的ip地址。在consul上b服务下面的两个实例健康检查都是正常状态,难怪a调用b老是出现异常的返回结果,a拿到的地址list里面有一个地址是不对的。为什么consul上b服务会有两个实例?看看异常实例10.100.73.75的详情,如下图: 图4 健康检查URL是b服务的没错