gRPC 节点微服务与 istio 网格中的另一个微服务通信

问题描述

在我的 k8s pod 中,我通过 Istio 部署了几个 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

解决方法

好的,至少现在知道“通道凭据必须是 ChannelCredentials 对象”错误的根本原因。我正在并排开发节点包作为符号链接,每个依赖项都有自己的 grpc-js 副本。

https://github.com/npm/npm/issues/7742#issuecomment-257186653

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...