From a9bdf157cbbddeb5f849ff936720e4db924b8a3f Mon Sep 17 00:00:00 2001 From: whitehack Date: Thu, 5 May 2016 20:28:55 +0800 Subject: [PATCH 01/13] add add server fun --- lib/rpc-client/client.js | 10 ++++++++++ lib/rpc-client/mailstation.js | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/rpc-client/client.js b/lib/rpc-client/client.js index 50ecf59..b32c05e 100644 --- a/lib/rpc-client/client.js +++ b/lib/rpc-client/client.js @@ -107,6 +107,16 @@ pro.addProxies = function(records) { } }; +/** + * Add new remote server to the rpc client. + * + * @param {Object} server new server information + */ +pro.addServer = function(server) { + this._station.addServer(server); +}; + + /** * Replace remote servers. * diff --git a/lib/rpc-client/mailstation.js b/lib/rpc-client/mailstation.js index 38b3b94..ffc268c 100644 --- a/lib/rpc-client/mailstation.js +++ b/lib/rpc-client/mailstation.js @@ -106,6 +106,28 @@ pro.clearStation = function() { this.serversMap = {}; }; +/** + * Add a new server info into the mail station. + * + * @param {Object} serverInfo server info such as {id, host, port} + */ +pro.addServer = function(serverInfo) { + if(!serverInfo || !serverInfo.id) { + return; + } + + var id = serverInfo.id; + var type = serverInfo.serverType; + this.servers[id] = serverInfo; + + if(!this.serversMap[type]) { + this.serversMap[type] = []; + } + this.serversMap[type].push(id); + this.emit('addServer', id); +}; + + /** * Replace remote servers info. * From 1ead48c72ea70033be9e6ec4024a9599b23a7508 Mon Sep 17 00:00:00 2001 From: whitehack Date: Thu, 5 May 2016 20:53:18 +0800 Subject: [PATCH 02/13] ! RPC client can only notify --- lib/rpc-client/client.js | 11 +++++++---- lib/rpc-client/mailboxes/ws-mailbox.js | 13 ++++++++++--- package.json | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/rpc-client/client.js b/lib/rpc-client/client.js index b32c05e..498116b 100644 --- a/lib/rpc-client/client.js +++ b/lib/rpc-client/client.js @@ -140,7 +140,7 @@ pro.rpcInvoke = function(serverId, msg, cb) { if(this.state !== STATE_STARTED) { tracer.error('client', __filename, 'rpcInvoke', 'fail to do rpc invoke for client is not running'); logger.error('[pomelo-rpc] fail to do rpc invoke for client is not running'); - cb(new Error('[pomelo-rpc] fail to do rpc invoke for client is not running')); + utils.invokeCallback(cb,new Error('[pomelo-rpc] fail to do rpc invoke for client is not running')); return; } this._station.dispatch(tracer, serverId, msg, this.opts, cb); @@ -247,13 +247,16 @@ var proxyCB = function(client, serviceName, methodName, args, attach, isToSpecif logger.error('[pomelo-rpc] fail to invoke rpc proxy for client is not running'); return; } - if(args.length < 2) { - logger.error('[pomelo-rpc] invalid rpc invoke, arguments length less than 2, namespace: %j, serverType, %j, serviceName: %j, methodName: %j', + if(args.length < 1) { + logger.error('[pomelo-rpc] invalid rpc invoke, arguments length less than 1, namespace: %j, serverType, %j, serviceName: %j, methodName: %j', attach.namespace, attach.serverType, serviceName, methodName); return; } var routeParam = args.shift(); - var cb = args.pop(); + var cb; + if(typeof args[args.length-1]=='function'){ + cb = args.pop(); + } var serverType = attach.serverType; var msg = {namespace: attach.namespace, serverType: serverType, service: serviceName, method: methodName, args: args}; diff --git a/lib/rpc-client/mailboxes/ws-mailbox.js b/lib/rpc-client/mailboxes/ws-mailbox.js index a336532..7be0712 100644 --- a/lib/rpc-client/mailboxes/ws-mailbox.js +++ b/lib/rpc-client/mailboxes/ws-mailbox.js @@ -147,9 +147,13 @@ pro.connect = function(tracer, cb) { } var self = this; - var id = this.curId++; - this.requests[id] = cb; - setCbTimeout(this, id, tracer, cb); + var id = 0; + if(cb){ + id = this.curId++; + this.requests[id] = cb; + setCbTimeout(this, id, tracer, cb); + } + var pkg; if(tracer.isEnabled) { @@ -237,6 +241,9 @@ var processMsgs = function(mailbox, pkgs) { }; var processMsg = function(mailbox, pkg) { + if(!pkg.id){ + return; + } clearCbTimeout(mailbox, pkg.id); var cb = mailbox.requests[pkg.id]; if(!cb) { diff --git a/package.json b/package.json index 68e1cd6..194c6ee 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "pomelo-rpc", "version": "1.0.2", "dependencies": { - "ws": "0.8.0", + "ws": "^0.8.0", "crc": "0.2.0", "pomelo-loader": "0.0.6", "pomelo-logger": "0.1.7", From 5c1b66bb98ca7fc8478c7ff1730b0440fe82911d Mon Sep 17 00:00:00 2001 From: whitehack Date: Thu, 5 May 2016 20:58:49 +0800 Subject: [PATCH 03/13] tcp can ignore callback fun --- lib/rpc-client/mailboxes/tcp-mailbox.js | 9 ++++++--- lib/rpc-client/mailboxes/ws-mailbox.js | 3 --- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/rpc-client/mailboxes/tcp-mailbox.js b/lib/rpc-client/mailboxes/tcp-mailbox.js index 015e233..464a2ba 100644 --- a/lib/rpc-client/mailboxes/tcp-mailbox.js +++ b/lib/rpc-client/mailboxes/tcp-mailbox.js @@ -148,9 +148,12 @@ pro.connect = function(tracer, cb) { return; } - var id = this.curId++ & 0xffffffff; - this.requests[id] = cb; - setCbTimeout(this, id, tracer, cb); + var id = 0; + if(cb){ + id = this.curId++ & 0xffffffff; + this.requests[id] = cb; + setCbTimeout(this, id, tracer, cb); + } var pkg; if(tracer.isEnabled) { diff --git a/lib/rpc-client/mailboxes/ws-mailbox.js b/lib/rpc-client/mailboxes/ws-mailbox.js index 7be0712..f952740 100644 --- a/lib/rpc-client/mailboxes/ws-mailbox.js +++ b/lib/rpc-client/mailboxes/ws-mailbox.js @@ -241,9 +241,6 @@ var processMsgs = function(mailbox, pkgs) { }; var processMsg = function(mailbox, pkg) { - if(!pkg.id){ - return; - } clearCbTimeout(mailbox, pkg.id); var cb = mailbox.requests[pkg.id]; if(!cb) { From 4871fb38c0dd5d4c2141b48ba434ab519b3e3479 Mon Sep 17 00:00:00 2001 From: whitehack Date: Thu, 5 May 2016 21:30:08 +0800 Subject: [PATCH 04/13] server ignore callback. now can only use notify. --- lib/rpc-client/mailboxes/tcp-mailbox.js | 3 ++ lib/rpc-client/mailboxes/ws-mailbox.js | 3 ++ lib/rpc-server/acceptors/ws-acceptor.js | 43 +++++++++++++------------ lib/rpc-server/dispatcher.js | 4 ++- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/rpc-client/mailboxes/tcp-mailbox.js b/lib/rpc-client/mailboxes/tcp-mailbox.js index 464a2ba..91b6cc3 100644 --- a/lib/rpc-client/mailboxes/tcp-mailbox.js +++ b/lib/rpc-client/mailboxes/tcp-mailbox.js @@ -151,6 +151,9 @@ pro.connect = function(tracer, cb) { var id = 0; if(cb){ id = this.curId++ & 0xffffffff; + if(!id){ + id = this.curId++ & 0xffffffff; + } this.requests[id] = cb; setCbTimeout(this, id, tracer, cb); } diff --git a/lib/rpc-client/mailboxes/ws-mailbox.js b/lib/rpc-client/mailboxes/ws-mailbox.js index f952740..0d4824c 100644 --- a/lib/rpc-client/mailboxes/ws-mailbox.js +++ b/lib/rpc-client/mailboxes/ws-mailbox.js @@ -150,6 +150,9 @@ pro.connect = function(tracer, cb) { var id = 0; if(cb){ id = this.curId++; + if(!id){ + id = this.curId++; + } this.requests[id] = cb; setCbTimeout(this, id, tracer, cb); } diff --git a/lib/rpc-server/acceptors/ws-acceptor.js b/lib/rpc-server/acceptors/ws-acceptor.js index 1bd876a..3686b4a 100644 --- a/lib/rpc-server/acceptors/ws-acceptor.js +++ b/lib/rpc-server/acceptors/ws-acceptor.js @@ -153,29 +153,32 @@ var cloneError = function(origin) { return res; }; +var respCallback = function(socket,acceptor,pkg,tracer) { + var args = Array.prototype.slice.call(arguments, 4); + for(var i=0, l=args.length; i Date: Thu, 5 May 2016 21:35:41 +0800 Subject: [PATCH 05/13] complete tcp-acceptor. --- lib/rpc-server/acceptors/tcp-acceptor.js | 43 +++++++++++++----------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/lib/rpc-server/acceptors/tcp-acceptor.js b/lib/rpc-server/acceptors/tcp-acceptor.js index 820416c..bda57f4 100644 --- a/lib/rpc-server/acceptors/tcp-acceptor.js +++ b/lib/rpc-server/acceptors/tcp-acceptor.js @@ -179,30 +179,33 @@ var cloneError = function(origin) { }; return res; }; + +var respCallback = function(socket, acceptor, pkg,tracer) { + var args = Array.prototype.slice.call(arguments, 4); + for(var i=0, l=args.length; i Date: Thu, 5 May 2016 21:38:18 +0800 Subject: [PATCH 06/13] fix lost tracer arg --- lib/rpc-server/acceptors/ws-acceptor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rpc-server/acceptors/ws-acceptor.js b/lib/rpc-server/acceptors/ws-acceptor.js index 3686b4a..17ea0fc 100644 --- a/lib/rpc-server/acceptors/ws-acceptor.js +++ b/lib/rpc-server/acceptors/ws-acceptor.js @@ -178,7 +178,7 @@ var processMsg = function(socket, acceptor, pkg) { var tracer = new Tracer(acceptor.rpcLogger, acceptor.rpcDebugLog, pkg.remote, pkg.source, pkg.msg, pkg.traceId, pkg.seqId); tracer.info('server', __filename, 'processMsg', 'ws-acceptor receive message and try to process message'); - acceptor.cb.call(null, tracer, pkg.msg, pkg.id?respCallback.bind(null,socket,acceptor,pkg):null); + acceptor.cb.call(null, tracer, pkg.msg, pkg.id?respCallback.bind(null,socket,acceptor,pkg,tracer):null); }; /** From 714f4c3028b4877da53d23582ffd187b89e117c0 Mon Sep 17 00:00:00 2001 From: whtiehack Date: Thu, 5 May 2016 23:19:49 +0800 Subject: [PATCH 07/13] ! fix mailbox send callback bug. fix tcp acceptor param id bug --- lib/rpc-client/mailstation.js | 5 +++-- lib/rpc-server/acceptors/tcp-acceptor.js | 8 ++++---- sample/client.js | 1 + sample/config.json | 2 +- sample/remote/test/service.js | 3 +++ 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/rpc-client/mailstation.js b/lib/rpc-client/mailstation.js index ffc268c..fedc660 100644 --- a/lib/rpc-client/mailstation.js +++ b/lib/rpc-client/mailstation.js @@ -205,7 +205,7 @@ pro.dispatch = function(tracer, serverId, msg, opts, cb) { self.emit('error', constants.RPC_ERROR.FAIL_FIND_MAILBOX, tracer, serverId, msg, opts); return; } - mailbox.send(tracer, msg, opts, function() { + var callback = function() { var tracer_send = arguments[0]; var send_err = arguments[1]; if(!!send_err) { @@ -220,7 +220,8 @@ pro.dispatch = function(tracer, serverId, msg, opts, cb) { } utils.applyCallback(cb, args); }); - }); + }; + mailbox.send(tracer, msg, opts,cb?callback:null); }; doFilter(tracer, null, serverId, msg, opts, this.befores, 0, 'before', send); diff --git a/lib/rpc-server/acceptors/tcp-acceptor.js b/lib/rpc-server/acceptors/tcp-acceptor.js index bda57f4..d27412a 100644 --- a/lib/rpc-server/acceptors/tcp-acceptor.js +++ b/lib/rpc-server/acceptors/tcp-acceptor.js @@ -81,7 +81,7 @@ pro.listen = function(port) { } catch(err) { //json parse exception if(err) { socket.composer.reset(); - logger.error(err); + logger.error(err.stack); } } } @@ -180,8 +180,8 @@ var cloneError = function(origin) { return res; }; -var respCallback = function(socket, acceptor, pkg,tracer) { - var args = Array.prototype.slice.call(arguments, 4); +var respCallback = function(socket, acceptor, pkg,tracer,id) { + var args = Array.prototype.slice.call(arguments, 5); for(var i=0, l=args.length; i Date: Tue, 24 May 2016 10:40:08 +0800 Subject: [PATCH 08/13] fail to connect to remote server , add log host:port --- lib/rpc-client/mailstation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rpc-client/mailstation.js b/lib/rpc-client/mailstation.js index fedc660..6bfc99a 100644 --- a/lib/rpc-client/mailstation.js +++ b/lib/rpc-client/mailstation.js @@ -278,8 +278,8 @@ pro.connect = function(tracer, serverId, cb) { var mailbox = self.mailboxesMap[serverId]; mailbox.connect(tracer, function(err) { if(!!err) { - tracer.error('client', __filename, 'lazyConnect', 'fail to connect to remote server: ' + serverId); - logger.error('[pomelo-rpc] mailbox fail to connect to remote server: ' + serverId); + tracer.error('client', __filename, 'lazyConnect', 'fail to connect to remote server: ' + serverId+' host:'+mailbox.host+' port:'+mailbox.port); + logger.error('[pomelo-rpc] mailbox fail to connect to remote server: ' + serverId +' host:'+mailbox.host+' port:'+mailbox.port); if(!!self.mailboxesMap[serverId]) { delete self.mailboxesMap[serverId]; } From 6751c133e0ad6fb0e4a520e4b172f91097329d22 Mon Sep 17 00:00:00 2001 From: Guthyerrz Maciel Date: Tue, 5 Jul 2016 14:52:44 -0300 Subject: [PATCH 09/13] Fixed a crash when there are no servers online --- lib/rpc-client/mailstation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rpc-client/mailstation.js b/lib/rpc-client/mailstation.js index 38b3b94..46d0bd4 100644 --- a/lib/rpc-client/mailstation.js +++ b/lib/rpc-client/mailstation.js @@ -322,6 +322,7 @@ var lazyConnect = function(tracer, station, serverId, factory, cb) { var server = station.servers[serverId]; if(!server) { logger.error('[pomelo-rpc] unknown server: %s', serverId); + return false; } var mailbox = factory.create(server, station.opts); station.connecting[serverId] = true; From 64f453d179bc5cbc8da034e080d9bd89df2609c1 Mon Sep 17 00:00:00 2001 From: whitehack Date: Fri, 22 Jul 2016 22:05:21 +0800 Subject: [PATCH 10/13] FIX reloadRemotes dispatcher is undefined!~~ --- lib/rpc-server/gateway.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/rpc-server/gateway.js b/lib/rpc-server/gateway.js index aa7527f..35ee5f0 100644 --- a/lib/rpc-server/gateway.js +++ b/lib/rpc-server/gateway.js @@ -12,9 +12,6 @@ var Gateway = function(opts) { this.started = false; this.stoped = false; this.services = opts.services; - if(!!this.opts.reloadRemotes) { - watchServices(this, dispatcher); - } var self = this; this.acceptors = {}; @@ -35,6 +32,9 @@ var Gateway = function(opts) { this.acceptor = this.acceptorFactory.create(opts, function(tracer, msg, cb) { dispatcher.route(tracer, msg, cb); }); + if(!!this.opts.reloadRemotes) { + watchServices(this, dispatcher); + } }; util.inherits(Gateway, EventEmitter); From 630ea1677b9b791cb358d459e81aa517ed211041 Mon Sep 17 00:00:00 2001 From: whitehack Date: Fri, 22 Jul 2016 22:09:10 +0800 Subject: [PATCH 11/13] ADD test s --- sample/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/server.js b/sample/server.js index 0a78fab..5cd58cc 100644 --- a/sample/server.js +++ b/sample/server.js @@ -9,7 +9,7 @@ var paths = [ var port = config.port || 8080; -var server = Server.create({paths: paths, port: port, acceptorName: acceptorName}); +var server = Server.create({paths: paths, port: port, acceptorName: acceptorName,reloadRemotes:true}); server.start(); console.log('rpc server started.'); From 8f5d91f4076d3ddab3b17bbc57dfc4d34f96c57a Mon Sep 17 00:00:00 2001 From: whitehack Date: Wed, 27 Dec 2017 18:53:56 +0800 Subject: [PATCH 12/13] update proxy.js support es6 class. --- lib/util/proxy.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/util/proxy.js b/lib/util/proxy.js index 235c9c0..173b38b 100644 --- a/lib/util/proxy.js +++ b/lib/util/proxy.js @@ -29,11 +29,18 @@ exp.create = function(opts) { var genObjectProxy = function(serviceName, origin, attach, proxyCB) { //generate proxy for function field var res = {}; - for(var field in origin) { - if(typeof origin[field] === 'function') { - res[field] = genFunctionProxy(serviceName, field, origin, attach, proxyCB); - } + var keys = Object.getOwnPropertyNames(Object.getPrototypeOf(origin)); + for(var i in keys){ + var field = keys[i]; + if(typeof origin[field] === 'function') { + res[field] = genFunctionProxy(serviceName, field, origin, attach, proxyCB); + } } + // for(var field in origin) { + // if(typeof origin[field] === 'function') { + // res[field] = genFunctionProxy(serviceName, field, origin, attach, proxyCB); + // } + // } return res; }; From 4224f101cedc1543d1697e919cf10bc96eb94fc6 Mon Sep 17 00:00:00 2001 From: whitehack Date: Thu, 28 Dec 2017 15:12:10 +0800 Subject: [PATCH 13/13] fix own property names --- lib/util/proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util/proxy.js b/lib/util/proxy.js index 173b38b..e35399f 100644 --- a/lib/util/proxy.js +++ b/lib/util/proxy.js @@ -29,7 +29,7 @@ exp.create = function(opts) { var genObjectProxy = function(serviceName, origin, attach, proxyCB) { //generate proxy for function field var res = {}; - var keys = Object.getOwnPropertyNames(Object.getPrototypeOf(origin)); + var keys = Object.getOwnPropertyNames(Object.getPrototypeOf(origin)).concat(Object.getOwnPropertyNames(origin)); for(var i in keys){ var field = keys[i]; if(typeof origin[field] === 'function') {