https://github.com/xizhibei/grpc-helper
An improved gRPC client with lots of helpful features.
https://github.com/xizhibei/grpc-helper
grpc grpc-client load-balance node-grpc promise-api typescript
Last synced: 3 months ago
JSON representation
An improved gRPC client with lots of helpful features.
- Host: GitHub
- URL: https://github.com/xizhibei/grpc-helper
- Owner: xizhibei
- License: mit
- Created: 2018-08-26T10:06:01.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-12-08T19:13:59.000Z (over 2 years ago)
- Last Synced: 2024-11-17T04:42:26.708Z (6 months ago)
- Topics: grpc, grpc-client, load-balance, node-grpc, promise-api, typescript
- Language: TypeScript
- Homepage:
- Size: 794 KB
- Stars: 81
- Watchers: 3
- Forks: 14
- Open Issues: 12
-
Metadata Files:
- Readme: Readme.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# gRPC helper
gRPC helper is an improved gRPC client with lots of helpful features.
[](https://travis-ci.org/xizhibei/grpc-helper)
[](https://coveralls.io/github/xizhibei/grpc-helper?branch=master)
[](http://badge.fury.io/js/grpc-helper)
[](https://david-dm.org/xizhibei/grpc-helper)
[](https://github.com/xizhibei/grpc-helper/blob/master/LICENSE)### Getting Started
### Installing
```bash
npm i grpc-helper --save
```or
```bash
yarn add grpc-helper
```### Features
- Promised unary & client stream call
- Client Load balance
- Service health checking
- Service discovery (static, dns srv)
- Circuit breaker based on [Brakes](https://github.com/awolden/brakes)
- Retry based on [async-retry](https://github.com/zeit/async-retry)
- Metrics for [prometheus](https://prometheus.io/) based on [prom-client](https://github.com/siimon/prom-client)
- Highly custom [options](src/common.ts)### Usage
#### DNS Service discovery
```ts
const helper = new GRPCHelper({
packageName: 'helloworld',
serviceName: 'Greeter',
protoPath: path.resolve(__dirname, './fixtures/hello.proto'),
// intervalMs will determine how frequent the resolver lookup the records
sdUri: 'dns://_grpc._tcp.greeter?intervalMs=5000',
});await helper.waitForReady();
const res = await helper.SayHello({
name: 'foo',
});
```#### Static Service discovery
```ts
const helper = new GRPCHelper({
packageName: 'helloworld',
serviceName: 'Greeter',
protoPath: path.resolve(__dirname, './fixtures/hello.proto'),
sdUri: 'static://localhost:50051,localhost:50052,localhost:50053',
});await helper.waitForReady();
const res = await helper.SayHello({
name: 'foo',
});
```#### Resolve with full response
```ts
const helper = new GRPCHelper({
packageName: 'helloworld',
serviceName: 'Greeter',
protoPath: path.resolve(__dirname, './fixtures/hello.proto'),
sdUri: 'static://localhost:50051',
resolveFullResponse: true,
});await helper.waitForReady();
const { message, peer, status, metadata } = await helper.SayHello({
name: 'foo',
});
```#### Client stream call
```ts
const stream = new stream.PassThrough({ objectMode: true });const promise = helper.SayMultiHello(stream);
stream.write({
name: 'foo1',
});stream.write({
name: 'foo2',
});stream.write({
name: 'foo3',
});stream.end();
const result = await promise; // { message: 'hello foo1,foo2,foo3' }
```#### Retry
```ts
const helper = new GRPCHelper({
packageName: 'helloworld',
serviceName: 'Greeter',
protoPath: path.resolve(__dirname, './fixtures/hello.proto'),
sdUri: 'static://localhost:50051',
retryOpts: {
enable: true,
retries: 5,
bailError(err, attempt) {
// Just for example !!! It will not retry when code is 2
return err.code === 2;
},
},
});await helper.waitForReady();
await helper.SayHello({
name: 'foo',
});
```#### More
Please take a look at the [test](test/) folder for more examples.
### TODO
- [x] Better api
- [x] Doc
- [x] Test code
- [x] Retry on lb level when error
- [ ] Auto load proto when only one service available
- [ ] Consul/etcd/zk service discovery### License
This project is licensed under the MIT License - see the LICENSE file for details