Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

初始化多个dubbo,始终只使用一个客户端 #46

Closed
SmartKarven opened this issue Aug 13, 2018 · 12 comments
Closed

初始化多个dubbo,始终只使用一个客户端 #46

SmartKarven opened this issue Aug 13, 2018 · 12 comments

Comments

@SmartKarven
Copy link

你好:
我现在需要初始化多个dubbo 但是初始化或后始终调用的是一个zk上的服务。
如下为编写的代码。
如果我想通过监听事件动态调用,注册在不同zk上的服务,会出现调用不到我想要的调用的服务。
`const {Dubbo, java, TDubboCallResult} = require('dubbo2.js');
const {dubboInvoke,invoker} = require('dubbo-invoker');
const app = require('http');
var url = require('url');
var events = require('events');
var emitor = new events.EventEmitter();

var opt = [{
application: {name: 'dubbo-node-consumerA'},
register: '127.0.0.1:2182',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
},{
application: {name: 'dubbo-node-consumerB'},
register: '127.0.0.1:2181',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
}];
var proxy = {
dubboInterface: 'com.sitech.hsf.Interface.ServerA',
version: '2.0.0',
timeout:10,
group:'',
methods: {
sayHello(name) {
return [java.String(name)];
},
},
};

var dubbo = new Dubbo(opt[0]);
var dubbo1 = new Dubbo(opt[1]);

var proxyProvider = dubbo.proxyService(proxy);

var proxyProvider1 = dubbo1.proxyService(proxy);

//始终调用到dubbo1注册的zk的服务。

emitor.on('input',function (res,pid){
var result = async (id) => {
var result = await proxyProvider'sayHello';
var result1 = await proxyProvider1'sayHello';
console.log('result',result);
console.log('result',result1);
return result;
};
result(pid).then((data) => {res.end(result1.res);} );
});

app.createServer(function(req, res) {
const path = url.parse(req.url).pathname;
var params = url.parse(req.url,true).query;
if(path == '/dubbo'){
emitor.emit('input',res,params.id);
}
}).listen(9090);`

@hufeng
Copy link
Member

hufeng commented Aug 14, 2018

您好,@SmartKarven 你的多个zk里面注册的服务是一样的吗?如果一样,zk可以支持多集群的,我们的registry参数也是支持的

{registry: '127.0.0.1:2182,127.0.0.1:2181'}

image

2.x的版本中,我们更好的设计了service的参数的封装,可以带来更棒的代码提示(如果你用typescript的话) 参考example中的demo

@SmartKarven
Copy link
Author

是不是只能连接一个zk(集群),{registry: '127.0.0.1:2182,127.0.0.1:2181'}填写了两个不同的zk(集群),发现每次都只初始化连接其中一个

@hufeng
Copy link
Member

hufeng commented Aug 14, 2018

如果是两个zk集群确实要初始化两个dubbo对象

@hufeng
Copy link
Member

hufeng commented Aug 14, 2018

可以DBEUG=dubbo* 启动node进程 可以看到完整的dubbo的启动初始化的log,我也试下。按道理不应该出现就初始化一次。

@SmartKarven
Copy link
Author

SmartKarven commented Aug 14, 2018

初始化两个dubbo对象,只能正常调用最后初始化的dubbo的服务。调用第一个初始化的dubbo会报一下的错误:
image
proxyProvider.sayHello
dubbo:bootstrap sayHello create context +56s
dubbo:context new Context +56s
dubbo:context requestId#2 set application: { name: 'demo-providerB' } +1ms
dubbo:context requestId#2 set methodName: sayHello +1ms
dubbo:context requestId#2 set methodArgs: [ { '$class': 'java.lang.String', '$': 'dubbo2....
..' } ] +0ms
dubbo:context requestId#2 set dubboInterface: com.alibaba.dubbo.demo.DemoProvider +1ms
dubbo:context requestId#2 set version: 1.0.0 +0ms
dubbo:context requestId#2 set timeout: 10 +0ms
dubbo:context requestId#2 set group: +0ms
dubbo:bootstrap middleware-> [ [AsyncFunction: handleRequest] ] +3ms
dubbo:bootstrap start middleware handle dubbo Request +0ms
dubbo:context requestId#2 set resolve: [Function] +1ms
dubbo:context requestId#2 set reject: [Function] +0ms
dubbo:queue check timeout: ctx.timeout-> 10 @timeout: 10000 +56s
dubbo:context requestId#2 set timeoutId +0ms
dubbo:queue add queue,requestId#2, interface: com.alibaba.dubbo.demo.DemoProvider +0ms
dubbo:queue current schedule queue => { '2': -1 } +1ms
dubbo:scheduler handle requestId 2, current status: ready +56s
dubbo:bootstrap end handle dubbo request +2ms
result { res: null,
err: TypeError: Cannot read property 'filter' of undefined
at ZkRegistry.getAgentAddrList (E:\dubbo-client2\node_modules_dubbo2.js@2.2.3@dubbo2.js\e
s7\zookeeper.js:188:13)
at Scheduler._handleDubboInvoke (E:\dubbo-client2\node_modules_dubbo2.js@2.2.3@dubbo2.js
es7\scheduler.js:167:46)
at Queue.Scheduler._handleQueueRequest.requestId [as _subscriber] (E:\dubbo-client2\node_m
odules_dubbo2.js@2.2.3@dubbo2.js\es7\scheduler.js:48:26)
at Promise (E:\dubbo-client2\node_modules_dubbo2.js@2.2.3@dubbo2.js\es7\queue.js:57:22)
at new Promise ()
at Queue.add (E:\dubbo-client2\node_modules_dubbo2.js@2.2.3@dubbo2.js\es7\queue.js:39:20)
at handleRequest (E:\dubbo-client2\node_modules_dubbo2.js@2.2.3@dubbo2.js\es7\dubbo.js:87
:70)
at dispatch (E:\dubbo-client2\node_modules_koa-compose@4.0.0@koa-compose\index.js:42:32)
at E:\dubbo-client2\node_modules_koa-compose@4.0.0@koa-compose\index.js:34:12
at Object.proxyObj.(anonymous function) [as sayHello] (E:\dubbo-client2\node_modules_dubb
o2.js@2.2.3@dubbo2.js\es7\dubbo.js:94:31) }
dubbo:queue err: com.alibaba.dubbo.demo.DemoProvider#sayHello remote invoke timeout +10s
dubbo:queue queue schedule failed requestId#2, err: Error: err:com.alibaba.dubbo.demo.DemoPr
ovider#sayHello remote invoke timeout +1ms
dubbo:queue clear invoke and schedule queue #2 +2ms
dubbo:queue current schedule queue {} +0ms
dubbo:queue invoke statistics==>{ timeoutErrCount: 1, paramCheckErrCount: 0, 'pid#1': 0, 'pi
d#2': 1 } +1ms

@hufeng
Copy link
Member

hufeng commented Aug 15, 2018

@SmartKarven 非常感谢这么详细的log detail,我来定位fixed下。

@hufeng
Copy link
Member

hufeng commented Aug 15, 2018

 dubbo:bootstrap sayHello create context +15s
  dubbo:context new Context +0ms
  dubbo:context requestId#1 set application: { name: 'dubbo-node-consumer' } +0ms
  dubbo:context requestId#1 set methodName: sayHello +1ms
  dubbo:context requestId#1 set methodArgs: [ { '$class': 'java.lang.String', '$': 'test' } ] +0ms
  dubbo:context requestId#1 set dubboInterface: com.alibaba.dubbo.demo.DemoProvider +0ms
  dubbo:context requestId#1 set version: 1.0.0 +0ms
  dubbo:context requestId#1 set timeout: NaN +0ms
  dubbo:context requestId#1 set group:  +0ms
  dubbo:bootstrap middleware-> [ [AsyncFunction: handleRequest] ] +1ms
  dubbo:bootstrap start middleware handle dubbo Request +1ms
  dubbo:context requestId#1 set resolve: [Function] +1ms
  dubbo:context requestId#1 set reject: [Function] +0ms
  dubbo:queue check timeout: ctx.timeout-> NaN @timeout: 5000 +16s
  dubbo:context requestId#1 set timeoutId +1ms
  dubbo:queue add queue,requestId#1, interface: com.alibaba.dubbo.demo.DemoProvider +1ms
  dubbo:queue current schedule queue => { '1': -1 } +0ms
  dubbo:scheduler handle requestId 1, current status: ready +15s
  dubbo:scheduler agentAddrSet-> [ '172.19.36.12:20880' ] +0ms
  dubbo:context requestId#1 set reject: 172.19.36.12 +1ms
  dubbo:context requestId#1 set invokePort: 20880 +0ms
  dubbo:zookeeper getProviderProps:|> [object Object] +15s
  dubbo:queue staring schedule 1#com.alibaba.dubbo.demo.DemoProvider#1.0.0 +1ms
  dubbo:socket-worker SocketWorker#1 =invoked=> 1 +15s
  dubbo:context requestId#1 set pid: 1 +0ms
  dubbo:hessian:encoderV2 dubbo encode param request:{
  "requestId": 1,
  "methodName": "sayHello",
  "methodArgs": [
    {
      "$class": "java.lang.String",
      "$": "test"
    }
  ],
  "dubboInterface": "com.alibaba.dubbo.demo.DemoProvider",
  "version": "1.0.0",
  "group": "",
  "dubboVersion": "2.5.7",
  "path": "com.alibaba.dubbo.demo.DemoProvider"
} +0ms
  dubbo:hessian:encoderV2 request#1 attachment {
  "$class": "java.util.HashMap",
  "$": {
    "path": "com.alibaba.dubbo.demo.DemoProvider",
    "interface": "com.alibaba.dubbo.demo.DemoProvider",
    "version": "1.0.0",
    "application": "dubbo-node-consumer"
  }
} +1ms
  dubbo:hessian:encoderV2 encode header requestId: 1 +1ms
  dubbo:hessian:encoderV2 encode body length: 219 bytes +0ms
  dubbo:queue current schedule queue ==> { '1': 1 } +3ms
  dubbo:socket-worker SocketWorker#1  =receive data=> 172.19.36.12:20880 +6ms
  dubbo:decode-buffer body length 57 +15s
  dubbo:hessian:DecoderV2 decode parse requestId: 1 +0ms
  dubbo:hessian:DecoderV2 parse response status: 20, DUBBO_RESPONSE_STATUS: OK +0ms
  dubbo:hessian:DecoderV2 parse dubbo response body flag: 1, DUBBO_RESPONSE_BODY_FLAG: RESPONSE_VALUE +0ms
  dubbo:socket-worker SocketWorker#1 <=received=> dubbo result { requestId: 1,
  dubbo:socket-worker   err: null,
  dubbo:socket-worker   res: 'Hello test, response form provider: 172.19.36.12:20880' } +2ms
  dubbo:queue resolve requestId#1, res: 'Hello test, response form provider: 172.19.36.12:20880'+5ms
  dubbo:queue clear invoke and schedule queue #1 +0ms
  dubbo:queue current schedule queue {} +0ms
  dubbo:queue invoke statistics==>{ timeoutErrCount: 0, paramCheckErrCount: 0, 'pid#1': 1 } +0ms
  dubbo:bootstrap end handle dubbo request +10ms
  dubbo:bootstrap sayHello create context +15s
  dubbo:context new Context +0ms
  dubbo:context requestId#1 set application: { name: 'dubbo-node-consumer1' } +0ms
  dubbo:context requestId#1 set methodName: sayHello +0ms
  dubbo:context requestId#1 set methodArgs: [ { '$class': 'java.lang.String', '$': 'test2' } ] +0ms
  dubbo:context requestId#1 set dubboInterface: com.alibaba.dubbo.demo.DemoProvider +1ms
  dubbo:context requestId#1 set version: 1.0.0 +0ms
  dubbo:context requestId#1 set timeout: NaN +0ms
  dubbo:context requestId#1 set group:  +0ms
  dubbo:bootstrap middleware-> [ [AsyncFunction: costTime], [Function: handleRequest] ] +1ms
before dubbo cost middleware
  dubbo:bootstrap start middleware handle dubbo Request +1ms
  dubbo:context requestId#1 set resolve: [Function] +1ms
  dubbo:context requestId#1 set reject: [Function] +0ms
  dubbo:queue check timeout: ctx.timeout-> NaN @timeout: 5000 +15s
  dubbo:context requestId#1 set timeoutId +0ms
  dubbo:queue add queue,requestId#1, interface: com.alibaba.dubbo.demo.DemoProvider +1ms
  dubbo:queue current schedule queue => { '1': -1 } +0ms
  dubbo:scheduler handle requestId 1, current status: ready +15s
  dubbo:scheduler agentAddrSet-> [ '172.19.36.12:20880' ] +0ms
  dubbo:context requestId#1 set reject: 172.19.36.12 +1ms
  dubbo:context requestId#1 set invokePort: 20880 +1ms
  dubbo:zookeeper getProviderProps:|> [object Object] +15s
  dubbo:queue staring schedule 1#com.alibaba.dubbo.demo.DemoProvider#1.0.0 +1ms
  dubbo:socket-worker SocketWorker#1 =invoked=> 1 +15s
  dubbo:context requestId#1 set pid: 1 +0ms
  dubbo:hessian:encoderV2 dubbo encode param request:{
  "requestId": 1,
  "methodName": "sayHello",
  "methodArgs": [
    {
      "$class": "java.lang.String",
      "$": "test2"
    }
  ],
  "dubboInterface": "com.alibaba.dubbo.demo.DemoProvider",
  "version": "1.0.0",
  "group": "",
  "dubboVersion": "2.5.7",
  "path": "com.alibaba.dubbo.demo.DemoProvider"
} +0ms
  dubbo:hessian:encoderV2 request#1 attachment {
  "$class": "java.util.HashMap",
  "$": {
    "path": "com.alibaba.dubbo.demo.DemoProvider",
    "interface": "com.alibaba.dubbo.demo.DemoProvider",
    "version": "1.0.0",
    "application": "dubbo-node-consumer1"
  }
} +1ms
  dubbo:hessian:encoderV2 encode header requestId: 1 +0ms
  dubbo:hessian:encoderV2 encode body length: 221 bytes +0ms
  dubbo:queue current schedule queue ==> { '1': 1 } +2ms
  dubbo:socket-worker SocketWorker#1  =receive data=> 172.19.36.12:20880 +3ms
  dubbo:decode-buffer body length 58 +15s
  dubbo:hessian:DecoderV2 decode parse requestId: 1 +0ms
  dubbo:hessian:DecoderV2 parse response status: 20, DUBBO_RESPONSE_STATUS: OK +1ms
  dubbo:hessian:DecoderV2 parse dubbo response body flag: 1, DUBBO_RESPONSE_BODY_FLAG: RESPONSE_VALUE +0ms
  dubbo:socket-worker SocketWorker#1 <=received=> dubbo result { requestId: 1,
  dubbo:socket-worker   err: null,
  dubbo:socket-worker   res: 'Hello test2, response form provider: 172.19.36.12:20880' } +1ms
  dubbo:queue resolve requestId#1, res: 'Hello test2, response form provider: 172.19.36.12:20880' +2ms
  dubbo:queue clear invoke and schedule queue #1 +0ms
  dubbo:queue current schedule queue {} +0ms
  dubbo:queue invoke statistics==>{ timeoutErrCount: 0, paramCheckErrCount: 0, 'pid#1': 1 } +0ms
  dubbo:bootstrap end handle dubbo request +6ms
end makecostTime-> 6
{ res: 'Hello test2, response form provider: 172.19.36.12:20880',
  err: null }

我本地测试了下,可以调通,如上log,
从错误看,应该是传入的接口并不在初始化dubbo对象的interfaces中

@hufeng
Copy link
Member

hufeng commented Aug 15, 2018

我加了一个demo测试,example/hello-koa/server.js
image
可以跑通

@SmartKarven
Copy link
Author

你连接的zk是同一个,你可以两个不同的zk试试

@hufeng
Copy link
Member

hufeng commented Aug 15, 2018

@SmartKarven 好的, 感谢你,我想明白了,queue.ts不该是单例,应该在scheduler.ts的构造函数里初始化,如果是单例导致queue中的subscriber被最后一个dubbo初始化绑定,导致在两个不同的zk中,调用差异化接口失败。我来fixed。

@hufeng
Copy link
Member

hufeng commented Aug 17, 2018

@SmartKarven dubbo2.js@2.2.4

@hufeng hufeng closed this as completed Aug 17, 2018
@Meigguoxin
Copy link

@SmartKarven dubbo2.js@2.2.4
你好,我也是报了这个错误,zk也是多个,版本是"dubbo2.js": @@"2.3.9"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants