grpc-helper
v0.5.1
Published
gRPC helper, an improved gRPC client for grpc-node
Downloads
145
Maintainers
Readme
gRPC helper
gRPC helper is an improved gRPC client with lots of helpful features.
Getting Started
Installing
npm i grpc-helper --save
or
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
- Retry based on async-retry
- Metrics for prometheus based on prom-client
- Highly custom options
Usage
DNS Service discovery
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
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
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
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
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 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