微服务基本概念:微服务便是将一个项目拆分红多个服务。举个简单的例子:将网站的登录功能能够拆分出来做成一个服务。

NestJS的微服务实现

微服务分为提供者和顾客,如上“登录服务”便是一个提供者,“网站服务器”便是一个顾客。

你可能留意到了客户端和网站服务器通讯运用的是http,为什么服务器之间运用的是tcp,这主要和功能、传输灵敏度相关。

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

弥补:登录服务能够部署在同一台服务器也能够在其他服务器,但只需拆分出来了就称之为微服务。

1.2 搭建提供者和顾客

首要确保你大局装置了nestjs脚手架 npm i -g @nestjs/cli

创立nestjs项目,如下代码我将会运用monorepo形式,假如你还不太熟悉这是官网地址:docs.nestjs.com/cli/monorep…

或者你也能够直接按照我如下步骤操作

  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:装置微服务需求的包

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调用EventPattern
  this.client.emit('notice', 'xxx');
  // 返回的是一个Observable对象
  return this.client.send<number>('calc', nums);
  }
​
 @Get()
 getHello(): string {
  return this.rpcConsumerService.getHello();
  }
}

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