美文网首页让前端飞Web前端之路
Nest.js学习之路(28)-用nestjs建立API Mic

Nest.js学习之路(28)-用nestjs建立API Mic

作者: cbw100 | 来源:发表于2019-07-22 09:07 被阅读2次

这节内容参考官网-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

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

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();
2018112606.png

要存取Account Microservice,要先连接,然后再send message

nestjs写好@Client这个Decorator处理连接,我们只要会使用ClientProxy的API send message就可以了

send需要两个参数

  • Pattern
    • 自订key-value pair
    • 类似command message
  • Data
    • 要传给remote的资料

修改app.controller.ts

import { Get, Controller } from '@nestjs/common';
import { AppService } from './app.service';
import { Client, Transport, ClientProxy } from '@nestjs/microservices';

@Controller()
export class AppController {
  // 指定通讯TCP,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);
  }
}

修改原来的文件下的main.ts

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


2018112701.png

启动api-gateway


2018112702.png

使用postman测试api-gateway


2018112703.png

得到users

下一章继续讲redis部分

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

tuiguang.png

相关文章

网友评论

    本文标题:Nest.js学习之路(28)-用nestjs建立API Mic

    本文链接:https://www.haomeiwen.com/subject/rjgbqqtx.html