微服务-双向通信

时间:2020-07-28 14:10:06

标签: microservices nestjs

api网关使用ClientProxy与微服务(即“服务A”)进行交互

import { ClientProxy } from "@nestjs/microservices"

@Injectable()  export class AppService {
  constructor(
    @Inject("SERVICE_A") private readonly clientServiceA: ClientProxy
  ) { }
}

微服务的行为类似于服务器,并且引导如下:

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.TCP,
    options: {
      host: "127.0.0.1",
      port: 8888
    }
  });
  await app.listen(() => logger.log("Microservice A is listening"));
}
bootstrap();

API网关充当客户端,并使用ClientsModule建立与“服务A”的连接。所有这些都在AppModule

中完成
import { ClientsModule, Transport } from "@nestjs/microservices";

@Module({
  imports: [
    ClientsModule.register([
      {
        name: "SERVICE_A",
        transport: Transport.TCP,
        options: {
          host: "127.0.0.1",
          port: 8888
        }
      }
    ])
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我从一个很棒的教程中得到了所有这些,我发现了here,并且在一本书(在Packt出版)中找到了相同的设置。

旁注:

老实说,我希望API网关也可以充当发现服务器。然后其他微服务将连接到它。这允许每个的多个实例 微服务,它提供了一种自动发现机制。 微服务只有在松散耦合的情况下才对我有意义。和我 想迁移到可以启动多个实例的情况 微服务,然后重新启动各个微服务,而无需停机 系统。相比之下,以上设置没有真正的发现服务器。可能有微服务连接到API网关。然后,API网关还将充当发现服务器的角色。但这显然不是事实。所以现在,这一切紧密相连。该补充信息可能是相关的,但我不想让这个问题超载。所以,让我们不要被迷住。也许我错过了一些东西,所以我想把它作为一个补充说明。

我真正的问题是,以上设置是否允许双向通信。例如如果微服务(服务a)要调用api网关怎么办?换句话说,有ServerProxy吗?还是可以在通讯的两端使用ClientProxy?还是解决2个连接的唯一方法?

1 个答案:

答案 0 :(得分:-1)

API网关通常旨在控制哪些服务/端点向外部客户端(例如SPA,移动应用程序或客户)公开以及应如何公开(例如,路由是什么,以及客户端应如何进行身份验证)。除了这些外部客户端标识自己所需的身份验证/授权外,通常应该避免将任何业务逻辑放入这些网关中。

但是,让您的某些微服务依赖于彼此提供的功能并非没有道理。如果您需要一个微服务连接到另一个微服务,则可以按照在网关中使用的相同模式将上游微服务注册为下游服务的客户端-完全跳过网关进行内部服务通信。我提醒您避免在这些服务之间使用双向逻辑,因为您可能会很快失去对应用程序流程的跟踪并创建循环引用,但是从技术上讲,可以将两个微服务彼此用作客户端。