이 글은 어떻게든 Molecular 로 사용해보기 위해 적용해본 코드 및 정의이므로 정답이 아닐 수 있습니다.
Molecular는 Node.js를 위한 빠르고 강력한 MSA 프레임워크이다. 효율적이고 안정저깅며 확장 가능한 서비스를 구축하는데 도움이 된다고 공식문서에 나와있다.
Moleculer is a fast, modern and powerful microservices framework for Node.js. It helps you to build efficient, reliable & scalable services. Moleculer provides many features for building and managing your microservices.
해당 라이브러리를 사용하면 ServiceBroker라는 개념이 등장하는데 이는 Moleculer의 주요 구성요소이다. 서비스를 처리하고, 작업을 호출하고, 이벤트를 내보내고, 원격 노드들과 통신한다. 그러므로 ServiceBroker 인스턴스를 생성해야한다.
The ServiceBroker is the main component of Moleculer. It handles services, calls actions, emits events and communicates with remote nodes. You must create a ServiceBroker instance on every node.
기본적으로 Express 환경에서도 사용이 가능하다. Node.js 기반이기 때문에 더더욱 Nest.js에서도 당연히 사용가능하기에 바로 사용 해봤다.
기본세팅
Nest.js (:3000) , Nest.js (:3030) 으로 두개의 프로세스가 존재하고, 통신은 Redis를 통해 사용한다. 다른걸 사용해도 무방하다.
import { Injectable } from '@nestjs/common';
import { ServiceBroker } from 'moleculer';
@Injectable()
export class NoticeService {
private borker: ServiceBroker;
constructor() {
this.borker = new ServiceBroker({
nodeID: "service-a",
transporter: "redis://localhost:6379"
});
this.borker.createService({
name: "user",
actions: {
getUser(ctx) {
return { id: ctx.params.id, name: '몰레칼라'};
}
}
})
this.borker.start();
}
}
해당 코드 분석
this.broker = new ServiceBroker({
nodeID: "service-a",
transporter: "redis://localhost:6379"
});
ServiceBroker인스턴스를 생성하는 코드이다. nodeID는 서비스 인스턴스의 고유 식별자이다.
transporter는 서비스 간의 메시지를 전달하는데 사용되는 브로커?를 지정한다. 나는 여기서 레디스를 사용했다.
레디스를 사용하여 서비스 인스턴스들 간의 통신을 가능하게 한다. 이 설정은 모든 서비스 인스턴스들이 같은 Redis 인스턴스를 통해 서로 통신할 수 있도록 한다.
this.broker.createService({
name: "user",
actions: {
getUser(ctx) {
return { id: ctx.params.id, name: '몰레칼라'};
}
}
})
createService 메서드를 사용하여 새로운 서비스를 정의하고 생성한다.
name 은 서비스 이름을 지정하는 것이다.
actions는 서비스에서 제공하는 액션들을 정의한다. getUser가 호출되면 return 하는 값이 반환됨
마지막 this.broker.start();
는 ServiceBroker를 시작한다 이는 서비스가 준비되었으며 다른 서비스들과 통신할 준비가 되었음을 의미한다. 이 단계에서 서비스는 Redis를 사용하여 Moleculer 네트워크에 연결되며 다른 서비스 인스턴스들과 통신을 시작할 수 있게 된다.
호출하는 쪽
import { Injectable } from '@nestjs/common';
import { ServiceBroker } from 'moleculer';
@Injectable()
export class AppService {
private broker: ServiceBroker;
constructor(){
this.broker = new ServiceBroker({
nodeID: "service-c123",
transporter: "redis://localhost:6379"
})
}
async brokerCall(){
this.broker.start()
.then(() => this.broker.call('user.getUser', {id:'1'}))
.then((user) => console.log(user))
.catch(err => console.error(err));
}
}
this.broker.start()
.then(() => this.broker.call('user.getUser', {id:'1'}))
.then((user) => console.log(user))
.catch(err => console.error(err));
해당 코드가 Moleculer 서비스를 호출하는 기능을 수행한다. this.broker.start()를 통해 서비스 브로커를 시작한다.
그러고 call을 통해 user 서비스에 getUser 액션을 호출한다.(위에 createService 에 정의되어있음) 여기서 {id: '1'} 은 getUser 액션에 전달되는 파라미터이다.
// this.broker.start()는 한번만 실행할 수 있도록 생성자에 빼는게 맞음 - 귀찮아서 그냥 여기넣음
레디스를 사용했기 때문에 레디스(ioredis) 라이브러리가 install 되어있어야한다. 그리고 Injectable() 데코레이터 덕분에 Nest.js가 실행될떄 바로 broker도 실행된다.
0 createService 로 액션을 정의한 프로세스 로그
[2023-12-18T13:30:19.125Z] INFO service-a/TRANSPORTER: Redis-sub client is connected.
ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.
[2023-12-18T13:30:19.125Z] INFO service-a/TRANSPORTER: Setting Redis transporter
[2023-12-18T13:30:19.128Z] INFO service-a/TRANSPORTER: Redis-pub client is connected.
[2023-12-18T13:30:19.132Z] INFO service-a/REGISTRY: Node 'service-c123' connected.
[2023-12-18T13:30:19.641Z] INFO service-a/REGISTRY: '$node' service is registered.
[2023-12-18T13:30:19.641Z] INFO service-a/REGISTRY: 'user' service is registered.
[2023-12-18T13:30:19.641Z] INFO service-a/$NODE: Service '$node' started.
[2023-12-18T13:30:19.641Z] INFO service-a/USER: Service 'user' started.
call 해서 액션의 값을 리턴받은 프로세스 로그
[2023-12-18T13:30:20.645Z] INFO service-c123/REGISTRY: Node 'service-a' reconnected.
[2023-12-18T13:32:16.510Z] INFO service-c123/TRANSIT: Connecting to the transporter...
ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.
[2023-12-18T13:32:16.510Z] INFO service-c123/TRANSPORTER: Setting Redis transporter
[2023-12-18T13:32:16.512Z] INFO service-c123/TRANSPORTER: Redis-sub client is connected.
ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.
[2023-12-18T13:32:16.512Z] INFO service-c123/TRANSPORTER: Setting Redis transporter
[2023-12-18T13:32:16.514Z] INFO service-c123/TRANSPORTER: Redis-pub client is connected.
[2023-12-18T13:32:17.015Z] INFO service-c123/$NODE: Service '$node' started.
[2023-12-18T13:32:17.016Z] INFO service-c123/BROKER: ✔ ServiceBroker with 1 service(s) started successfully in 506ms.
{ id: '1', name: '몰레칼라' }
값을 제대로 리턴받은 걸 볼 수 있다.
'Nest.js' 카테고리의 다른 글
Nest.js - onModuleInit, onModuleDestroy 서버 실행과 종료시 실행되는 로직 구현 (0) | 2024.04.17 |
---|---|
Jest - Cannot find module (0) | 2024.03.17 |
Nest.js - TypeORM 설정 (0) | 2023.11.26 |
Nest.js - Interceptor 로 로그 및 응답 데이터 변형하기 (1) | 2023.11.26 |