1.问题描述
一个简单的需求,根据手机号获取用户信息。做完之后,多测试了几次,问题出现了:
连续多次请求,用户信息返回不一致
这个逻辑比较简单,Controller参数处理,Interface注入到Dubbo,实现层实现接口,查询数据库。
2.解决过程
一句话,一个条件,正常逻辑返回的数据应该是一样的,两次返回结果不一致,简直就是幽灵一样,不知道是哪里的问题。
2.1.缓存
是不是有缓存?干脆换了浏览器,请求。可惜,Bug依旧在。
2.2.数据库内数据异常
用命令查询数据库,数据正常。为了杜绝个别用户信息异常,测试多个用户手机号,结果没异常。
2.3.单步调试
想单步调试看看问题出在哪里,只能在本地启动。通过postman发起请求,单步调试。发起多次请求:
(1)数据正常返回的,能够在实现层,查询数据库;
(2)异常返回数据的,根本没进入实现层,更没有查询数据库;
问题定位了,请求到哪里了?直接返回一个结果?Dubbo注入的接口,也没报错,证明Dubbo正常。
3.问题解决
目前,项目部署有多个环境。其中,测试环境,有一套在物理机,有一套在容器。
回想一下,豁然开朗,是不是Dubbo请求转发到不同的服务器了?
因为公司环境要往容器迁移,物理机要回收(但是还没回收)。看了发布环境,物理机是昨天发布的,容器是今天发布的(ps:今天改了点代码,只在容器发布,物理机没有发布,等于是两套环境的代码不一致)。想到了这里,逻辑似乎讲通了,于是停掉物理机的服务,只保留容器环境的服务,再进行测试,正常。
4.知识
Dubbo服务注册到Zookeeper,项目中确实使用了多中心配置,如下图所示,负载均衡把Dubbo的服务指向了不同的服务器,同时刚刚巧,两个服务不一致,导致Bug的出现。