【发布时间】:2021-05-02 18:53:18
【问题描述】:
我已经通过 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
【问题讨论】:
标签: kubernetes grpc istio grpc-node istio-sidecar