NestJS的微服務


NestJS官網對其微服務的定義:
In Nest, a microservice is fundamentally an application that uses a different transport layer than HTTP.
一個不使用HTTP作為傳輸層協議的App,就叫微服務。

這對於微服務的描述有點偏差,但不管怎么說,先按照教程實現一個demo。
npm i -g @nestjs/cli
nest new rocket-app
cd rocket-app
npm i --save @nestjs/core@latest @nestjs/common@latest
npm run start
訪問 localhost:3000, 出現Hello World!

cd src && mkdir Rocket && cd Rocket
nest generate service Rocket --flat
nest generate controller Rocket –flat

修改app.module.ts

import { Module, HttpModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RocketService } from './Rocket/rocket.service';
import { RocketController } from './Rocket/rocket.controller';

@Module({
  imports: [HttpModule],
  controllers: [AppController, RocketController],
  providers: [AppService, RocketService],
})
export class AppModule {}

rocket.service.ts

import { Injectable, HttpService } from '@nestjs/common';
import { map } from 'rxjs/operators';

@Injectable()
export class RocketService {
  constructor(private http: HttpService) {}

  getNextLaunchRemainingTime() {
    return this.http.get('https://api.spacexdata.com/v4/launches/next').pipe(
      map((response) => response.data),
      map((launch) => launch.date_utc),
    );
  }
}

Rocket.controller.ts

import { Controller, Get } from '@nestjs/common';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {
  constructor(private rocketService: RocketService) {}

  @Get('next-launch')
  getNextLaunchRemainingTime() {
    return this.rocketService.getNextLaunchRemainingTime();
  }
}

訪問:http://localhost:3000/rocket/next-launch

現在准備轉換為微服務的架構
npm i --save @nestjs/microservices
修改main.ts

import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        host: '127.0.0.1',
        port: 8877,
      },
    },
  );
  app.listen(
    () => console.log(
      'Microservice is listening on port 8877'
    ));
}
bootstrap();

修改Rocket.controller.ts

import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
import { Observable } from 'rxjs';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {

  constructor(private rocketService: RocketService) { }

  @MessagePattern('get-next-launch-remaining-time')
  getNextLaunchRemainingTime(): Observable<string> {
    return this.rocketService.getNextLaunchRemainingTime();
  }

}

下面准備建立Client App
nest new rocket-client
npm i --save @nestjs/microservices
cd src && mkdir Rocket && cd Rocket
nest generate service Rocket --flat
nest generate controller Rocket –flat

rocket.service.ts

import { Injectable } from '@nestjs/common';
import { ClientProxyFactory, Transport, ClientProxy } from '@nestjs/microservices';

@Injectable()
export class RocketService {
  client: ClientProxy;

  constructor() {
    this.client = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: '127.0.0.1',
        port: 8877,
      },
    });
  }

  getNextLaunchRemainingTime() {
    return this.client
      .send<string, string>(
        'get-next-launch-remaining-time', '',
      );
  }
}

Rocket.controller.ts

import { Controller, Get } from '@nestjs/common';
import { RocketService } from './rocket.service';

@Controller('rocket')
export class RocketController {
  constructor(private rocketService: RocketService) {}

  @Get('next-launch')
  getNextLaunchRemainingTime() {
    return this.rocketService.getNextLaunchRemainingTime();
  }
}

分別啟動服務端和client端, npm run start
訪問:http://localhost:3000/rocket/next-launch

源碼鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM