NestJS 微服务和云部署

Posted

技术标签:

【中文标题】NestJS 微服务和云部署【英文标题】:NestJS Microservices and Cloud deployment 【发布时间】:2020-04-10 04:38:03 【问题描述】:

我和朋友一起尝试开发移动应用程序。我的朋友掌握了 Flutter-App(前端),而我使用 NestJs 做后端工作。我们的目标是部署在云端(GCP / Firebase)中的微服务架构。

当前架构:

前端:仅与面向公众的 API 通信的 Flutter 应用。 API:是一个 NestJS 后端,提供一个使用 JWT 保护的 GraphQL 端点 数据库服务:所有数据处理都在连接到 MongoDB 的单独 NestJS 微服务(见下文)内完成。 更多服务:将来我想添加更多后端服务并将它们相互连接并通过 API 连接

我的工作区是nx workspace。所以我认为创建多个 Nestjs 应用程序并为每个作业设置我自己的微服务很容易。例如前面提到的使用Nest microservice functionality的数据库服务

在我的本地机器上,这很完美,我喜欢 NestJS 和由此产生的微服务架构。现在我不知道如何将此架构交付给云。在“Google Cloud 术语”中,我将我的 API 想象为 App Engine 实例,并将所有连接的服务想象为 Cloud Functions。

问题:我的主要问题是:在 NestJS 中,使用如下配置对象创建了一个微服务:

//database-service: main.ts
createMicroservice(AppModule,
    transport: Transport.TCP,
    
        host:'127.0.0.1',
        port:4000
    
)

//api: AppModule.ts
ClientsModule.register([
    
        name: 'DATABASE_SERVICE',
        transport: Transport.TCP,
        options: 
            host: '127.0.0.1',
            port: 4000
        
    
])

如您所见,配置对象是静态的,对于服务和客户端来说是相同的。在云中,这些配置对象将由云确定,因此不是静态的。而且我还可以想象,在服务之间通过 TCP 进行这种通信是不可能的。

总之: 我该如何解决这个配置和跨服务通信问题?还是我的方法总体上是错误的?

提前致谢。

【问题讨论】:

我对您围绕 GCP 设置 devops 的方式没有太多了解,但对我来说,您应该能够使用环境变量来解决您的问题。让我们更多地了解它当前的设置方式以及您是否考虑过这一点,以便我们进一步调查(不要犹豫,用更多上下文更新您的问题,即代码、回购等。) 所以直到现在我还没有直接在 GCP 上做任何测试。我脑子里有太多的问题。我现在深入研究了文档,发现 App Engine 似乎适合我的需求。但是仍然存在配置问题。我的 API-Service 需要知道数据库服务的路径。我认为这将有助于cloud.google.com/appengine/docs/flexible/nodejs/…,但最终可能像 Pub/Sub 应用程序这样的东西对我的用例有好处。经过一些测试,我会提出新的信息。感谢您的帮助 【参考方案1】:

您需要服务发现,这里是pattern

然后,使用 DNSRegistry service(如 Consul)来查询您的服务。

GCP 中的服务发现

例子:

检查列表服务:4566 身份验证服务:3030 mongodb:27018

领事详情可见here

【讨论】:

以上是关于NestJS 微服务和云部署的主要内容,如果未能解决你的问题,请参考以下文章

NestJS:有没有办法从外部调用微服务rabbitmq

如何使用nestjs redis 微服务?

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

NestJS MQTT 微服务的有效@MessagePattern 是啥?

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

NestJS - 文件上传到微服务