基于Dubbo的跨主机容器通信遇到的问题
前言
最近在项目中使用到Docker
和Dubbo
,想在Docker中运行一个服务并把该服务自身的信息发布到Dubbo注册中心。
刚开始测试时候将所有容器都放在同一台主机中,测试过程很顺利,但是当进行Docker主机扩展,将容器部署在不同的主机时候,就发现一个奇怪的现象:应用之间调试不通了。
这里对具体问题解释一下:Dubbo提供了一个方便的服务发现机制,每个服务(这里称为提供者)只要向Dubbo注册中心注册过,注册中心就会将服务的地址发送给同样在注册中心注册的服务调用方(这里称为消费者),之后即使Dubbo注册中心挂了也不影响服务的调用。
当服务提供者部署在容器中时,这时候发现其在Dubbo中心注册的是容器的IP地址,而对于另外一台主机上的消费者来说这个IP是不可访问的,当时我在网上找了很多相关的资料,最后得出几种解决方案。
解决方案
设置容器的IP与主机IP在同一网段内,使容器IP可直接访问(会占用大量的IP地址,且IP会限制在同一网段,在生产环境中往往不可能)。
通过复杂的iptables路由规则,通过多层桥接方式打通网络(此法是可行的,也是今后要考虑的,但是操作起来略麻烦)。
对Dubbo进行扩展,扩展dubbo protocol配置,增加配置项publish host、 publish port,对应主机的ip和port,并且在注册服务时将主机的ip和port写到注册中心。(这种方法需要对Dubbo进行扩展,不太建议)