网易二面:Dubbo线上调试,如何设置流量不打到其中的一台线上机器上?

29 阅读3分钟

文章内容收录到个人网站,方便阅读:hardyfish.top/

资料分享

深入理解Apache Dubbo与实战:

线上调试 RPC 服务(如 Dubbo)时,需要确保调试过程对线上业务的影响最小化,可以通过以下方法进行调试,并设置流量不打到某台机器上:

1. 流量隔离:让调试机器不接收线上流量

方法 1:通过 Dubbo 提供的服务治理功能

  • 下线该实例:

    使用 Dubbo 的服务治理功能,将待调试的机器从服务注册中心摘除,这样其他消费者就不会再调用到这台机器。

    • 操作:

      • 使用 Dubbo 控制台或管理工具,将调试实例从注册中心(如 Zookeeper、Nacos)中临时移除。
      • 设置为 “不可用” 状态。
    • 命令示例(基于 Dubbo Admin):

      dubbo-admin> dubbo -d unregister provider://<调试机器URL>
      

方法 2:设置权重为 0

  • 调整权重:

    在 Dubbo 配置中,将调试机器的权重设置为 0,流量自动避开该机器。

    • 操作:

      <dubbo:service weight="0" />
      

方法 3:通过标签路由隔离

  • 打标签路由:

    使用 Dubbo 的条件路由功能,为调试实例设置特殊标签,限制该实例只接收特定流量。

    • 操作:

      1. 给待调试实例设置特定的标签(如 debug)。

      2. 将线上正常请求路由到其他标签的实例上。

      • 路由规则示例:

        enabled: true
        force: true
        runtime: false
        conditions:
          - => host != <调试机器IP>
        

2. 引流隔离:将流量引流到调试机器

方法 1:通过指定流量

  • 设置特定流量规则:

    为调试机器设计一套路由规则,只接收来自调试流量的请求。

    • Dubbo 消费端路由规则:

      conditions:
        - method=myMethod => host = <调试机器IP>
      

方法 2:调整消费者的负载均衡

  • 直接调用指定机器:

    修改调试机器的消费者配置,让其强制调用指定的机器。可以在消费端设置服务直连(直连模式)。

    • 直连配置示例:

      <dubbo:reference id="myService" interface="com.example.Service"
                       url="dubbo://<调试机器IP>:20880" />
      

3. 调试机器的断点和日志

  • 条件断点调试: 在待调试的机器上部署调试代码,配合条件断点设置特定的调试场景。
  • 日志增强: 在调试机器上开启详细日志输出,记录请求参数、调用链等信息。

4. 调试注意事项

  1. 避免影响线上服务

    • 流量隔离是关键,确保调试机器的流量与正常流量完全分离。
    • 禁止在线上机器上直接调试可能影响共享资源的代码。
  2. 动态配置调整

    • 使用配置中心(如 Apollo、Nacos)动态调整流量路由和调试规则。
  3. 启用专用环境

    • 建议在预发布或灰度环境调试,而非直接在线上调试。

5. 推荐方案:灰度环境调试

最优方法是为调试创建一个灰度环境,复制线上流量的一部分引入调试实例,避免线上任何影响。

使用流量复制工具(如 Envoy 或 Nginx 配合日志回放工具)可实现生产流量的非侵入式调试。

通过流量隔离和规则设置,既能安全调试 Dubbo 服务,又不会影响线上服务的稳定性。