我已经通过 Istio 在我的 k8s pod 中部署了几个 gRPC 微服务,位于处理 Web 客户端路由的网关后面。当我需要从客户端(浏览器)向这些服务中的任何一个发送 RPC 时,一切都很好。
我现在想直接从服务 B 调用服务 A。我该怎么做呢?
两个服务器如何实例化的代码:
const server = new grpc.Server();
server.addService(MyService, new MyServiceImpl());
server.bindAsync(`0.0.0.0:${PORT_A}`, grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
服务帐户与 GOOGLE_APPLICATION_CREDENTIALS 和我的部署 YAML 中的机密一起使用。
要从服务 B 调用服务 A,我认为服务 B 中的代码如下所示:
const serviceAClient: MyServiceClient = new MyServiceClient(`0.0.0.0:${PORT_A}`, creds);
const req = new SomeRpcRequest()...;
serviceAClient.someRpc(req, (err: grpc.ServiceError, response: SomeRpcResponse) => {
// yay!
});
这很天真吗?我不确定的一件事是实例化客户端时需要传递的凭据。我收到投诉说我需要通过 ChannelCredentials,但我尝试创建这些凭据的每一种机制都没有奏效。
我意识到的另一件事是 0.0.0.0 不可能是正确的,因为每个服务都在自己的容器中,并与 sidecar 代理配对......那么我如何正确路由 RPC 并附加正确的凭据?
我正在尝试以这种方式构建信用:
let callCreds = grpc.CallCredentials.createFromGoogleCredential(myOauthClient);
let channelCreds = grpc.ChannelCredentials.createSsl().compose(callCreds);
const serviceAClient = new MyServiceClient(`0.0.0.0:${PORT_A}`, channcelCreds);
我神秘地得到以下错误堆栈:
UnhandledPromiseRejectionWarning: TypeError: Channel credentials must be a ChannelCredentials object
at new ChannelImplementation (/bish/proto/activities/node_modules/@grpc/grpc-js/build/src/channel.js:69:19)
at new Client (/bish/proto/activities/node_modules/@grpc/grpc-js/build/src/client.js:58:36)
at new ServiceClientImpl (/bish/proto/activities/node_modules/@grpc/grpc-js/build/src/make-client.js:58:5)
at PresenceService.<anonymous> (/bish/src/servers/presence/dist/presence.js:348:44)
at step (/bish/src/servers/presence/dist/presence.js:33:23)
at Object.next (/bish/src/servers/presence/dist/presence.js:14:53)
at fulfilled (/bish/src/servers/presence/dist/presence.js:5:58)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
这很奇怪,因为 channelCreds 是一个 ComposedChannelCredentialsImpl,实际上它扩展了 ChannelCredentials