背景

在开发Dubbo服务时,可能是多个人同时开发,但是都公用一个Zookeeper注册中心,这时就会出现同一个服务会有多个提供者(如果每个开发者都运行了提供者服务),这时如果某个开发者通过消费者服务在调用提供者服务时,可能调到别的同事机器上了,此时无法进行调试。为了解决这个问题,dubbo 可以有三种方法来解决。

方法一

修改服务提供者和服务消费者的版本号,比如修改服务提供者需要本地调试的某个API的版本号

@Service(interfaceClass = CcbBankServiceApi.class,version = "0.0.2")

同时需要修改消费者此API的版本号

方法二

在启动本地的服务时加入全局版本号的参数

-Ddubbo.service.version=test

java dubbo consumer 测试类 dubbo本地测试_服务提供者


同时需要修改消费者侧API的版本号

方法三

本机服务提供者不去zookeeper 注册中心注册,这样别人将调不了你的服务。需要修改配置

dubbo.registry.register=false                            (properties)
dubbo:
    registry:
      protocol: zookeeper
      address: 192.168.0.1                                (yml)
      register: false

由于本地的服务提供者没有注册到注册中心,所以服务消费者需要指定本地服务提供者url地址,配置如下:

<dubbo:reference id="xxxxxApi" interface="xxxxxxApi" version="0.0.1"  timeout="15000" url="dubbo://localhost:8136"/>

三种方法对比

方法

服务提供者配置

消费者配置

备注

第一种方法

需要

需要

此方法的弊端在于别的服务消费者请求仍然有可能会打到本机服务,但是本地的版本可能不符合服务消费者的需求。比如 服务消费者需要A版本,而本地是B版本

第二种方法

不需要

需要

此方法可以避免方法一的问题,方法一是局部改变服务提供者的版本号,而方法是全局改变 本地服务提供者的版本号。

第三种方法

需要

需要

此方法由于没有注册到注册中心,所以也可以避免方法一的问题,但是服务提供者和消费者都需要改配置,容易出错

综合以上的对比,个人强烈建议采用第二种方法,即在本地服务提供者启动时,加入VM参数 -Ddubbo.service.version=test ,这样可以不用改服务提供者的配置,避免上线配置忘记改过来的问题。