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 app/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 app/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 app/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 app/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();}
}

有疑問歡迎在文章下留言,看到了我就會回答

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210797.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python如何實現數據驅動的接口自動化測試

大家在接口測試的過程中&#xff0c;很多時候會用到對CSV的讀取操作&#xff0c;本文主要說明Python3對CSV的寫入和讀取。下面話不多說了&#xff0c;來一起看看詳細的介紹吧。 1、需求 某API&#xff0c;GET方法&#xff0c;token,mobile,email三個參數 token為必填項mobil…

python在線讀取傳奇列表,并解析為需要的JSON格式

python在線讀取傳奇列表,并解析為需要的JSON格式,以下為傳奇中使用的TXT列表格式, [Server] ; 使用“/”字符分開顏色,也可以不使用顏色,支持以前的舊格式,只有標題和服務器標題支持顏色 ; 標題/顏色代碼(0-255)|服務器標題/顏色代碼(0-255)|服務器名稱|服務器IP|服務器端…

探索人工智能領域——每日20個名詞詳解【day13】

目錄 前言 正文 總結 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高興與大家相識&#xff0c;希望我的博客能對你有所幫助。 &#x1f4a1;本文由Filotimo__??原創&#xff0c;首發于CSDN&#x1f4da;。 &#x1f4e3;如需轉載&#xff0c;請事先與我聯系以…

Axure網頁端高交互組件庫, 下拉菜單文件上傳穿梭框日期城市選擇器

作品說明 組件數量&#xff1a;共 11 套 兼容軟件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 應用領域&#xff1a;web端原型設計、桌面端原型設計 作品特色 本作品為「web端組件庫」&#xff0c;高保真高交互 (帶仿真功能效果)&#xff1b;運用了動態面板、中繼…

UniGui使用CSSUniTreeMenu滾動條

有些人反應UniTreeMenu當菜單項目比較多的時候會超出但是沒有出滾動條&#xff0c;只需要添加如下CSS 老規矩&#xff0c;unitreemeu的layout的componentcls里添加bbtreemenu&#xff0c;然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后當內容超出后就會…

【數據結構第 6 章 ②】- 用 C 語言實現鄰接矩陣

目錄 一、鄰接矩陣表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【數據結構第 6 章 ① 】- 圖的定義和基本術語-CSDN博客 由于圖的結構比較復雜&#xff0c;任意兩個頂點之間都可能存在聯系&#xff0c;因此無法以數據元素在存儲區中的物理位置來表示元素之間的關系&…

SpringCloud網關介紹

一、Gateway簡介 1、官網 上一代zuul 1.X&#xff1a;https://github.com/Netflix/zuul/wiki 當前gateway&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 2、是什么 SpringCloud Gateway是SpringCloud的一個全…

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

文章目錄 前言什么是依賴注入C# 使用依賴注入框架介紹 Microsoft.Extensions.DependencyInjectionNuget安裝簡單單例使用打印結果 自動裝配舉例自動裝配測試用例打印結果自動裝配執行順序測試用例有歧義構造函數漸進式構造函數循環依賴 自動裝配結論 手動裝配手動注入別名注入 …

Git:版本控制的藝術與實踐

引言&#xff1a; 在軟件開發領域&#xff0c;版本控制是至關重要的一環。它幫助我們跟蹤代碼的變化、管理團隊協作、回溯歷史記錄以及解決沖突等。而Git作為目前最流行的分布式版本控制系統&#xff0c;已經成為了開發者們的必備工具。本文將深入探討Git的核心概念、常用命令以…

使用Docker安裝Superset并設置Oracle訪問和使用PG作Meta數據庫

一、安裝 Docker 安裝一個linux&#xff0c;可以是Centos或Ubuntu&#xff0c;如果是Centos 7.X&#xff0c;那么要注意先將系統自帶的docker先刪除。下文以Centos7.9為例 #刪除自帶的不完整版本 yum remove docker docker-client docker-client-latest \docker-common docker-…

調用win32 api獲取電腦名字和系統目錄

學習一下幾個函數的功能&#xff0c;和調用方式&#xff1b; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

常見的Linux系統版本

在介紹常見的Linux系統版本之前&#xff0c;首先需要區分Linux系統內核與Linux發行套件系統的不同。Linux系統內核指的是一個由Linus Torvalds負責維護&#xff0c;提供硬件抽象層、硬盤及文件系統控制及多任務功能的系統核心程序。而Linux發行套件系統是我們常說的Linux操作系…

【Vue+Python】—— 基于Vue與Python的圖書管理系統

文章目錄 &#x1f356; 前言&#x1f3b6;一、項目描述?二、項目展示&#x1f3c6;三、撒花 &#x1f356; 前言 【VuePython】—— 基于Vue與Python的圖書管理系統 &#x1f3b6;一、項目描述 描述&#xff1a; 本項目為《基于Vue與Python的圖書管理系統》&#xff0c;項目…

Minio保姆級教程

轉載自&#xff1a;www.javaman.cn Minio服務器搭建和整合 1、centos安裝minio 1.1、創建安裝目錄 mkdir -p /home/minio1.2、在線下載minio #進入目錄 cd /home/minio #下載 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

Flutter筆記:滑塊及其實現分析1

Flutter筆記 滑塊分析1 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 郵箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134900784 本文從設計角度&#…

SQL命令---刪除字段

介紹 使用sql語句刪除表字段。 命令 alter table 表名 drop 字段名;例子 刪除a表中的name字段。 alter table a drop name;下面是執行刪除后的表結構&#xff1a;

微服務實戰系列之通信

前言 掰個指頭數一數&#xff0c;博主的“微服務實戰系列”從無到有&#xff0c;從零走到了十五。如果比作時鐘&#xff0c;剛好走過了一刻度。 當初為什么要做這個系列&#xff0c;博主想了又想&#xff0c;私以為作為當下軟件領域的幾個“hot spot”之一&#xff0c;又乘著…

探秘機器學習核心邏輯:梯度下降的迭代過程 (圖文詳解)

一 需求解函數 f() 和 g()函數分別為求y值和求導數的函數。 目的&#xff1a;求該函數的最小值&#xff1a; 代碼&#xff1a; import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

架構LAMP

目錄 1.什么是LAMP 2.LAMP組成及作用 3.搭建Apache httpd服務 4.編譯安裝mysqld 服務 5.編譯安裝PHP 解析環境 6.安裝論壇 1.什么是LAMP LAMP架構是目前成熟的企業網站應用模式之一&#xff0c;指的是協同工作的一整套系統和相關軟件&#xff0c;能夠提供動態Web站點服務…

MATLAB算法實戰應用案例精講-【人工智能】漫談自動駕駛

目錄 常用數據集 一、自動駕駛領域數據集 1. KITTI數據集 2.CityScapes數據集 3.BDD100K數據集