等等....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
使用docker來準備這兩個Server最快
docker ps
先安裝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 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