omnip620 / node-zookeeper-dubbo

A middleware helps node to communicate dubbo by using its default protocol, which is registered in zookeeper
300 stars 80 forks source link

add default.version support #91

Open llggttd opened 5 years ago

llggttd commented 5 years ago

dubbo 服务指定版本有两种方式

<!-- 统一指定 -->
<dubbo:provider loadbalance="leastactive" delay="-1" version="1.0.0"/>
<dubbo:service interface="top.crazyman.dubbo.service.CommonService" ref="commonService"/>
<!-- 单独指定 -->
<dubbo:provider loadbalance="leastactive" delay="-1"/>
<dubbo:service interface="top.crazyman.dubbo.service.CommonService" ref="commonService"  version="1.0.0"/>

在统一指定版本时,向zookeeper中注册服务生成的url参数中没有version, 取而代之的是default.version, 如:dubbo://10.0.75.1:20880/top.crazyman.dubbo.service.CommonService?anyhost=true&application=dubbo-learn-provider&default.delay=-1&default.loadbalance=leastactive&default.version=1.0.0&delay=-1&dubbo=2.6.3&environment=product&generic=false&interface=top.crazyman.dubbo.service.CommonService&methods=getCurrentDate&pid=15440&side=provider&timestamp=1541501405883&uptime=1541501405931"

在index.js文件resolveService方法中,在匹配对应服务提供者时,是直接通过queryObj.version来判断的,这里会造成匹配不到正确的服务提供者。index.js

for (let i = 0; i < size; i++) {
    const provider = url.parse(decodeURIComponent(children[i]));
    const queryObj = qs.parse(provider.query);
    if (
        queryObj.version === depVal.version &&
        queryObj.group === depVal.group &&
        provider.protocol === "dubbo:"
    ) {
        providers.push(provider);
    }
}
omnip620 commented 5 years ago

关于excute的问题 我们在想 是否需要改变调整一下动态添加方法的方式 彻底解决方法可能会冲突的问题 初步思路是返回一个新的对象 而不是在原来的类上暴力添加