Как два внутренних облачных сервиса могут успешно взаимодействовать через gRPC? node.js микросервисы успешно взаимодействуют через gRPC?

#node.js #google-cloud-platform #grpc #google-cloud-run #grpc-node

#node.js #google-облачная платформа #grpc #google-cloud-run #grpc-узел

Вопрос:

Новичок в Google Cloud Run и пытается установить два node.js Микросервисы взаимодействуют внутри через gRPC.

Клиентский интерфейс:

 constructor(address: string, credentials: grpc.ChannelCredentials, options?: object);
  

Клиентский код:

 const client: MyClient = new MyClient('my-service-abcdefgh3a-ew.a.run.app:443', grpc.credentials.createSsl());
  

Серверный код:

 const server = new grpc.Server();
server.addService<IMyServer>(MyService, new MyServer());
server.bind(`0.0.0.0:${process.env.PORT}`, grpc.ServerCredentials.createInsecure());
server.start();
  

Сервер настроен на прослушивание 443.

Кажется, что описанное выше работает, когда служба открыта для публичных запросов, но не работает, когда у вас установлен сервер как внутренний. Есть идеи?

Комментарии:

1. Это также задокументировано в cloud.google.com/run/docs/triggering/grpc#request-auth . В двух словах вам нужно предоставить Authentication заголовок для исходящих RPC (заголовки в gRPC называются «метаданными»).

Ответ №1:

Вы должны добавить учетные данные в метаданные запроса. Вот пример

 ...
 // Create a client for the protobuf spec
  const client = new protoObj.Greeter(HOST, grpc.credentials.createInsecure());

  // Build gRPC request
  const metadata = new grpc.Metadata();
  metadata.add('authorization', `Bearer ${JWT_AUTH_TOKEN}`);

  // Execute gRPC request
  client.sayHello({name: GREETEE}, metadata, (err, response) => {...
  

Второй вопрос, как получить JWT_AUTH_TOKEN. Вот документация Cloud Run для этого. Но не полностью, просто получите токен и используйте его в метаданных запроса

 ...
request(tokenRequestOptions)
  .then((token) => {
  // add the token to the metadata
  });

// Make the call
...