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