iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
Modern Web

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

Day29 用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System

等等....redis不是key-value的database嗎? 跟microservice有什麼關係

怎麼運作可以參考這篇文章Redis Pub/Sub under the hood

其實redis另外一個功能也可以當作小型的messaging system

除了redis、今天也測試nats,其他支援的如RabbitMQ等就只是差在對port不同,及messaging本身的參數設定不同而已

nestjs提供Transport這個enum,可以很快的切換到不同transport layer,使用同樣的API

準備redis & nats server

使用docker來準備這兩個Server最快

docker ps

Redis as messaging system

先安裝redis client套件

yarn add redis

修改app.controller.ts

// api-gateway/src/app.controller.ts

@Controller()
export class AppController {
  // 昨天的仍可以保留
  @Client({transport:Transport.TCP, options:{
    port:5000, // remote port為5000
  }})
  client: ClientProxy;

  // 指定
  @Client({transport:Transport.REDIS, options:{
    url:'redis://192.168.99.101:6379',
  }})
  redisClient: ClientProxy;

  // @Client({transport:Transport.NATS, options:{
  //   url:'nats://192.168.99.101:4222'
  // }})
  // natsClient: ClientProxy;

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

  @Get('roles')
  async getRemoteRoles() {
    const pattern = {accountData:'roles'};
    const data = '';
    return await this.redisClient.send(pattern, data);
  }
  @Get('deps')
  async getRemoteDeps() {
    const pattern = {accountData:'deps'};
    const data = '';
    return await this.redisClient.send(pattern, data);
  }
}@Controller()
export class AppController {
  // 昨天的仍可以保留
  @Client({transport:Transport.TCP, options:{
    port:5000, // remote port為5000
  }})
  client: ClientProxy;

  // 指定redis server作為messaging協定
  // url指定docker redis port
  @Client({transport:Transport.REDIS, options:{
    url:'redis://192.168.99.101:6379',
  }})
  redisClient: ClientProxy;


  @Get('roles')
  async getRemoteRoles() {
    const pattern = {accountData:'roles'};
    const data = '';
    // 取得roles資料
    return await this.redisClient.send(pattern, data);
  }
}

修改src/main.ts

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, { // 改為建立microservice
    transport:Transport.REDIS,
    options:{
      url:'redis://192.168.99.101:6379',
      //port: 5000, // Service的port
      retryAttempts: 5, // 對外request重試次數
      retryDelay: 1000, // 重試間隔
    }
  });
}

我們把@MessagePattern換個到role.controller測試

// src/user/controllers/roles.controller.ts

@Controller('roles')
export class RolesController {
    constructor(
        private rolesService: RolesService,
    ){}

    @Get()
    @MessagePattern({accountData:'roles'})
    getRoles(){
        return this.rolesService.getRoles();
    }
...
}

使用postman測試

nats as messaging system

先安裝nats client套件

yarn add nats

修改app.controllers

// api-gateway/src/app.controller.ts
@Controller()
export class AppController {
  ...
  // 指定nats server作為messaging協定
  // url指定docker-machine ip及nats port
  @Client({transport:Transport.NATS, options:{
    url:'nats://192.168.99.101:4222'
  }})
  natsClient: ClientProxy;

  ...
  @Get('deps')
  async getRemoteDeps() {
    const pattern = {accountData:'deps'};
    const data = '';
    return await this.natsClient.send(pattern, data);
  }
}

修改src/main.ts(或是要另外建立新的nestjs專案也可以)

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, { // 改為建立microservice
    //transport:Transport.REDIS,
    transport:Transport.NATS,
    options:{
      // url:'redis://192.168.99.101:6379',
      url:'nats://192.168.99.101:4222',
      //port: 5000, // Service的port
      retryAttempts: 5, // 對外request重試次數
      retryDelay: 1000, // 重試間隔
    }
  });
}

套用@MessagePattern於dep.controller.ts

export class DepartmentsController {
    constructor(
        private depService: DepartmentService,
    ){}
    ...


    @MessagePattern({accountData:'deps'})
    getDeps(){
        return this.depService.getDeps();
    }
}

使用postman測試

開打瀏覽器輸入docker-machine ip並指定port 8222可以看到nats提供基本http monitoring

Github Source Code


上一篇
Day28 用nestjs建立API Microservice(上)
下一篇
Day30 Fastify Adapter及30天總結與後續
系列文
讀官網文件邊走邊學nest.js31

尚未有邦友留言

立即登入留言