Skip to main content
Практика завдань

Як працюють мікросервіси в NestJS?

NestJS Мікросервіси

NestJS надає потужний модуль мікросервісів, який підтримує кілька транспортних шарів для міжсервісної комунікації, окрім HTTP.


Транспортні Шари

ТранспортПакетВипадок використання
TCPВбудованийПростий мікросервіс
Redis@nestjs/microservicesPub/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

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань