{"id":13671769,"url":"https://github.com/NetEase/pomelo-rpc","last_synced_at":"2025-04-27T18:31:41.559Z","repository":{"id":5568745,"uuid":"6774217","full_name":"NetEase/pomelo-rpc","owner":"NetEase","description":"rpc framework for pomelo","archived":false,"fork":false,"pushed_at":"2020-04-16T03:26:14.000Z","size":347,"stargazers_count":95,"open_issues_count":18,"forks_count":120,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-04-26T05:27:31.625Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NetEase.png","metadata":{"files":{"readme":"README-Chinese.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-11-20T07:59:46.000Z","updated_at":"2025-03-07T11:31:50.000Z","dependencies_parsed_at":"2022-09-15T10:12:03.418Z","dependency_job_id":null,"html_url":"https://github.com/NetEase/pomelo-rpc","commit_stats":null,"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NetEase","download_url":"https://codeload.github.com/NetEase/pomelo-rpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251187275,"owners_count":21549613,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T09:01:18.255Z","updated_at":"2025-04-27T18:31:39.815Z","avatar_url":"https://github.com/NetEase.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"#pomelo-rpc - rpc framework for pomelo\npomelo-rpc是pomelo项目底层的rpc框架，提供了一个多服务器进程间进行rpc调用的基础设施。\npomelo-rpc分为客户端和服务器端两个部分。\n客户端部分提供了rpc代理生成，消息路由和网络通讯等功能，并支持动态添加代理和远程服务器配置。\n服务器端提供了远程服务暴露，请求派发，网络通讯等功能。\n\n远程服务代码加载由pomelo-loader模块完成，相关规则可以参考https://github.com/node-pomelo/pomelo-loader\n\n+ Tags: node.js\n\n##安装\n```\nnpm install pomelo-rpc\n```\n\n##用法\n###Server\n``` javascript\nvar Server = require('pomelo-rpc').server;\n\n// remote service path info list\nvar paths = [\n  {namespace: 'user', path: __dirname + '/remote/test'}\n];\n\nvar port = 3333;\n\nvar server = Server.create({paths: paths, port: port});\nserver.start();\nconsole.log('rpc server started.');\n```\n\n###Client\n``` javascript\nvar Client = require('pomelo-rpc').client;\n\n// remote service interface path info list\nvar records = [\n  {namespace: 'user', serverType: 'test', path: __dirname + '/remote/test'}\n];\n\n// server info list\nvar servers = [\n  {id: 'test-server-1', serverType: 'test', host: '127.0.0.1', port: 3333}\n];\n\n// route parameter passed to route function\nvar routeParam = null;\n\n// route context passed to route function\nvar routeContext = servers;\n\n// route function to caculate the remote server id\nvar routeFunc = function(routeParam, msg, routeContext, cb) {\n  cb(null, routeContext[0].id);\n};\n\nvar client = Client.create({routeContext: routeContext, router: routeFunc});\n\nclient.start(function(err) {\n  console.log('rpc client start ok.');\n\n  client.addProxies(records);\n  client.addServers(servers);\n\n  client.proxies.user.test.service.echo(routeParam, 'hello', function(err, resp) {\n    if(err) {\n      console.error(err.stack);\n    }\n    console.log(resp);\n  });\n});\n```\n\n##Server API\n###Server.create(opts)\n创建一个rpc server实例。根据配置信息加载远程服务代码，并生成底层acceptor。\n###参数\n+ opts.port - rpc server监听端口\n+ opts.paths - 远程服务信息列表, [{namespace: 远程服务名字空间, path: 远程服务代码目录}, ...].\n+ opts.context - 传递给远程服务的上下文信息。\n+ opts.acceptorFactory(opts, msgCB) - （可选）opts.port：监听的端口，opts.services：已加载的远程服务集合，结构为：{namespace: {name: service}}。msgCB(msg, cb)：消息到达回调。该方法返回返回值为acceptor实例。\n\n###server.start\n启动rpc server实例。\n\n###server.stop\n停止rpc server实例，关闭底层的acceptor监听。\n\n###Acceptor\n负责rpc server底层的监听和rpc协议的具体实现。可以通过传入acceptorFactory来定制自己的acceptor，从而实现不同的rpc协议和策略。\n\n###acceptor.listen(port)\n让acceptor实例开始监听port端口。\n\n###acceptor.close\n关闭acceptor实例。\n\n##Client API\n###Client.create(opts)\n创建一个rpc client实例。根据配置生成代理。\n####参数\n+ opts.context - 传递给mailbox的上下文信息。\n+ opts.routeContext - （可选）传递给router函数的上下文。\n+ opts.router(routeParam, msg, routeContext, cb) - （可选）rpc消息路由函数。其中，routeParam是路由的相关的参数，对应于rpc代理第一个参数，可以通过这个参数传递请求用户的相关信息，如session; msg是rpc的描述消息; routeContext是opts.routeContext。\n+ opts.mailBoxFactory(serverInfo, opts) - （可选）构建mailbox实例的工厂方法。\n\n###client.addProxies(records)\n加载新的代理代码。\n####参数\n+ records - 代理代码的配置信息列表。格式：[{namespace: service_name_space, serverType: remote_server_type, path: path_to_remote_service_interfaces}];\n\n###client.addServers(servers)\n添加新的远程服务器配置信息。\n####参数\n+ servers - 远程服务器信息列表。格式：[{id: remote_server_id, serverType: remote_server_type, host: remote_server_host, port: remote_server_port}]\n\n###client.start(cb)\n启动rpc client实例，之后可以通过代理或rpcInvoke方法发起远程调用。\n\n###client.stop\n关闭rpc client实例，并停止底层所有mailbox。\n\n###client.rpcInvoke(serverId, msg, cb)\n直接发起rpc调用。\n####参数\n+ serverId - 远程服务器的id。\n+ msg - rpc描述消息，格式：{namespace: 远程服务命名空间, serverType: 远程服务器类型, service: 远程服务名称, method: 远程服务方法名, args: 远程方法调用参数列表}。\n+ cb - 远程服务调用结果回调。\n\n###MailBox\n负责rpc cliente底层的连接和rpc协议的具体实现。一个mailbox实例对应一个远程服务器。可以通过传入mailBoxFactory来定制自己的mailbox，从而实现不同的rpc协议和策略。\n\n###mailbox.connect(cb)\n让mailbox实例连接到目标服务器。\n\n###mailbox.close\n关闭mailbox实例。\n\n###mailbox.send(msg, opts, cb)\n让mailbox实例发送rpc消息到关联的远程服务器。\n####参数\n+ msg - rpc描述消息，参考clienet.rpcInvoke。\n+ opts - send操作的附加选项，预留，暂时无用。\n+ cb - rpc回调函数。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNetEase%2Fpomelo-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNetEase%2Fpomelo-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNetEase%2Fpomelo-rpc/lists"}