一篇文章学会如何在 NestJS 中开启微服务,微服务实战分享

这篇具有很好参考价值的文章主要介绍了一篇文章学会如何在 NestJS 中开启微服务,微服务实战分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在软件开发的世界里,微服务架构是一个经常被提及的概念。但它到底是什么意思呢?为什么现在这么多团队和公司选择使用微服务?而NestJS又是如何帮助开发者构建微服务的?

什么是微服务

想象一下,你想建一座大厦。你可以选择由一间强大的公司全权负责,从地基到尖塔的每一部分;另一种方法是,你选择多间专业的小公司,一家负责电梯,一家负责供电系统等等。每间公司都是建筑部分的专家,并负责自己区域内的一切。微服务就是采用这后者的思路,但对象是软件应用。

简单来说,微服务是一种将单一应用程序分解为一组小服务的架构风格,每个服务运行在自己的进程中,并使用轻量级的机制通常是HTTP RESTful API进行通信。每个服务都围绕着特定的业务能力构建,并且可以独立地部署到生产环境。它们可以用不同的编程语言编写,并使用不同的数据存储技术。

为什么需要微服务

当你的应用程序变得越来越大,就会越来越难以维护和扩展,这种现象被称为“代码的大泥球”。微服务架构适应这种情况的原因有几个:

  1. 独立性:微服务使得团队可以独立地更新、部署和扩展各个组件。
  2. 易于理解和维护:每个服务都相对较小,负责单一的功能,因此更容易理解和修改。
  3. 技术多样性:不同的服务可以采用最适合其业务需求的技术栈。
  4. 弹性:服务之间相互独立,一个服务的故障不会直接影响到其他服务。
  5. 可扩展性:可以独立扩展某个特定服务,而不必扩展整个应用。

NestJS微服务实战

NestJS是一个用于构建高效,可靠的服务端应用程序的框架。它完美地支持微服务架构模型。NestJS提供了与微服务相关的模块和装饰器,这些工具允许你轻松创建以消息传递机制(比如通过使用TCP、RabbitMQ或Kafka)进行交互的独立服务。

接下来创建一个简单的微服务系统,其中包括一个主服务和一个微服务,它们通过NestJS的微服务模块通信。

一、创建主服务

首先,我们创建一个新的NestJS应用作为主服务:

nest new main-service

二、创建微服务

然后再创建一个新的应用作为微服务:

nest new microservice-app

三、设置微服务通讯

在微服务应用中,更新 main.ts文件来初始化微服务:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';

async function bootstrap(){
const app = await NestFactory.create(AppModule);
  const microservice = app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.TCP,
    options: {
      host: '127.0.0.1',
      port: 8877
    }
  });

  await app.startAllMicroservicesAsync();
  await app.listen(3000);
  console.log(`Microservice is running`);
}

bootstrap();

在这段代码中,我们为微服务指定了 Transport.TCP传输机制,并设置它的监听地址和端口。同时,我们调用了 startAllMicroservicesAsync启动所有的微服务,它会启动TCP服务器并开始监听。

四、在微服务中创建服务处理器

接下来,我们在微服务中创建一个服务处理器。在 app.service.ts文件中,你可能会写类似下面的代码:

import { Injectable } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Injectable()
export class AppService {
  @MessagePattern('get_data')
  getData(data: any): string {
    // 实际业务逻辑
    return `Data received: ${JSON.stringify(data)}`;
  }
}

在上面的 AppService类中,我们使用 MessagePattern装饰器定义了一个消息处理器,该处理器将响应名为 get_data的消息并返回一些处理过的数据。

五、在主服务中调用微服务

现在,我们需要在主服务中调用微服务。这需要我们设置主服务中的微服务客户端,并通过该客户端发送消息。

更新主服务的 app.module.ts来配置微服务客户端:

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

在主服务的 app.controller.ts中定义一个调用微服务的方法:

import { Controller, Get } from '@nestjs/common';
import { ClientProxy, ClientProxyFactory, Transport } from '@nestjs/microservices';
import { AppService } from './app.service';

@Controller()
export class AppController {
  private client: ClientProxy;

  constructor(private readonly appService: AppService) {
    this.client = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: '127.0.0.1',
        port: 8877,
      },
    });
  }

  @Get()
  async getData() {
    const response = await this.client.send('get_data', { id: 1 }).toPromise();
    return response;
  }
}

在这个例子中,我们创建了一个名为 clientClientProxy对象,并使用TCP传输和确定的主机及端口对其进行了配置。通过 client.send('get_data', { id: 1 }),我们就可以发送消息 get_data并附带一些数据。使用 toPromise()来处理异步响应。

六、测试微服务系统

一切都设置好之后,你就可以分别运行主服务和微服务了。

# 在两个不同的终端中
# 启动主服务
npm run start

# 启动微服务
npm run start

当主服务和微服务都启动之后,你可以通过浏览器访问主服务的根路径,它会通过微服务客户端向微服务发送请求,微服务会处理这个请求并返回结果。

总结

通过以上步骤,我们展示了如何使用NestJS创建微服务架构的一个简单例子。微服务架构允许我们将应用分解为独立可部署的模块,每个模块专注于一个小的业务范围,提高了开发的可维护性和可扩展性。NestJS的微服务模块简化了服务间的通信和管理,使开发者能够专注于业务逻辑的实现,而不是底层的通信细节。

值得注意的是,微服务的设计和管理需要谨慎考虑,它可能带来一些挑战,比如服务间通信的复杂性、数据一致性、分布式系统的测试和部署等。因此,在选择微服务架构前,你应该评估它是否适合你的项目和团队。文章来源地址https://www.toymoban.com/news/detail-833080.html

到了这里,关于一篇文章学会如何在 NestJS 中开启微服务,微服务实战分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 假期算法提升(一篇文章带你彻底学会双指针)

    呀哈喽,我是结衣。 对于要参加程序设计比赛的人来说,算法永远都是一道绕不开的坎,你必须的去了解他才可以更好的去解决问题。非形式地说,算法就是任何良地计算过程,我们可以把算法看作是用于求良说明地计算问题地工具。那么今天我们学到的就是其中最基础的一

    2024年02月19日
    浏览(47)
  • 一篇文章学会YooAsset资源热更新的初始化

    官方文档 在ProjectSetting里找到这个,这么填 package.openupm.cn https://package.openupm.cn com.tuyoogame.yooasset 然后在PackageManager里,选择MyRegistry ,导入YooAsset 本文只探讨到1.4.17,再高不支持了,本文全部代码均已验证正确 在使用这些东西之前,我们需要在Project面板右键,选择YooAsset/Cr

    2024年02月09日
    浏览(42)
  • Hive详解(一篇文章让你彻底学会Hive)

    概述 Hive是由Facebook(脸书)开发的后来贡献给了Apache的一套数据仓库管理工具,针对海量的结构化数据提供了读、写和管理的功能。 图-1 Hive图标 Hive本身是基于Hadoop,提供了类SQL(Hive Query Language,简称为HQL)语言来操作HDFS上的数据,而底层实际上是将用户书写的SQL转化为了MapR

    2024年04月12日
    浏览(47)
  • 干货丨“看过这篇文章的人都学会Spark了”

    Spark是一个用于大规模数据处理的 统一 计算引擎。 Spark是一种 快速、通用、可扩展 的大数据分析引擎。 注意:Spark不仅仅可以做类似于MapReduce的 离线 数据计算,还可以做 实时 数据计算,并且它还可以实现类似于Hive的SQL计算,等等,所以说它是一个 统一 的计算引擎。

    2024年03月15日
    浏览(40)
  • 一篇文章带你学会Hadoop-3.3.4集群部署

    目录 ​编辑 一、Hadoop集群部署 二、基础设施配置 2.1 设置网络  2.1.1 设置主机名称 2.1.2 设置hosts配置文件 2.1.3 关闭防火墙  2.1.4 关闭selinux  2.1.5 更换语言环境  2.1.6 更换时区  2.1.7 ssh免密 2.1.7.1 生成.ssh文件夹 2.1.7.2 进入文件夹 2.1.7.3 生成密码和私钥 2.1.7.4 免密授权 三、软

    2024年02月07日
    浏览(41)
  • 【数据结构】一篇文章带你彻底学会《后缀表达式》

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c语言系列专栏:c语言之路重点知识整合 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 后缀表

    2024年02月05日
    浏览(57)
  • 看完这篇文章,保你学会C语言switch case 语句

    我的个人主页: ☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主 欢迎各位 👍点赞 ⭐收藏 📝评论 特别标注 :本博主将会长期更新c语言的语法知识,初学c语言的朋友们,可以收藏订阅一下我的专栏: C语言基础语法(超详细)_☆光之梦☆的博客-CSDN博客 (这

    2023年04月26日
    浏览(42)
  • 10min 学会Python 文件操作,我只看了这一篇文章

    平时,生活中我们见到的电影(MP4)、歌曲(MP3)、图片(JPG)、文本(txt)、表格(xlsx)…都可以被称为 文件。 这些文件的格式和文件里面的内容可能不同,但是他们有一个 共同特点: 数据都是保存在硬盘上的!!! 冯诺依曼体系: CPU(运算器和控制器)、存储器、输

    2023年04月08日
    浏览(53)
  • 【C++】类和对象(中)一篇文章带你学会六大默认成员函数

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 对于下面的date类: 对于Date类,可以通过

    2024年03月12日
    浏览(47)
  • 《C语言初阶篇》循环语句还没搞懂?这篇文章带你轻松学会循环语句!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的循环语句的全面讲解!    ⛳️ 历时一天终于给肝出来了,本文详细讲解了wh

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包