Як працюють мікросервіси в NestJS?
NestJS Мікросервіси
NestJS надає потужний модуль мікросервісів, який підтримує кілька транспортних шарів для міжсервісної комунікації, окрім HTTP.
Транспортні Шари
| Транспорт | Пакет | Випадок використання |
|---|---|---|
| TCP | Вбудований | Простий мікросервіс |
| Redis | @nestjs/microservices | Pub/Sub, події |
| NATS | @nestjs/microservices | Високопродуктивне повідомлення |
| RabbitMQ | @nestjs/microservices | Складна маршрутизація, надійність |
| Kafka | @nestjs/microservices | Потокове оброблення подій, висока пропускна здатність |
| gRPC | @nestjs/microservices | Типобезпечний, високопродуктивний |
Створення Мікросервісу (TCP)
Сервіс (Мікросервіс)
typescript
// math-service/main.ts
import { NestFactory } from '@nestjs/core';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.TCP,
options: { host: '0.0.0.0', port: 3001 },
},
);
await app.listen();
}
bootstrap();Контролер з Шаблонами Повідомлень
typescript
import { Controller } from '@nestjs/common';
import { MessagePattern, EventPattern, Payload } from '@nestjs/microservices';
@Controller()
export class MathController {
// Шаблон Запит-Відповідь
@MessagePattern({ cmd: 'sum' })
sum(@Payload() data: { numbers: number[] }): number {
return data.numbers.reduce((a, b) => a + b, 0);
}
// Шаблон на основі подій (виклик і забути)
@EventPattern('order_created')
handleOrderCreated(@Payload() data: { orderId: string }) {
console.log('Обробка замовлення:', data.orderId);
}
}Клієнт (API Шлюз)
typescript
// api-gateway/app.module.ts
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
@Module({
imports: [
ClientsModule.register([
{
name: 'MATH_SERVICE',
transport: Transport.TCP,
options: { host: 'math-service', port: 3001 },
},
]),
],
})
export class AppModule {}typescript
import { Controller, Get, Inject } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
@Controller('math')
export class MathController {
constructor(
@Inject('MATH_SERVICE') private readonly mathClient: ClientProxy,
) {}
@Get('sum')
async getSum() {
// Запит-Відповідь
const result = await this.mathClient
.send({ cmd: 'sum' }, { numbers: [1, 2, 3, 4, 5] })
.toPromise();
return { result };
}
@Post('order')
async createOrder() {
// Подія (виклик і забути)
this.mathClient.emit('order_created', { orderId: 'abc123' });
return { status: 'надіслано' };
}
}Використання Транспорту Redis
typescript
// Сервіс
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
},
});
// Клієнт
ClientsModule.register([{
name: 'NOTIFICATIONS_SERVICE',
transport: Transport.REDIS,
options: { host: 'localhost', port: 6379 },
}]);Гібридний Додаток (HTTP + Мікросервіс)
typescript
const app = await NestFactory.create(AppModule);
// Підключення мікросервісного транспорту разом з HTTP
app.connectMicroservice({
transport: Transport.REDIS,
options: { host: 'localhost', port: 6379 },
});
await app.startAllMicroservices();
await app.listen(3000);Шаблони Комунікації
| Шаблон | Метод | Опис |
|---|---|---|
| Запит-Відповідь | @MessagePattern() / client.send() | Надіслати та чекати на відповідь |
| На основі подій | @EventPattern() / client.emit() | Виклик і забути |
Приклад Архітектури
┌─────────────────┐
│ API Шлюз │
│ (HTTP + REST) │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────────▼───┐ ┌──────▼──────┐ ┌───▼─────────┐
│ Сервіс Користувача │ │Сервіс Замовлень│ │Сервіс Сповіщень │
│ (TCP) │ │ (RabbitMQ) │ │ (Redis) │
└─────────────┘ └─────────────┘ └──────────────┘Порада: Почніть з моноліту, використовуючи модулі NestJS. Витягайте в мікросервіси лише тоді, коли вам потрібно незалежне масштабування, розгортання або межі команд. NestJS робить цей перехід плавним завдяки своїй модульній архітектурі.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.