
<사진 출처 : Moleculer 공식 홈페이지>
마이크로서비스에서는 각 서비스간의 통신이 중요한데 이러한 통신적인 부분들을
Moleculer 프레임워크에서 처리해 주므로, 개발자는 주요한 비즈니스 로직에만 집중
을 하면 되기 때문
moleculer.config 파일을 이용하여 브로커 옵션을 설정할 수 있다.
namespace : 동일한 네트워크에서 노드를 분할하기 위한 노드의 네임스페이스nodeId : 고유한 노드 식별자logger : 로커 클래스logLevel : 로거의 로그 수준transporter : 트랜스 포터 구성requestTimeout : 오류가 있는 요청을 거부하기 전에 대기하는 시간https://moleculer.services/docs/0.14/configuration.html
예시 코드
export default class UsersService extends Service{
constructor(broker: ServiceBroker) {
super(broker);
this.parseServiceSchema({
name: serviceConfig.user.serviceName, //서비스명 정의
});
}
}
호출 예시
await this.broker.call("서비스명.액션명");
예시 코드
export default class UsersService extends Service{
constructor(broker: ServiceBroker) {
super(broker);
this.parseServiceSchema({
name: serviceConfig.user.serviceName,
version: "v1",
});
}
}
호출 예시
await this.broker.call("버전명.서비스명.액션명");
예시 코드
export default class UsersService extends Service{
constructor(broker: ServiceBroker) {
super(broker);
this.parseServiceSchema({
name: serviceConfig.user.serviceName,
settings : {
host : String(process.env.DATABASE_HOST),
db_port : Number(process.env.DATABASE_PORT),
},
});
}
}
사용시
adatper : new SqlAdapter({
dialect: "mariadb",
host: this.settings.host,
port: this.settings.db_port
})
또는 [ctx.call](http://ctx.call)()` 메서드로 호출할 수 있다.예시 코드
actions:{
get:{
rest : "GET /test/:message",
params: {
message : "string | max: 10",
},
async handler(ctx:Context) : Promise<void>{
// 비즈니스 로직 정의
}
}
}
컨테이너 환경에서 같은 이벤트를 가진 동일한 서비스가 존재하더라도 하나의 서비스만 Broker가 자체적으로 선택하여 이벤트를 호출한다.
broker.emit()을 통해 이벤트를 호출할 수 있다.broker.boadcast() 를 통해 모든 서비스의 이벤트를 호출할 수 있다.예시 코드
events: {
// Subscribe to "user.created" event
"user.created"(ctx) {
this.logger.info("User created:", ctx.params);
// Do something
},
},
예시코드
{
name: "mailer",
actions: {
send(ctx) {
// Call the `sendMail` method
return this.sendMail(ctx.params.recipients, ctx.params.subject, ctx.params.body);
}
},
methods: {
// Send an email to recipients
sendMail(recipients, subject, body) {
return new Promise((resolve, reject) => {
...
});
}
}
};
created
started
stopped
예시 코드
export default class AuthService extends Service {
constructor(broker:ServiceBroker){
super(broker);
this.parseServiceSchema({
name: serviceConfig.auth.serviceName,
actions,
methods,
dependencies: ["users"], // users 서비스가 시작되고 Auth 서비스 시작
created : authServiceCreated,
started : authServiceStarted,
stopped : authServiceStopped,
});
}
}
지원하는 Transporter
또한 Moleculer는 Registry & Discovery 및 캐싱 등 여러가지 msa 서비스를 구성하기 위한 기능들을 제공한다.
참고 실행 스크립트(각각의 다른 프로세스로 실행)
"dev_gateway": "ts-node ./node_modules/moleculer/bin/moleculer-runner.js -E env/local/gateway.service.local.env --config services/gateway/moleculer.gateway.config.ts --hot --repl services/gateway/gateway.service.ts",
"dev_auth": "ts-node ./node_modules/moleculer/bin/moleculer-runner.js -E env/local/auth.service.local.env --config services/auth/moleculer.auth.config.ts --hot --repl services/auth/*.service.ts",
"dev_io": "ts-node ./node_modules/moleculer/bin/moleculer-runner.js -E env/local/io.service.local.env --config services/io/moleculer.io.config.ts --hot --repl services/io/*.service.ts",