NestJs如何配置GRPC客户端拦截器

NestJs how to configure GRPC client interceptors

我遇到一个问题,即在 2 个 NestJs 服务器之间通过 GRPC 进行通信时出现间歇性连接问题。我已经打开了一个关于 Whosebug 的先前问题,其中有人引导我进入一个线程,该线程似乎表明 @grpc-js 库存在问题。

修复的建议是将节点降级到 16.8.0,虽然这对另一个用户有用,但对我不起作用。有人建议我创建一个 GRPC 拦截器,但是,我不知道如何在 NestJS 框架内执行此操作。

如何创建客户端拦截器?

这是我在 NestJS 中设置客户端连接的方式

const clientOptions: ClientsModuleOptions = [
  {
    name: 'HP_USERS_PACKAGE',
    transport: Transport.GRPC,
    options: {
      url: `${env.USERS_SERVICE}:${config.users.port}`,
      package: config.users.v1.package,
      protoPath: config.users.v1.protoPath,
      loader: {
        includeDirs: [config.protoLoaderDir],
        enums: String,
      },
    },
  },
  {
    name: 'HP_STAGING_PACKAGE',
    transport: Transport.GRPC,
    options: {
      url: `${env.STAGING_SERVICE}:${config.staging.port}`,
      package: config.staging.v1.package,
      protoPath: config.staging.v1.protoPath,
      loader: {
        includeDirs: [config.protoLoaderDir],
        enums: String,
      },
    },
  }]

关于我的断开连接问题的初始线程:

显示其他用户遇到相同问题的线程以及可能的解决方案

https://github.com/grpc/grpc-node/issues/1907#issuecomment-927361244

创建 GRPC 客户端拦截器的示例

https://github.com/grpc/proposal/blob/master/L5-node-client-interceptors.md#examples

您可以在客户端实例的选项中添加拦截器:

const clientOptions: ClientsModuleOptions = [{
     name: 'HP_USERS_PACKAGE',
     transport: Transport.GRPC,
     options: {
         interceptors: [retryInterceptor],
         url: `${env.USERS_SERVICE}:${config.users.port}`,
         package: config.users.v1.package,
         protoPath: config.users.v1.protoPath,
         loader: {
             includeDirs: [config.protoLoaderDir],
             enums: String,
         },
     },
}]`

重试拦截器的实现可以同这里:https://github.com/grpc/grpc-node/issues/284