iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
Modern Web

讀官網文件邊走邊學nest.js系列 第 28

Day28 用nestjs建立API Microservice(上)

今天內容參考官網-Microservice Basics

nestjs的feature之一是提供microservice wrapper,提供API可以容易整合,以下是它支援的服務

  • TCP
  • Redis
  • RabbitMQ
  • NATS
  • MQTT
  • gRPC

在nestjs中不同microservice間透過Message傳遞資料,但目前還不支援stream-based服務如kafka

今天以TCP作為例子,情境是把迄今為止做的User包成一Account Microservice,透過建立另外一個api gateway透過TCP request取得users資料

建立API Gateway專案

先建立一個nestjs專案api gateway

api gateway可以接受http request,並可以透過TCP send message到Account Microservice

nest new apiGateway

到api gateway目錄下安裝@nestjs/microservices

yarn add @nestjs/microservices

到main.ts下,將api gateway設定成nestjs定義為hybrid application

意思是自己是Web Server也可以扮演microservice的角色

main.ts

// api-gateway/src/main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule); 
  app.connectMicroservice({ // 設定app也具有nestjs定義的microservice的特性
      options:{
        port:3001, // 設定TCP port 
        retryAttempts: 5, // 重試5次後中止
        retryDelay: 1000, // 每1秒重試一次
      },
  })
  app.startAllMicroservicesAsync(); // 啟動nest application同時也啟動microservice
  await app.listen(3000);
}
bootstrap();

要存取Account Microservice,要先連線,然後再send message

nestjs寫好@Client這個Decorator處理連線,我們只要會使用ClientProxy的API send message就可以了

send需要兩個引數

  • Pattern
    • 自訂key-value pair
    • 類似command message
  • Data
    • 要傳給remote的資料

修改app.controller.ts

// api-gateway/src/app.controller.ts
@Controller()
export class AppController {
  // 指定通訊為TPC,remote port為5000
  // nestjs以ClientProxy來處理microservice連線
  @Client({transport:Transport.TCP, options:{
    port:5000, // remote port為5000
  }})
  client: ClientProxy;

  @Get('users')
  async getRemoteUsers() {
    const pattern = {accountData:'users'};
    const data = '';
    return await this.client.send(pattern, data);
  }
}

將原來專案改為Account Microservice

修改main.ts,改為createMicroservice()


async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    options:{
      port: 5000, 
      retryAttempts: 5,
      retryDelay: 1000,
    }
  });
  app.listen(()=>Logger.log('Account Microservice is running'));
}
bootstrap();

到users.controller.ts,先註解掉AuthGuard部分

套用@MessagePattern到回傳users的方法


@Controller('users')
export class UsersController {
    constructor(
        private usersService: UsersService,
    ){}

  @ApiOkResponse({description:'Return Users Array'})
  @Get() 
  // 上面是原本web application部分
  // 以@MessagePattern套用在userList上
  // 代表Listen to {accountData:'users'}這個remote call
  @MessagePattern({accountData:'users'})
  userList(){
    return this.usersService.getUsers();
  }
  
  ...
}

測試

分別啟動兩個nest application

啟動account microservice

啟動api-gateway

使用postman測試api-gateway

得到users

明天繼續redis部分

Github Source Code


上一篇
Day27 存取env變數使用dotenv-儲存敏感資訊
下一篇
Day29 用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System
系列文
讀官網文件邊走邊學nest.js31

尚未有邦友留言

立即登入留言