今天內容參考官網-Microservice Basics
nestjs的feature之一是提供microservice wrapper,提供API可以容易整合,以下是它支援的服務
在nestjs中不同microservice間透過Message傳遞資料,但目前還不支援stream-based服務如kafka
今天以TCP作為例子,情境是把迄今為止做的User包成一Account Microservice,透過建立另外一個api gateway透過TCP request取得users資料
先建立一個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
// api-gateway/src/main.ts
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();
要存取Account Microservice,要先連線,然後再send message
nestjs寫好@Client這個Decorator處理連線,我們只要會使用ClientProxy的API send message就可以了
send需要兩個引數
修改app.controller.ts
// api-gateway/src/app.controller.ts
@Controller()
export class AppController {
// 指定通訊為TPC,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,改為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
啟動api-gateway
使用postman測試api-gateway
得到users
明天繼續redis部分