这节内容参考官网-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部分
tuiguang.png推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
网友评论