记录一次dubbo排查ip为啥自动绑定是内网ip

基础知识(当服务注册错误的时候请自查)

  1. 在 Dubbo 使用 Zookeeper 作为注册中心时,服务的元数据以特定的路径和格式存储在 Zookeeper 中。以下是具体的节点路径和存储值示例:
    根节点:所有 Dubbo 相关的数据都位于 /dubbo 根节点下。

    服务节点:每个服务在 /dubbo 下有一个以服务全限定名命名的子节点,例如 /dubbo/com.example.DemoService。
    类别节点:在每个服务节点下,有以下固定的子节点:

  2. providers:存储服务提供者的信息。

  3. consumers:存储服务消费者的信息。

  4. configurators:存储动态配置。

  5. routers:存储路由规则。

  6. 实例节点:在 providers 和 consumers 等类别节点下,存储具体的实例信息。这些节点的名称通常是经过 URL 编码的字符串,包含服务的详细配置。
    示例:
    服务提供者节点:
    路径:/dubbo/com.example.DemoService/providers
    节点名称(URL 编码前):dubbo://192.168.1.100:20880/com.example.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.2&interface=com.example.DemoService&methods=sayHello&pid=1234&side=provider&timestamp=1609459200000
    说明:该节点表示一个服务提供者,提供 com.example.DemoService 接口,运行在 192.168.1.100 的 20880 端口,应用名为 demo-provider,提供的方法包括 sayHello,进程 ID 为 1234,注册时间戳为 1609459200000。
    服务消费者节点:
    路径:/dubbo/com.example.DemoService/consumers
    节点名称(URL 编码前):consumer://192.168.1.101/com.example.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=com.example.DemoService&methods=sayHello&pid=5678&side=consumer&timestamp=1609459201000
    说明:该节点表示一个服务消费者,消费 com.example.DemoService 接口,运行在 192.168.1.101,应用名为 demo-consumer,需要的方法包括 sayHello,进程 ID 为 5678,注册时间戳为 1609459201000。
    这些节点名称中的参数通过 URL 查询字符串的形式表示,包含了服务的各种配置信息,如协议、主机、端口、应用名、方法列表、进程 ID、角色(提供者或消费者)以及时间戳等。
    通过这种结构,Dubbo 实现了服务的注册与发现,Zookeeper 作为注册中心,存储了服务的元数据,供服务消费者查询和使用。

为啥会注册成内网ip

  1. 源码解析:
  • Dubbo 在服务启动时,会通过以下步骤确定要注册的 IP 地址:
    1. 获取本地主机名: Dubbo 调用 InetAddress.getLocalHost().getHostName() 获取主机名。
    2. 解析 IP 地址: 通过主机名解析得到 IP 地址。
    3. 校验 IP 地址: 检查解析得到的 IP 地址是否为有效的非回环地址(非 127.0.0.1)。
    4. 绑定和注册: 将校验通过的 IP 地址绑定到服务,并注册到注册中心。
  1. 如果主机名解析得到的 IP 地址是内网 IP,且未进行其他配置,Dubbo 会将该内网 IP 注册到注册中心。
    在启动命令中指定外网 IP:
    为了避免上述情况,可以在启动服务提供者时,通过 JVM 启动参数指定要注册的外网 IP 地址:

    java -Ddubbo.ip.to.registry=外网IP -Ddubbo.ip.to.bind=0.0.0.0 -jar your-service.jar
    
  2. dubbo.ip.to.registry:指定注册到注册中心的 IP 地址。

  3. dubbo.ip.to.bind:指定服务绑定的本地网卡 IP 地址,0.0.0.0 表示绑定到所有可用网卡。

  4. 通过配置文件覆盖默认行为:
    除了在启动命令中指定外网 IP,还可以在配置文件中进行设置。例如,在 application.properties 或 application.yml 中添加:
    dubbo.protocol.host=外网IP

  5. 注意事项:

    • 网络环境: 确保指定的外网 IP 在当前网络环境中可达,并且服务器的防火墙和安全组配置允许外部访问该 IP 和相应端口。
    • 版本兼容性: 上述配置适用于 Dubbo 2.7.8 及以上版本。对于更早的版本,可能需要使用不同的配置项。
    • 配置优先级: JVM 启动参数的优先级高于配置文件设置。如果两者都配置,JVM 启动参数会覆盖配置文件中的相应设置。
    • 通过上述方法,可以有效控制服务提供者在注册中心中暴露的 IP 地址,确保外部消费者能够正确访问服务。
posted @ 2024-12-26 00:47  贺艳峰  阅读(3)  评论(0编辑  收藏  举报