【问题标题】:gRPC Node microservice talking to another microservice in istio meshgRPC 节点微服务与 istio 网格中的另一个微服务通信
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2020-07-01
      • 2018-05-07
      相关资源
      最近更新 更多