当前位置: 首页 > news >正文

NestJS的微服务实现

1.1 基本概念

微服务基本概念:微服务就是将一个项目拆分成多个服务。举个简单的例子:将网站的登录功能可以拆分出来做成一个服务。
在这里插入图片描述

微服务分为提供者和消费者,如上“登录服务”就是一个服务提供者,“网站服务器”就是一个服务消费者(服务客户端)。

你可能注意到了客户端和网站服务器通信使用的是http,为什么服务器之间使用的是tcp,这主要和性能、传输灵活度相关。

在nestjs中传输方式还有很多中,比如通过grpc、rabbitmq、redis等技术来传输数据。

补充:登录服务可以部署在同一台服务器也可以在其他服务器,但只要拆分出来了就称之为微服务。

1.2 搭建提供者和消费者

首先保证你全局安装了nestjs脚手架 npm i -g @nestjs/cli

创建nestjs项目,如下代码我将会使用monorepo模式,如果你还不太熟悉这是官网地址:https://docs.nestjs.com/cli/monorepo#monorepo-mode

或者你也可以直接按照我如下步骤操作

  1. nest new my-app:创建一个nestjs的项目,自行选择包管理器
  2. cd my-app:进入my-app目录
  3. nest generate app rpc-provider:把当前项目转化为monorepo模式,并创建rpc-provider项目(提供者)
  4. nest generate app rpc-consumer:创建消费者
  5. pnpm i:安装依赖
  6. pnpm i @nestjs/microservices:安装微服务需要的包

补充启动方式:npm run start:dev rpc-provider

1.3 实现微服务提供者

1.3.1 apps/rpc-provider/src/main.ts

import { NestFactory } from '@nestjs/core';
import { RpcProviderModule } from './rpc-provider.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';// 创建微服务
async function bootstrap() {const app = await NestFactory.createMicroservice<MicroserviceOptions>(RpcProviderModule,{transport: Transport.TCP,options: {host: '127.0.0.1',port: 2999,},},);await app.listen();
}
bootstrap();

1.3.2 apps/rpc-provider/src/rpc-provider.controller.ts

说明:nestjs中微服务提供了两种模式

  • MessagePattern:基于请求-响应的消息处理程序
  • EventPattern:基于发布-订阅的消息处理程序,此方式是不需要做出响应的
import { Controller, Get } from '@nestjs/common';
import { RpcProviderService } from './rpc-provider.service';
import { EventPattern, MessagePattern } from '@nestjs/microservices';@Controller()
export class RpcProviderController {constructor(private readonly rpcProviderService: RpcProviderService) {}@MessagePattern('calc')async accumulate(nums: number[]): Promise<number> {console.log('微服务提供者 MessagePattern', nums);return await new Promise((resolve) => {setTimeout(() => {resolve(nums.reduce((pre, cur) => pre + cur, 0));}, 10);});}@EventPattern('notice')handleUserCreated(data: string): void {console.log('微服务提供者 EventPattern', data);}@Get()getHello(): string {return this.rpcProviderService.getHello();}
}

1.4 实现微服务消费者

1.4.1 apps/rpc-consumer/src/rpc-consumer.module.ts

import { Module } from '@nestjs/common';
import { RpcConsumerController } from './rpc-consumer.controller';
import { RpcConsumerService } from './rpc-consumer.service';
import { ClientsModule, Transport } from '@nestjs/microservices';@Module({imports: [// 注册服务ClientsModule.register([{name: 'MATH_SERVICE', //给该服务取一个名字transport: Transport.TCP, //服务传输方式options: {host: '127.0.0.1',port: 2999,},},]),],controllers: [RpcConsumerController],providers: [RpcConsumerService],
})
export class RpcConsumerModule {}

1.4.2 apps/rpc-consumer/src/rpc-consumer.controller.ts

import { Body, Controller, Get, Inject, Post } from '@nestjs/common';
import { RpcConsumerService } from './rpc-consumer.service';
import { ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';@Controller()
export class RpcConsumerController {constructor(private readonly rpcConsumerService: RpcConsumerService,@Inject('MATH_SERVICE') private client: ClientProxy,) {}@Post()// 说明:Observable是一个可被观察的流,需要安装rxjs(pnpm i rxjs)callService(@Body('nums') nums: number[]): Observable<number> {// emit调用EventPatternthis.client.emit('notice', 'xxx');// 返回的是一个Observable对象return this.client.send<number>('calc', nums);}@Get()getHello(): string {return this.rpcConsumerService.getHello();}
}

有疑问欢迎在文章下留言,看到了我就会回答

相关文章:

  • 指针浅谈(三)
  • 1842_emacs使用company-irony实现C语言的自动补全
  • pymysql代替mysqlclient,解决mysqlclient因版本不兼容无法安装成功而无法连接mysql的问题
  • 使用Java将图片添加到Excel的几种方式
  • 机器学习---Boosting
  • 代理ip一般适用于什么行业,什么场景
  • linux下部署frp客户端服务端-内网穿透
  • Linux下的软硬链接
  • 生产派工自动化:MES系统的关键作用
  • 第三十二章 控制到 XML 模式的映射 - %ListOfObjects
  • 金融专题 | 对复杂的金融工具进行设计、定价和对冲分析
  • Redis第1讲——入门简介
  • 【MODBUS】Modbus主站云端服务器和边缘设备部署区别
  • yarn或者pnpm第一次执行的时候遇到报错yarn : 无法加载文件......因为在此系统上禁止运行脚本
  • flex布局,换行的元素上下设置间距
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • exports和module.exports
  • Go 语言编译器的 //go: 详解
  • JavaScript的使用你知道几种?(上)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • javascript面向对象之创建对象
  • js递归,无限分级树形折叠菜单
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • orm2 中文文档 3.1 模型属性
  • sessionStorage和localStorage
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • windows-nginx-https-本地配置
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 高度不固定时垂直居中
  • 基于HAProxy的高性能缓存服务器nuster
  • 探索 JS 中的模块化
  • 网络应用优化——时延与带宽
  • ​io --- 处理流的核心工具​
  • #13 yum、编译安装与sed命令的使用
  • #Linux(make工具和makefile文件以及makefile语法)
  • #NOIP 2014# day.1 T2 联合权值
  • #WEB前端(HTML属性)
  • #在 README.md 中生成项目目录结构
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (九)信息融合方式简介
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)scrum常见工具列表
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ***监测系统的构建(chkrootkit )
  • .gitignore文件---让git自动忽略指定文件
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .NET与java的MVC模式(2):struts2核心工作流程与原理