在发布一个Dubbo服务的时候,会生成一个dubbo://ip:port的协议地址:

2018-11-19 17:51:11,737 INFO [com.alibaba.dubbo.config.AbstractConfig] -  [DUBBO] Export dubbo service dongguabai.dubbo.version.ICall to url dubbo://172.30.57.63:20880/dongguabai.dubbo.version.ICall?anyhost=true&application=dubbo-server&dubbo=2.5.3&interface=dongguabai.dubbo.version.ICall&methods=call&owner=dongguabai&pid=13916&revision=1.0.0&side=provider×tamp=1542621071730&version=1.0.0, dubbo version: 2.5.3, current host: 127.0.0.1

 那么这个IP是根据什么生成的呢?可以看看com.alibaba.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol,在生成绑定的主机的时候,会通过一层一层的判断,直到获取到合法的IP地址。:

首先会从配置文件中获取:

Dubbo使用之主机绑定_IP

如果是非法的,会从本地网卡中获取:

Dubbo使用之主机绑定_配置文件_02

如果还是非法的,会获取注册中心的地址(可以配置多个注册中心)。通过Socket去连接注册中心

Dubbo使用之主机绑定_ide_03

如果最后还拿不到,会调用这个方法:

Dubbo使用之主机绑定_IP_04

Dubbo使用之主机绑定_ide_05

最后遍历本地网卡,返回第一个合理的IP:

Dubbo使用之主机绑定_配置文件_06

Dubbo针对不同的协议有不同的默认绑定IP,比如Dubbo是20880,RMI是1099;Http:80;Hessian:80;WebService:80。