Episode ini membahas arsitektur microservices di NestJS: konsep dasar microservices, transport layer TCP Redis NATS RabbitMQ dan Kafka, gateway patterns dan API composition, serta autentikasi antar service dan validasi message.

Saat aplikasi tumbuh, membangun satu monolit besar menjadi sulit dirawat. Microservices memecah aplikasi menjadi service-service kecil yang berkomunikasi lewat jaringan. NestJS memiliki dukungan microservices yang matang sejak awal.
Episode 14 membahas arsitektur microservices NestJS: konsep, transport layer, gateway, dan aspek keamanan antar service.
Microservices memisahkan aplikasi menjadi beberapa service independen — misalnya user-service, order-service, dan payment-service. Setiap service punya database sendiri dan berkomunikasi lewat network. NestJS mendukung pola ini lewat module @nestjs/microservices.
Service microservices NestJS berkomunikasi dengan dua pola:
import { Controller } from "@nestjs/common";
import { MessagePattern, Payload } from "@nestjs/microservices";
@Controller()
export class UserController {
@MessagePattern("user.find")
find(@Payload() data: { id: number }): string {
return `User dengan id ${data.id}`;
}
}@MessagePattern("user.find") mendaftarkan handler yang merespons message bernama user.find.
NestJS mendukung beberapa transport layer untuk komunikasi antar service:
Bootstrap service dengan transport yang dipilih:
import { NestFactory } from "@nestjs/core";
import { MicroserviceOptions, Transport } from "@nestjs/microservices";
import { UserModule } from "./user.module";
async function bootstrap(): Promise<void> {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
UserModule,
{
transport: Transport.TCP,
options: { host: "0.0.0.0", port: 3001 },
},
);
await app.listen();
}
void bootstrap();Service ini mendengarkan koneksi TCP di port 3001.
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
UserModule,
{
transport: Transport.REDIS,
options: { host: "localhost", port: 6379 },
},
);Dengan Redis, message dikirim lewat channel pub-sub. Opsi lain seperti NATS, RabbitMQ, dan Kafka memakai konfigurasi yang serupa dengan opsi masing-masing.
Gateway adalah pintu masuk tunggal yang meneruskan request ke service yang tepat:
import { Controller, Get, Inject } from "@nestjs/common";
import { ClientProxy } from "@nestjs/microservices";
@Controller("users")
export class GatewayController {
constructor(
@Inject("USER_SERVICE") private readonly userClient: ClientProxy,
) {}
@Get(":id")
find(@Param("id") id: number): Promise<unknown> {
return this.userClient.send("user.find", { id }).toPromise();
}
}Gateway menerima request HTTP lalu meneruskan sebagai message ke service. Ini disebut API composition — gateway mengoordinasikan beberapa service untuk satu respons.
Untuk memakai ClientProxy, daftarkan klien di module:
import { Module } from "@nestjs/common";
import { ClientsModule, Transport } from "@nestjs/microservices";
@Module({
imports: [
ClientsModule.register([
{
name: "USER_SERVICE",
transport: Transport.TCP,
options: { port: 3001 },
},
]),
],
})
export class GatewayModule {}Ketika service berkomunikasi, pastikan keduanya saling terpercaya. Pola umum: kirim token service (bukan token user) atau gunakan mTLS. NestJS memungkinkan memakai interceptor untuk menambahkan token sebelum mengirim message:
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common";
import { Observable } from "rxjs";
@Injectable()
export class ServiceAuthInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
const request = context.switchToHttp().getRequest();
request.headers["x-service-token"] = process.env.SERVICE_TOKEN;
return next.handle();
}
}Sama seperti HTTP, message antar service harus divalidasi. Gunakan ValidationPipe pada handler microservices dan DTO untuk payload message. Ini mencegah data rusak atau berbahaya mengalir antar service.
Episode 14 membuka dunia microservices NestJS: konsep message dan event pattern, transport layer, gateway, serta autentikasi dan validasi antar service.
Inti yang harus dibawa pulang:
@MessagePattern mendaftarkan handler untuk request-response.ClientProxy.Di episode 15 selanjutnya kita akan membahas GraphQL dan API integration — dasar GraphQL dengan @nestjs/graphql, pendekatan schema-first dan code-first, resolver, input types, subscriptions, serta optimasi performa GraphQL.