主机地址自定义暴露

自定义 Dubbo 服务暴露主机地址

功能描述

在 Dubbo 中,Provider 启动时主要做两件事

  • 一是启动服务器
  • 二是将服务注册到注册中心。启动服务器时需要绑定 socket,将服务注册到注册中心时需要发送 socket 的唯一服务地址。
  1. dubbo 中未设置 host 时,默认的 host 是什么?
  2. 如何在 dubbo 中指定服务的 host,我们可以使用主机名或域名代替 IP 地址作为 host 吗?
  3. 使用 docker 时,有时需要设置端口映射。此时,启动服务器时绑定的 socket 和注册到注册中心的 socket 使用不同的端口号。此时如何设置?

使用场景

使用方法

未设置 host 时的默认 host

一般的 dubbo 协议配置如下

    ...
    <dubbo:protocol name="dubbo" port="20890" />
    ...

可以看出,只配置了端口号,没有配置 host。此时 host 设置为何值?

查看代码,发现 org.apache.dubbo.config.ServiceConfig#findConfigedHosts() 中,默认 host 是通过 InetAddress.getLocalHost().getHostAddress() 获取的。其返回值如下

  1. 未连接互联网时,返回 127.0.0.1
  2. 在阿里云服务器中,返回私有地址,例如:172.18.46.234
  3. 本地测试时,返回公网地址,例如:30.5.10.11

指定服务的 socket

此外,可以通过 dubbo.protocoldubbo.providerhost 属性配置 host,支持 IP 地址和域名,如下所示

    ...
    <dubbo:protocol name="dubbo" port="20890" host="www.example.com"/>
    ...

socket 使用不同的端口号

参见 dubbo 通过环境变量设置 host

一些部署场景需要动态指定服务注册的地址,例如 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=20881IP_TO_REGISTRY=30.5.97.6,则 PORT_TO_BINDIP_TO_BIND 不会受到影响
  • 设置 PORT_TO_BIND=20881IP_TO_BIND=30.5.97.6,则默认 PORT_TO_REGISTRY=20881IP_TO_REGISTRY=30.5.97.6

总结

  1. 可以通过 dubbo.protocoldubbo.providerhost 属性配置 host,支持 IP 地址和域名。但此时注册到注册中心的 IP 地址和监听的 IP 地址是同一个值
  2. 为了解决虚拟环境或局域网中消费者无法与提供者通信的问题,可以通过环境变量分别设置注册到注册中心的 IP 地址和监听的 IP 地址,其优先级高于 dubbo.protocoldubbo. providerhost 配置

参考

  1. 建议:在服务发现中支持主机名或域名。
  2. dubbo 通过环境变量设置 host

上次修改时间:2023年1月2日:增强英文文档 (#1798) (95a9f4f6c1c)