Web クライアントのルーティングを処理するゲートウェイの背後にある k8s ポッドに、Istio を介していくつかの gRPC マイクロサービスをデプロイしました。クライアント (ブラウザー) からこれらのサービスのいずれかに 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!
});
それはナイーブですか?私が確信していないことの 1 つは、クライアントをインスタンス化するときに渡す必要がある資格情報です。ChannelCredentials を渡す必要があるという苦情が寄せられていますが、それらの資格情報を作成しようとしたすべてのメカニズムが機能していません。
私が気付いているもう1つのことは、各サービスがサイドカープロキシとペアになった独自のコンテナにあるため、0.0.0.0が正しくないということです...では、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 は実際には ChannelCredentials を拡張する ComposedChannelCredentialsImpl であるため、これは奇妙です