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