商城網(wǎng)站建設(shè)視頻教程/關(guān)鍵詞排名優(yōu)化教程
1.1 基本概念
微服務(wù)基本概念:微服務(wù)就是將一個(gè)項(xiàng)目拆分成多個(gè)服務(wù)。舉個(gè)簡(jiǎn)單的例子:將網(wǎng)站的登錄功能可以拆分出來做成一個(gè)服務(wù)。
微服務(wù)分為提供者和消費(fèi)者,如上“登錄服務(wù)”就是一個(gè)服務(wù)提供者,“網(wǎng)站服務(wù)器”就是一個(gè)服務(wù)消費(fèi)者(服務(wù)客戶端)。
你可能注意到了客戶端和網(wǎng)站服務(wù)器通信使用的是http,為什么服務(wù)器之間使用的是tcp,這主要和性能、傳輸靈活度相關(guān)。
在nestjs中傳輸方式還有很多中,比如通過grpc、rabbitmq、redis等技術(shù)來傳輸數(shù)據(jù)。
補(bǔ)充:登錄服務(wù)可以部署在同一臺(tái)服務(wù)器也可以在其他服務(wù)器,但只要拆分出來了就稱之為微服務(wù)。
1.2 搭建提供者和消費(fèi)者
首先保證你全局安裝了nestjs腳手架 npm i -g @nestjs/cli
創(chuàng)建nestjs項(xiàng)目,如下代碼我將會(huì)使用monorepo模式,如果你還不太熟悉這是官網(wǎng)地址:https://docs.nestjs.com/cli/monorepo#monorepo-mode
或者你也可以直接按照我如下步驟操作
nest new my-app
:創(chuàng)建一個(gè)nestjs的項(xiàng)目,自行選擇包管理器cd my-app
:進(jìn)入my-app目錄nest generate app rpc-provider
:把當(dāng)前項(xiàng)目轉(zhuǎn)化為monorepo模式,并創(chuàng)建rpc-provider
項(xiàng)目(提供者)nest generate app rpc-consumer
:創(chuàng)建消費(fèi)者pnpm i
:安裝依賴pnpm i @nestjs/microservices
:安裝微服務(wù)需要的包
補(bǔ)充啟動(dòng)方式:npm run start:dev rpc-provider
1.3 實(shí)現(xiàn)微服務(wù)提供者
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';// 創(chuàng)建微服務(wù)
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中微服務(wù)提供了兩種模式
- MessagePattern:基于請(qǐng)求-響應(yīng)的消息處理程序
- EventPattern:基于發(fā)布-訂閱的消息處理程序,此方式是不需要做出響應(yīng)的
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('微服務(wù)提供者 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('微服務(wù)提供者 EventPattern', data);}@Get()getHello(): string {return this.rpcProviderService.getHello();}
}
1.4 實(shí)現(xiàn)微服務(wù)消費(fèi)者
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: [// 注冊(cè)服務(wù)ClientsModule.register([{name: 'MATH_SERVICE', //給該服務(wù)取一個(gè)名字transport: Transport.TCP, //服務(wù)傳輸方式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是一個(gè)可被觀察的流,需要安裝rxjs(pnpm i rxjs)callService(@Body('nums') nums: number[]): Observable<number> {// emit調(diào)用EventPatternthis.client.emit('notice', 'xxx');// 返回的是一個(gè)Observable對(duì)象return this.client.send<number>('calc', nums);}@Get()getHello(): string {return this.rpcConsumerService.getHello();}
}
有疑問歡迎在文章下留言,看到了我就會(huì)回答