在 Dubbo 中, Provider 启动时主要做两个事情,一是启动 server,二是向注册中心注册服务。启动 server 时需要绑定 socket,向注册中心注册服务时也需要发送 socket 唯一标识服务地址。
dubbo
中不设置host
时默认host
是什么?dubbo
中如何指定服务的host
,我们是否可以用hostname或domain代替IP地址作为host
?一般的 dubbo 协议配置如下:
...
<dubbo:protocol name="dubbo" port="20890" />
...
可以看到,只配置了端口号,没有配置 host,此时设置的 host 又是什么呢?
查看代码发现,在 org.apache.dubbo.config.ServiceConfig#findConfigedHosts()
中,通过 InetAddress.getLocalHost().getHostAddress()
获取默认 host。其返回值如下:
除此之外,可以通过 dubbo.protocol
或 dubbo.provider
的 host
属性对 host
进行配置,支持IP地址和域名,如下:
...
<dubbo:protocol name="dubbo" port="20890" host="www.example.com"/>
...
有些部署场景需要动态指定服务注册的地址,如 docker bridge 网络模式下要指定注册宿主机 ip 以实现外网通信。dubbo 提供了两对启动阶段的系统属性,用于设置对外通信的ip、port地址。
以上四个配置项均为可选项,如不配置 dubbo 会自动获取 ip 与端口,请根据具体的部署场景灵活选择配置。 dubbo 支持多协议,如果一个应用同时暴露多个不同协议服务,且需要为每个服务单独指定 ip 或 port,请分别在以上属性前加协议前缀。 如:
PORT_TO_REGISTRY 或 IP_TO_REGISTRY 不会用作默认 PORT_TO_BIND 或 IP_TO_BIND,但是反过来是成立的。如:
PORT_TO_REGISTRY=20881
和 IP_TO_REGISTRY=30.5.97.6
,则 PORT_TO_BIND
和 IP_TO_BIND
不受影响PORT_TO_BIND=20881
和 IP_TO_BIND=30.5.97.6
,则默认 PORT_TO_REGISTRY=20881
且 IP_TO_REGISTRY=30.5.97.6
dubbo.protocol
或dubbo.provider
的host
属性对host
进行配置,支持IP地址和域名.但此时注册到注册中心的IP地址和监听IP地址是同一个值dubbo.protocol
或dubbo.provider
的host
配置