grpclb
grpc load balancer integrated with etcd for Node.js
Install
npm i grpclb grpc
grpclb
listsgrpc
as itspeerDependency
notdependency
because here
Server side
; ; // then you can revoke// by direct call the revoke handlerrevoke; // or by shutting down the grpc serverserver.tryShutdown;
Client side
- client-side load balancing with
round-robin strategy
We can't register custom service resolver util the C
library exposes the api.
So we can implement client-side load-balancing on the other way: javascript Proxy
;;; // load .proto file;// initialize into javascript object; ; // Every time you access the service object, you get the new servant address.; // The service was already initialized and// you can just call the service method to send requestservant.sayHello,;
For static generated grpc javascript codes
The Proxy
way is not convenient. So grpclb
also provides another api to do the load balancing:
;;; ; // Every time you access the service object, you get the new servant address.; // The service was already initialized and// you can just call the service method to send requestservant.sayHellonew HelloRequest,;
Notes
grpc
as peerDependency, not dependency
Image you have two copies of grpc
, it would look like:
├── node_modules│ ├── grpclb│ │ └── node_modules│ │ └── grpc│ └── grpc└── src └── static_codegen ├── helloworld_grpc_pb.js ├── helloworld_pb.d.ts └── helloworld_pb.js
require('grpc')
in src directory, no matter dynamic generated gRPC javascript code or static generated, would resolve tonode_modules/grpc
require('grpc')
ingrpclb
package would resolve tonode_modules/grpclb/node_modules/grpc
Then initialization would throw error
TypeError: Channel's second argument must be a ChannelCredentials
. See details for this issue
List grpc
as peerDependency can avoid this situation.