主机地址自定义暴露
自定义 Dubbo 服务暴露主机地址
功能描述
在 Dubbo 中,Provider 启动时主要做两件事
- 一是启动服务器
- 二是将服务注册到注册中心。启动服务器时需要绑定 socket,将服务注册到注册中心时需要发送 socket 的唯一服务地址。
- 在
dubbo
中未设置host
时,默认的host
是什么? - 如何在
dubbo
中指定服务的host
,我们可以使用主机名或域名代替 IP 地址作为host
吗? - 使用 docker 时,有时需要设置端口映射。此时,启动服务器时绑定的 socket 和注册到注册中心的 socket 使用不同的端口号。此时如何设置?
使用场景
使用方法
未设置 host 时的默认 host
一般的 dubbo 协议配置如下
...
<dubbo:protocol name="dubbo" port="20890" />
...
可以看出,只配置了端口号,没有配置 host。此时 host 设置为何值?
查看代码,发现 org.apache.dubbo.config.ServiceConfig#findConfigedHosts()
中,默认 host 是通过 InetAddress.getLocalHost().getHostAddress()
获取的。其返回值如下
- 未连接互联网时,返回 127.0.0.1
- 在阿里云服务器中,返回私有地址,例如:172.18.46.234
- 本地测试时,返回公网地址,例如:30.5.10.11
指定服务的 socket
此外,可以通过 dubbo.protocol
或 dubbo.provider
的 host
属性配置 host
,支持 IP 地址和域名,如下所示
...
<dubbo:protocol name="dubbo" port="20890" host="www.example.com"/>
...
socket 使用不同的端口号
一些部署场景需要动态指定服务注册的地址,例如 docker bridge 网络模式需要指定注册 host ip 来实现外网通信。dubbo 在启动阶段提供了两对系统属性,用于设置外网通信的 ip 和端口地址。
- DUBBO_IP_TO_REGISTRY: 注册到注册中心的 ip 地址
- DUBBO_PORT_TO_REGISTRY: 注册到注册中心的端口
- DUBBO_IP_TO_BIND: 监听 ip 地址
- DUBBO_PORT_TO_BIND: 监听端口
以上四个配置项可选。如果不配置 dubbo,它会自动获取 ip 和端口。请根据具体部署场景灵活选择配置。dubbo 支持多种协议。如果一个应用同时暴露多个不同的协议服务,并且需要分别为每个服务指定 ip 或端口,请在以上属性前添加协议前缀。例如
- HESSIAN_DUBBO_PORT_TO_BIND: hessian 协议绑定的端口
- DUBBO_DUBBO_PORT_TO_BIND: dubbo 协议绑定的端口
- HESSIAN_DUBBO_IP_TO_REGISTRY: hessian 协议注册的 ip
- DUBBO_DUBBO_IP_TO_REGISTRY: dubbo 协议注册的 ip
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 地址是同一个值 - 为了解决虚拟环境或局域网中消费者无法与提供者通信的问题,可以通过环境变量分别设置注册到注册中心的 IP 地址和监听的 IP 地址,其优先级高于
dubbo.protocol
或dubbo. provider
的host
配置
参考
上次修改时间:2023年1月2日:增强英文文档 (#1798) (95a9f4f6c1c)