事情的起因是这样的,最近项目提测,测试告诉我说主要流程有超时问题,提测被打回了,于是我看了下日志,发现都是远程调动其他服务超时(服务发现方式),确认了被调用的服务是可以正常响应的之后,发现被调用的服务和注册中心都是通过docker部署,而我提测的项目是直接部署在物理机上的,猜测可能是网络问题,于是先让测试把我提测的项目也容器化,之后调用不再超时。问题解决了,然而其中的原理还是一头雾水,docker局域网,服务发现,服务网关,这其中到底是问什么导致网络不通呢。网上查阅了一些资料,梳理一下这个问题。
1. 服务发现,各服务注册到注册中心,相互调用通过注册中心查询对方的真实ip和端口。这里内部服务间的rpc是不走服务网关的,与服务网关没有关系。
2. docker启动默认bridge模式,将docker容器连接到虚拟网桥(类似交换机),给docker容器分配ip,通常是172.17.0.0/16网段,此时容器内和宿主机是可以互相ping通的,同时使用端口映射,宿主机将48080端口映射到容器的8080端口,所以访问 宿主机ip:48080就相当于访问容器的8080端口,因此,宿主机及其局域网的其他机器(包括宿主机上的其他容器)都是可以访问到该容器的。
3. 测试给容器化部署的服务和注册中心都加入到了10.10网段的局域网中(与公司内网的网段不同),被调用的服务以10.10网段的ip注册到了注册中心,我的服务因为上面第二条也是可以注册到注册中心的,但是查找被调用的服务的ip查找到的是10.10网段的ip,因此调用网络不通。而我的服务也加入到10.10网段的局域网中之后就和被调用的服务在同一个局域网中,就可以调用通啦。