Що таке мікросервіси в NestJS?
Що таке мікросервіси в NestJS
Мікросервіс у NestJS - це окремий застосунок (чи частина системи), який спілкується з іншими сервісами не по HTTP, а через транспортний рівень обміну повідомленнями (message broker).
Кожен мікросервіс:
- незалежний від інших;
- має своє сховище даних;
- виконує чітко обмежені функції (наприклад, Auth, Orders, Payments);
- спілкується через транспортні протоколи (TCP, Redis, RabbitMQ, Kafka, NATS та ін.).
Основна ідея
Замість прямих HTTP-запитів на кшталт:
Auth → Users → Orders → Paymentsмікросервіси NestJS взаємодіють через повідомлення (messages):
[Client] → (send message) → [Microservice]Кожен сервіс слухає певні патерни повідомлень (message patterns), і відповідає, не знаючи нічого про реалізацію інших сервісів.
Проста схема
┌───────────────────┐ ┌────────────────────┐
│ Auth Microservice │◀────▶│ Users Microservice │
└───────────────────┘ └────────────────────┘
▲ ▲
│ │
▼ ▼
[Gateway API] ⇄ [Message Broker]Усі сервіси пов'язані через брокер (наприклад, Redis, RabbitMQ чи Kafka). Якщо один з них "падає" - інші продовжують працювати.
Приклад мікросервісу в NestJS
Сервіс
// math.service.ts
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
@Controller()
export class MathController {
@MessagePattern({ cmd: 'sum' })
accumulate(data: number[]): number {
return (data || []).reduce((a, b) => a + b);
}
}Модуль
import { Module } from '@nestjs/common';
import { MathController } from './math.controller';
@Module({
controllers: [MathController],
})
export class MathModule {}Bootstrap мікросервісу
import { NestFactory } from '@nestjs/core';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
import { MathModule } from './math.module';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
MathModule,
{
transport: Transport.TCP, // можна обрати RabbitMQ, Kafka, Redis тощо
options: { port: 4001 },
},
);
await app.listen();
}
bootstrap();Клієнт (викликає мікросервіс)
import { Controller, Get, Inject } from '@nestjs/common';
import { ClientProxy, ClientProxyFactory, Transport } from '@nestjs/microservices';
@Controller()
export class AppController {
private client: ClientProxy;
constructor() {
this.client = ClientProxyFactory.create({
transport: Transport.TCP,
options: { port: 4001 },
});
}
@Get()
async getSum() {
const result = await this.client.send({ cmd: 'sum' }, [1, 2, 3]).toPromise();
return { result }; // { result: 6 }
}
}Тут client.send() надсилає повідомлення { cmd: 'sum' },
а мікросервіс слухає його через @MessagePattern({ cmd: 'sum' }).
Транспортні протоколи (Transport layers)
NestJS підтримує різні механізми зв'язку між мікросервісами:
| Транспорт | Призначення |
|---|---|
| TCP | Простий спосіб зв'язку сервісів у межах мережі |
| Redis | Швидкий брокер повідомлень із pub/sub |
| NATS | Легкий, високопродуктивний message broker |
| RabbitMQ | Черги повідомлень, підтвердження, маршрутизація |
| Kafka | Потокова передача даних (streaming) |
| MQTT | IoT, легковагові пристрої |
| gRPC | Високопродуктивний RPC-зв'язок (protobuf) |
Принципи мікросервісів у NestJS
| Принцип | Опис |
|---|---|
| Ізоляція | Кожен сервіс автономний (має свій код, БД, конфігурацію) |
| Взаємодія через повідомлення | Асинхронна комунікація замість HTTP |
| Стійкість | Відмова одного сервісу не ламає всю систему |
| Масштабування | Можна масштабувати конкретний мікросервіс незалежно |
| Чітка відповідальність | Кожен мікросервіс виконує обмежену бізнес-функцію |
Шаблон взаємодії
Запит-відповідь (send / @MessagePattern)
Клієнт надсилає запит і очікує відповідь.
client.send({ cmd: 'sum' }, [1, 2, 3])Подієва модель (emit / @EventPattern)
Клієнт просто надсилає подію, без очікування відповіді.
client.emit('user_created', { id: 1, name: 'John' })@EventPattern('user_created')
handleUserCreated(data: any) {
console.log('Новий користувач:', data);
}Коли використовувати мікросервіси
Підходять, якщо:
- проєкт великий і з різними бізнес-доменами;
- потрібна висока масштабованість;
- важливо незалежно розгортати сервіси;
- ти хочеш використовувати різні технології в різних сервісах;
- система має стійко працювати при збоях окремих компонентів.
Не підходять, якщо:
- проєкт невеликий чи моноліт простіше підтримувати;
- висока складність мережі не виправдана;
- команда невелика й не потребує розділення доменів.
Приклад архітектури
┌─────────────┐ ┌─────────────┐
│ API Gateway │──────▶│ Auth Service│
│ (HTTP) │ │ (JWT/Auth) │
└─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Orders Svc │◀────▶│ Payments Svc│
└─────────────┘ └─────────────┘Усі вони спілкуються через брокер повідомлень, а не напряму.
Підсумок
| Поняття | Опис |
|---|---|
| Мікросервіси в NestJS | Незалежні частини застосунку, що спілкуються через повідомлення |
| Основний інтерфейс | @MessagePattern() / @EventPattern() |
| Транспортні шари | TCP, Redis, RabbitMQ, Kafka, NATS, MQTT, gRPC |
| Головні переваги | Масштабованість, відмовостійкість, ізоляція |
| Основний принцип | Асинхронна комунікація й слабка зв'язаність |
| Ключові класи | ClientProxy, ClientProxyFactory, MicroserviceOptions |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.