Skip to content

Nest 接口拆分-微服务

流程

安装

  • 无论是总的还是拆分的,都需要安装
bash

pnpm install @nestjs/microservices --save

总的服务器

创建两个模块

  • user

  • bbs

user.module.ts

  • user 指向 3001 端口
ts
import { Module } from "@nestjs/common";

import { UserController } from "./user.controller";

import { ClientsModule, Transport } from "@nestjs/microservices";
@Module({
  imports: [
    ClientsModule.register([
      {
        name: "USER_SERVICE_3001",
        transport: Transport.TCP,
        options: {
          host: "localhost",
          port: 3001,
        },
      },
    ]),
  ],
  controllers: [UserController],
  providers: [],
})
export class UserModule {}

user.controller.ts

ts
import { Controller, Get, Inject, Query } from "@nestjs/common";

import { ClientProxy } from "@nestjs/microservices";

@Controller("user")
export class UserController {
  @Inject("USER_SERVICE_3001")
  private userClient: ClientProxy;

  @Get("sum")
  sum(@Query("num") str: string) {
    console.log(str);
    const numAll = str.split("-");
    const numArr = numAll.map((item) => Number(item));
    console.log("这就是主的服务器");
    console.log(numArr);
    return this.userClient.send("sum", numArr);
  }
}

bbs.module.ts

ts
import { Module } from "@nestjs/common";

import { BbsController } from "./bbs.controller";

import { ClientsModule, Transport } from "@nestjs/microservices";
@Module({
  imports: [
    ClientsModule.register([
      {
        name: "USER_SERVICE_3000",
        transport: Transport.TCP,
        options: {
          host: "localhost",
          port: 3000,
        },
      },
    ]),
  ],
  controllers: [BbsController],
  providers: [],
})
export class BbsModule {}

bbs.controller.ts

ts
import { Controller, Get, Inject, Query } from "@nestjs/common";

import { ClientProxy } from "@nestjs/microservices";

@Controller("bbs")
export class BbsController {
  // 第二台服务器
  @Inject("USER_SERVICE_3000")
  private readonly userClientBBS: ClientProxy;

  // 接口
  @Get("sum")
  sum(@Query("num") str: string) {
    console.log(str);
    const numAll = str.split("-");
    const numArr = numAll.map((item) => Number(item));
    console.log("这就是主的服务器");
    console.log(numArr);
    return this.userClientBBS.send("sum", numArr);
  }
}

user 服务器

main.ts

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

async function bootstrap() {
  // 启动一个微服务 端口在3000
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        port: 3001,
      },
    }
  );
  app.listen();
}
bootstrap();

接口文件

  • user.controller.ts
ts
import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
} from "@nestjs/common";
import { UserService } from "./user.service";
//微服务
import { MessagePattern } from "@nestjs/microservices";

@Controller("user")
export class UserController {
  constructor(private readonly userService: UserService) {}

  // 微服务 返还给主的服务器
  @MessagePattern("sum")
  sum(numArr: Array<number>): number {
    console.log("这个就是从的服务器");
    console.log(numArr);
    return numArr.reduce((pre, cur) => pre + cur, 0);
  }
}

bbs 服务器

main.ts

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

async function bootstrap() {
  // 启动一个微服务 端口在3000
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        port: 3000,
      },
    }
  );
  app.listen();
}
bootstrap();

接口文件

  • bbs.controller.ts
ts
import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
} from "@nestjs/common";
import { BbsService } from "./bbs.service";

//微服务
import { MessagePattern } from "@nestjs/microservices";

@Controller("bbs")
export class BbsController {
  constructor(private readonly bbsService: BbsService) {}

  // 微服务 返回给总的服务器
  @MessagePattern("sum")
  sum(numArr: Array<number>): number {
    console.log("这个就是bbs服务器");
    console.log(numArr);
    return numArr.reduce((pre, cur) => pre + cur, 0);
  }
}

备注

  • 需要返回值就用 @MessagePattern

  • 不需要返回值就用 @EventPattern

  • 举例如下:

ts
@EventPattern('log')
log(str: string) {
    console.log(str);
}
  • 分服务器
ts
this.userClient.emit("log", "求和");