Skip to main content
0

มาทำ Microservice ด้วย NestJS ใครว่ายาก มาลองทำกันดูเลย

สารจากนักเขียน

สวัสดีครับทุกคนวันนี้ผมจะพาทุกคนมาลองเล่น Microservice ของ NestJS กัน อันดับแรกเราก็ต้องมีพื้นฐานความเข้าใจของ Microservice ก่อน และทุกคนสามารถเข้าไป อ่านเพิ่มเติมได้ที่นี่เลย Microservice 

เอาล่ะมาลงมือทำกันเลยโดยเราจะสร้าง Nest Project มา 3 ตัวและให้ชื่อว่า

  • Client เป็นตัวแทนของ App หลักที่จะคอยเรียก Service จาก Microservice ต่าง ๆ
  • String-service เป็นตัวแทนของ Microservice ตัวที่ 1
  • Math-service เป็นตัวแทนของ Microservice ตัวที่ 2

เรามาลง package เพิ่มเติมสำหรับทำ Nest Project ให้รองรับ Microservice กันครับ

โดยใช้คำสั่งด้านล่างลงในทุก Project

“`npm i –save @nestjs/microservices”`

หลังจากนั้นให้เราแก้ Code ใน main.ts ของ Microservice นะครับเพื่อตั้งค่าให้ Service เหล่านั้นทำตัวเป็น Microservice โดยใส่ code ตามผมได้เลย

import { NestFactory } from '@nestjs/core';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';

const logger = new Logger();
const PORT = 3001;

async function bootstrap() {
 const app = await NestFactory.createMicroservice(
   AppModule,
   {
     transport: Transport.TCP,
     options: { port: PORT },
   },
 );
 await app.listen();
 logger.log('Mocroservice run on port ' + PORT);
}
bootstrap();

โดย Code ด้านบนจะเป็นการตั้งค่า NestJS ให้เป็น Microservice ที่สามารถเรียกได้ผ่านโปรโตคอล TCP และเราก็ตั้งค่า PORT ที่ต้องการให้ Microservice นั้นเปิดเพื่อรอ Service อื่นเรียกเข้ามานะครับ โดยผมจะตั้งค่าให้เป็น 3001 และ 3002 นะครับและเมื่อเราสั่งรัน Microservice จะได้หน้าตาออกมาแบบนี้ครับ

ต่อไปเรามาทำตัว Service กัน

Project math-service file app.controller

import { Controller, Logger } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class AppController {
 private logger;
 constructor() {
   this.logger = new Logger('MathService');
 }

 @MessagePattern({ cmd: 'sum' })
 accumulate(data: number[]): number {
   const result = (data || []).reduce((a, b) => a + b);
   this.logger.log('accumulate has call result : ' + result);
   return result;
 }
}

Project string-service file app.controller

import { Controller, Logger } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class AppController {
 private logger;
 constructor() {
   this.logger = new Logger('StringService');
 }

 @MessagePattern({ cmd: 'join' })
 join(data: string[]): string {
   const result = (data || []).join('-');
   this.logger.log('join has call result : ' + result);
   return result;
 }
}

โดย Code ในส่วนนี้จะมีหน้าตาคล้าย ๆ กันโดยจะมี MessagePattern ที่คอยทำหน้าที่เหมือนกับ HTTP method ต่าง ๆ เลย และผมก็ได้ทำการเพิ่ม Log ลงไปด้วยเมื่อมีการเรียกใช้ Service

ต่อไปเราไปทำในส่วนของ Client กันต่อ


app.module.ts

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
import { AppService } from './app.service';


@Module({
 imports: [
   ClientsModule.register([
     {
       name: 'MATH_SERVICE',
       transport: Transport.TCP,
       options: { port: 3001 },
     },
     {
       name: 'STRING_SERVICE',
       transport: Transport.TCP,
       options: { port: 3002 },
     },
   ]),
 ],
 controllers: [AppController],
 providers: [AppService],
})
export class AppModule {}

ในส่วนนี้ก็จะเป็นการ Import ตัวของ Microservice ต่าง ๆ เข้ามาใน App Module

ต่อไปเราจะมาทำในส่วนของ Controller กันที่จะคอยเรียก Microservice ต่าง ๆ

app.controller.ts

import { Controller, Post, Inject, Body } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';

@Controller()
export class AppController {
 constructor(
   @Inject('MATH_SERVICE')
   private mathService: ClientProxy,
   @Inject('STRING_SERVICE')
   private stringService: ClientProxy,
 ) {}

 @Post('sum')
 sum(@Body() { data }): Observable {
   return this.mathService.send({ cmd: 'sum' }, data);
 }

 @Post('join')
 join(@Body() { data }): Observable {
   return this.stringService.send({ cmd: 'join' }, data);
 }
}

จาก Code จะมี Microservice 2 ตัวโดยแต่ละตัวจะมี Class เดียวกันนั่นก็คือ ClientProxy แต่จะแยกว่าเป็น Microservice ตัวไหนผ่าน @Inject(‘service-name’) ครับและ ใน Controller ก็มี Function ที่มี End-point /sum กับ /join ที่จะไปเรียก Service จาก Microservice ต่าง ๆ

โดย Function เราจะเรียก microservice.send<type>(message-pattern, data) โดยตัว Nest Microservice จะ return ค่ากลับมาเป็น Observable<type> ถ้าเราต้องการนำค่าไปใช้ต่อในรูปแบบของ Value ปกติก็สามารถ import lastValueFrom จาก ‘rxjs’ ใช้ได้เลยตามตัวอย่างด้านล่าง

 @Post('join')
 async join(@Body() { data }): Promise {
   const result = await this.stringService.send({ cmd: 'join' }, data);
   const final = await lastValueFrom(result);
   return final;
 }

ต่อมาเรามาดูผลกันเถอะ Call API ผ่าน Postman

/sum

/join

จากการลองยิง API เล่นดูก็จะเห็นได้ที่ Log ของ Microservice นั้นได้มีการ Log ว่า Function ในตัวเองนั่นมีการทำงานซึ่งผมก็ได้ Log Result ของ Function ไว้ด้วยแล้วก็จะเห็นได้ว่าผมมันตรงกับ Result ที่ Postman ได้มานั่นเองงงงงง 

และก็จบไปแล้วกับการลองทำ Microservice ด้วย NestJS หวังว่าจะเป็นแนวทางให้กับหลาย ๆ คนนะครับ

0

แนะนำสำหรับคุณ

คัดลอกลิงก์สำเร็จ
Close Menu

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า