Nest.js学习之路(29)-用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最快

  • redis
    • 參考redis official dockerfile
    • docker run -d -p 6379:6379 redis
  • nats
    • 參考nats official dockerfile
    • docker run -d --name nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats

docker ps

Nest.js学习之路(29)-用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System_第1张图片
2018112704.png

Redis as messaging system

先安装redis client包

npm install redis --save

修改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套件

npm install nats --save

修改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在user.controller.ts

使用postman测试,没问题。

开打浏览器输入docker-machine ip并指定port 8222可以看到nats提供基本http monitoring

Nest.js学习之路(29)-用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System_第2张图片
2018112705.png

推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

Nest.js学习之路(29)-用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System_第3张图片
tuiguang.png

你可能感兴趣的:(Nest.js学习之路(29)-用nestjs建立API Microservice(下)-REDIS、NATS as Messaging System)