NestJS - 在微服务中结合 HTTP 和 RabbitMQ

Posted

技术标签:

【中文标题】NestJS - 在微服务中结合 HTTP 和 RabbitMQ【英文标题】:NestJS - Combine HTTP with RabbitMQ in microservices 【发布时间】:2019-05-28 10:32:51 【问题描述】:

我有一些微服务,它们通过 API 网关公开。网关负责处理身份验证和路由到系统。网关背后的服务大多是简单的 CRUD-Services。每个服务都公开自己的 API,它们通过 HTTP 同步通信。所有这些服务,包括 API-Gateway,都是“默认”的 NestJS 应用程序。

让我们继续使用 Cats 示例。每当Cat-Service 更新或创建一个新的Cat 时,我想要一个CatCreatedEventCatUpdatedEvent 被emmited。事件应该被推送到像 RabbitMQ 这样的消息代理中,另一个服务应该监听这个事件并异步处理这个事件。

就如何以正确的方式“注入”RabbitMQ 而言,我不确定如何实现这一点,我想知道这种方法在一般情况下是否有意义。我看过 NestJS 的 CQRS 模块,但我认为 CQRS 对于这个领域来说有点太多了。特别是因为在这个领域中拆分读写模型没有任何好处。也许我完全走错了路,所以我希望你能给我一些建议。

【问题讨论】:

【参考方案1】:

RabbitMQ 在 Nestjs 中被支持为 microservice。如果您希望您的应用程序同时支持 http 请求和消息代理,您可以创建一个hybrid application。

// Create your regular nest application.
const app = await NestFactory.create(ApplicationModule);

// Then combine it with a RabbitMQ microservice
const microservice = app.connectMicroservice(
  transport: Transport.RMQ,
  options: 
    urls: [`amqp://localhost:5672`],
    queue: 'my_queue',
    queueOptions:  durable: false ,
  ,
);

await app.startAllMicroservicesAsync();
await app.listen(3001);

【讨论】:

谢谢!经过一番尝试,我得到了这个工作。我在CatService 中添加了这个,在对/cats 的POST 请求之后由CatController 调用emitCatCreatedEvent() return this.client.send( name: 'catCreatedEvent', 'something happend').toPromise(); 你会说这个方法朝着正确的方向发展吗? 是的,看起来不错。 :-) 理解如何使用this.client 有点棘手。 @user2534584 你能分享你的例子吗? 是的,而且很明显,emitCatCreatedEvent() 调用应该始终是快乐路径上完成的最后一件事,因为这表明“猫的创造”实际上已经发生。如果事件信号在控制器级别完成可能会更好,因为它看起来更像是应用程序逻辑而不是业务逻辑。我错了吗? @user2534584 在您上面的帖子中,this.client 来自哪里?那是标准的 NestJS 服务吗? RabbitMQ 的节点驱动程序?

以上是关于NestJS - 在微服务中结合 HTTP 和 RabbitMQ的主要内容,如果未能解决你的问题,请参考以下文章

Auth Server 是不是应该在微服务架构中与 User Service 结合使用?

在 NestJS 微服务中公开普通的 http 端点

在NestJS 中添加对Stripe 的WebHook 验证

将 TypeORM 实体模型类与 NestJS-GraphQL 模式类型结合使用好吗?

NestJS 使用microservice

在 NestJS HTTP 服务器中使用子进程时,受 CPU 限制的进程会阻塞工作池