# dubbo

> node.js dubbo/dubbox client with zookeeper support via dubbo default hessian protocol

Latest version **1.1.2** (published 2018-11-03) · MIT license · 0 weekly downloads

## Install

```sh
npm install dubbo
pnpm add dubbo
yarn add dubbo
bun add dubbo
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: esm support; no vulnerabilities.

Warnings: low downloads; no types.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.2 |
| Published | 2018-11-03 |
| First published | 2017-01-17 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Node | >=4 |
| Dependencies | 7 |
| Unpacked size | 24.4 KB |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| GitHub stars | 25 |
| Author | kaelzhang |
| Maintainers | kael |
| Keywords | dubbo, dubbox, zookeeper, client, dubbo-client, rpc, hessian, pool |

## Links

- npm: https://www.npmjs.com/package/dubbo
- Repository: https://github.com/kaelzhang/node-dubbo
- Homepage: https://github.com/kaelzhang/node-dubbo#readme
- Issues: https://github.com/kaelzhang/node-dubbo/issues
- npm.io page: https://npm.io/package/dubbo

## Dependencies (7)

- [ip](https://npm.io/package/ip.md) ^1.1.5
- [once](https://npm.io/package/once.md) ^1.4.0
- [debug](https://npm.io/package/debug.md) ^3.1.0
- [semver](https://npm.io/package/semver.md) ^5.5.0
- [hessian.js](https://npm.io/package/hessian.js.md) ^2.8.1
- [socket-pool](https://npm.io/package/socket-pool.md) ^1.2.3
- [node-zookeeper-client](https://npm.io/package/node-zookeeper-client.md) ^0.2.2

## Alternatives

- [launchdarkly-js-client-sdk](https://npm.io/package/launchdarkly-js-client-sdk.md) — 2.5M weekly downloads
- [@elastic/elasticsearch](https://npm.io/package/@elastic/elasticsearch.md) — 2.1M weekly downloads
- [@c8y/client](https://npm.io/package/@c8y/client.md) — 15.3K weekly downloads
- [@signaldb/maverickjs](https://npm.io/package/@signaldb/maverickjs.md) — 1.7K weekly downloads
- [@bbc/http-transport-cache](https://npm.io/package/@bbc/http-transport-cache.md) — 1.2K weekly downloads

## Recent versions

- 1.1.2 (latest) — 2018-11-03
- 1.1.1 — 2018-06-07
- 1.1.0 — 2018-05-21
- 1.0.4 — 2017-07-09
- 1.0.3 — 2017-07-09
- 1.0.2 — 2017-07-08
- 1.0.1 — 2017-07-08
- 1.0.0 — 2017-07-07
- 0.0.1 — 2017-01-17

## README

[![Build Status](https://travis-ci.org/kaelzhang/node-dubbo.svg?branch=master)](https://travis-ci.org/kaelzhang/node-dubbo)
<!-- optional appveyor tst
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/kaelzhang/node-dubbo?branch=master&svg=true)](https://ci.appveyor.com/project/kaelzhang/node-dubbo)
-->
<!-- optional npm version
[![NPM version](https://badge.fury.io/js/dubbo.svg)](http://badge.fury.io/js/dubbo)
-->
<!-- optional npm downloads
[![npm module downloads per month](http://img.shields.io/npm/dm/dubbo.svg)](https://www.npmjs.org/package/dubbo)
-->
<!-- optional dependency status
[![Dependency Status](https://david-dm.org/kaelzhang/node-dubbo.svg)](https://david-dm.org/kaelzhang/node-dubbo)
-->

# dubbo

node.js dubbo/dubbox client with zookeeper support via dubbo default hessian protocol.

想到这个项目基本上只给国人用，就破例稍微接地气一点，下面都写中文文档

- TCP 长连接及长连接池
- 动态的服务注册
- 内部使用队列处理 Service 注册的握手过程，调用者无需关心

## Install

```sh
$ npm install dubbo --save
```

## Usage

```js
import Dubbo from 'dubbo'

const dubbo = new Dubbo({
  application: 'my-application-name',

  // Dubbo 父节点名
  root: 'dubbo-test',

  // Dubbo 的版本
  version: '2.8.4',
  zookeeper: {
    host          : '10.0.0.100:2181',

    // node-zookeeper-client 的 createClient 方法的 options，
    sessionTimeout: 30000,
    spinDelay     : 1000,
    retries       : 5
  },

  // 需要注册的服务名，还可以使用 `dubbo.register` 方法来动态注册一个服务
  services: {
    member: {
      interface: 'me.kael.service.memberService',
      timeout: 6000,
      group,
      version
    }
  },

  // 1. Object
  // 对于每一个 service，长连接池的大小
  // 这些参数会被直接传递给 generic-pool
  // 2. false
  // 若不希望使用连接池，则传递 false
  pool: {
    max: 200,
    min: 10,
    maxWaitingClients: 500
  }
})


// 如果一个服务没有注册就被调用，那么会收到一个 Promise.reject
dubbo.service('member')

// `'login'` 为方法名
// invoke 方法可以接多个参数
.invoke('login', {
  $class: 'me.kael.member.dto.loginDTO',
  $: {
    mobile: {
      $class: 'java.lang.String',
      $: '18800008888'
    },
    password: {
      $class: 'java.lang.String',
      $: 'my-password'
    }
  }
})
.then(isSuccess => {
  console.log('is successful', isSuccess)
})


// 动态注册一个服务
dubbo.register('order', {
  interface: 'me.kael.service.orderService'
})
.service('order')
.invoke('create', ...)
.then(...)
```

## new Dubbo(options)

创建一个 `Dubbo` 实例

**options** `Object`

- **application** `String` 当前应用的名称
- **root** `String` dubbo 的父节点名
- **version** `String` 连接的 dubbo 服务使用的 dubbo 版本
- **zookeeper** `Object`
  - **host** `String` zookeeper 的地址，格式为 `<ip>[:<port>]`，若端口没有定义，则默认端口为 `2181`
  - 其他 [`node-zookeeper-client`](https://www.npmjs.com/package/node-zookeeper-client) 的参数，会直接传递
- **services** `Object.<name:ServiceOptions>` 需要预先注册的 services
- **pool** `Object|false` 连接池的 options，它会直接作为参数传递给 [`generic-pool`](https://www.npmjs.com/package/generic-pool)


**ServiceOptions** `Object`

- **interface**
- **timeout**
- **group**
- **version**

## dubbo.register(name, serviceOptions)

注册一个 dubbo service，一个被注册过的 service，可以立即调用它的 `service.invoke()` 方法，`dubbo` 与 service 进行 providers 和 consumers 的握手的过程，会被 service 内部的队列处理好。

- **name** `String`
- **serviceOptions** `ServiceOptions`

Returns `this`

## dubbo.service(name)

获取一个 service，即使一个名为 `name` 的 service，没有被注册过，该方法也会返回一个 `Service` 实例。

但是若一个 service 没有被注册过，那么在调动 `service.invoke()` 方法的时候，会得到一个 `Promise.reject()`

Returns `Service`


```js
// 若 `member` service 没有注册，仍然能够获取一个 member 实例
const member = dubbo.service('member')

member.invoke('login', arg).catch(err => {
  // 但是当调用 invoke 的时候，会得到一个 `SERVICE_NOT_REGISTERED` 的错误
  console.log(err.code === 'SERVICE_NOT_REGISTERED')
  // true
})

// 然后，我们若注册了 member 这个 service
dubbo.register('member', {
  interface: '...',
  ...
})

// 就可以使用这个 service 了
member.invoke('login', arg)
.then(isSuccess => {
  console.log('is successfull:', isSuccess)
})
```

## service.invoke(methodName, ...args)

请求一个 service 方法。

- **methodName** `String` service 中的方法名，若该方法名不存在，则会得到一个 `Promise.reject`
- **args** `any` 方法的参数，可传递多个，这里的方法，需要是 java 风格的对象。可以手动拼，或者使用 [`js-to-java`](https://www.npmjs.com/package/js-to-java) module.

```js
service.invoke('createProduct', product1, product2)
```

Returns `Promise`

## License

MIT

---
_Source: https://npm.io/package/dubbo · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
