{"id":15655042,"url":"https://github.com/kaelzhang/node-dubbo","last_synced_at":"2025-05-01T14:42:34.225Z","repository":{"id":57216901,"uuid":"79197261","full_name":"kaelzhang/node-dubbo","owner":"kaelzhang","description":"Dubbo client for node.","archived":false,"fork":false,"pushed_at":"2018-11-03T01:54:50.000Z","size":61,"stargazers_count":25,"open_issues_count":1,"forks_count":5,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-23T17:16:15.720Z","etag":null,"topics":["client","dubbo","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaelzhang.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.md","contributing":null,"funding":null,"license":"LICENSE-MIT","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-17T06:41:50.000Z","updated_at":"2022-08-02T01:31:03.000Z","dependencies_parsed_at":"2022-08-28T21:40:18.447Z","dependency_job_id":null,"html_url":"https://github.com/kaelzhang/node-dubbo","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaelzhang%2Fnode-dubbo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaelzhang%2Fnode-dubbo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaelzhang%2Fnode-dubbo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaelzhang%2Fnode-dubbo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaelzhang","download_url":"https://codeload.github.com/kaelzhang/node-dubbo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251381161,"owners_count":21580389,"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":["client","dubbo","nodejs"],"created_at":"2024-10-03T12:55:40.643Z","updated_at":"2025-05-01T14:42:34.210Z","avatar_url":"https://github.com/kaelzhang.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/kaelzhang/node-dubbo.svg?branch=master)](https://travis-ci.org/kaelzhang/node-dubbo)\n\u003c!-- optional appveyor tst\n[![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/kaelzhang/node-dubbo?branch=master\u0026svg=true)](https://ci.appveyor.com/project/kaelzhang/node-dubbo)\n--\u003e\n\u003c!-- optional npm version\n[![NPM version](https://badge.fury.io/js/dubbo.svg)](http://badge.fury.io/js/dubbo)\n--\u003e\n\u003c!-- optional npm downloads\n[![npm module downloads per month](http://img.shields.io/npm/dm/dubbo.svg)](https://www.npmjs.org/package/dubbo)\n--\u003e\n\u003c!-- optional dependency status\n[![Dependency Status](https://david-dm.org/kaelzhang/node-dubbo.svg)](https://david-dm.org/kaelzhang/node-dubbo)\n--\u003e\n\n# dubbo\n\nnode.js dubbo/dubbox client with zookeeper support via dubbo default hessian protocol.\n\n想到这个项目基本上只给国人用，就破例稍微接地气一点，下面都写中文文档\n\n- TCP 长连接及长连接池\n- 动态的服务注册\n- 内部使用队列处理 Service 注册的握手过程，调用者无需关心\n\n## Install\n\n```sh\n$ npm install dubbo --save\n```\n\n## Usage\n\n```js\nimport Dubbo from 'dubbo'\n\nconst dubbo = new Dubbo({\n  application: 'my-application-name',\n\n  // Dubbo 父节点名\n  root: 'dubbo-test',\n\n  // Dubbo 的版本\n  version: '2.8.4',\n  zookeeper: {\n    host          : '10.0.0.100:2181',\n\n    // node-zookeeper-client 的 createClient 方法的 options，\n    sessionTimeout: 30000,\n    spinDelay     : 1000,\n    retries       : 5\n  },\n\n  // 需要注册的服务名，还可以使用 `dubbo.register` 方法来动态注册一个服务\n  services: {\n    member: {\n      interface: 'me.kael.service.memberService',\n      timeout: 6000,\n      group,\n      version\n    }\n  },\n\n  // 1. Object\n  // 对于每一个 service，长连接池的大小\n  // 这些参数会被直接传递给 generic-pool\n  // 2. false\n  // 若不希望使用连接池，则传递 false\n  pool: {\n    max: 200,\n    min: 10,\n    maxWaitingClients: 500\n  }\n})\n\n\n// 如果一个服务没有注册就被调用，那么会收到一个 Promise.reject\ndubbo.service('member')\n\n// `'login'` 为方法名\n// invoke 方法可以接多个参数\n.invoke('login', {\n  $class: 'me.kael.member.dto.loginDTO',\n  $: {\n    mobile: {\n      $class: 'java.lang.String',\n      $: '18800008888'\n    },\n    password: {\n      $class: 'java.lang.String',\n      $: 'my-password'\n    }\n  }\n})\n.then(isSuccess =\u003e {\n  console.log('is successful', isSuccess)\n})\n\n\n// 动态注册一个服务\ndubbo.register('order', {\n  interface: 'me.kael.service.orderService'\n})\n.service('order')\n.invoke('create', ...)\n.then(...)\n```\n\n## new Dubbo(options)\n\n创建一个 `Dubbo` 实例\n\n**options** `Object`\n\n- **application** `String` 当前应用的名称\n- **root** `String` dubbo 的父节点名\n- **version** `String` 连接的 dubbo 服务使用的 dubbo 版本\n- **zookeeper** `Object`\n  - **host** `String` zookeeper 的地址，格式为 `\u003cip\u003e[:\u003cport\u003e]`，若端口没有定义，则默认端口为 `2181`\n  - 其他 [`node-zookeeper-client`](https://www.npmjs.com/package/node-zookeeper-client) 的参数，会直接传递\n- **services** `Object.\u003cname:ServiceOptions\u003e` 需要预先注册的 services\n- **pool** `Object|false` 连接池的 options，它会直接作为参数传递给 [`generic-pool`](https://www.npmjs.com/package/generic-pool)\n\n\n**ServiceOptions** `Object`\n\n- **interface**\n- **timeout**\n- **group**\n- **version**\n\n## dubbo.register(name, serviceOptions)\n\n注册一个 dubbo service，一个被注册过的 service，可以立即调用它的 `service.invoke()` 方法，`dubbo` 与 service 进行 providers 和 consumers 的握手的过程，会被 service 内部的队列处理好。\n\n- **name** `String`\n- **serviceOptions** `ServiceOptions`\n\nReturns `this`\n\n## dubbo.service(name)\n\n获取一个 service，即使一个名为 `name` 的 service，没有被注册过，该方法也会返回一个 `Service` 实例。\n\n但是若一个 service 没有被注册过，那么在调动 `service.invoke()` 方法的时候，会得到一个 `Promise.reject()`\n\nReturns `Service`\n\n\n```js\n// 若 `member` service 没有注册，仍然能够获取一个 member 实例\nconst member = dubbo.service('member')\n\nmember.invoke('login', arg).catch(err =\u003e {\n  // 但是当调用 invoke 的时候，会得到一个 `SERVICE_NOT_REGISTERED` 的错误\n  console.log(err.code === 'SERVICE_NOT_REGISTERED')\n  // true\n})\n\n// 然后，我们若注册了 member 这个 service\ndubbo.register('member', {\n  interface: '...',\n  ...\n})\n\n// 就可以使用这个 service 了\nmember.invoke('login', arg)\n.then(isSuccess =\u003e {\n  console.log('is successfull:', isSuccess)\n})\n```\n\n## service.invoke(methodName, ...args)\n\n请求一个 service 方法。\n\n- **methodName** `String` service 中的方法名，若该方法名不存在，则会得到一个 `Promise.reject`\n- **args** `any` 方法的参数，可传递多个，这里的方法，需要是 java 风格的对象。可以手动拼，或者使用 [`js-to-java`](https://www.npmjs.com/package/js-to-java) module.\n\n```js\nservice.invoke('createProduct', product1, product2)\n```\n\nReturns `Promise`\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaelzhang%2Fnode-dubbo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaelzhang%2Fnode-dubbo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaelzhang%2Fnode-dubbo/lists"}