Skip to main content

Що таке мікросервіси в NestJS?

Що таке мікросервіси в NestJS

Мікросервіс у NestJS - це окремий застосунок (чи частина системи), який спілкується з іншими сервісами не по HTTP, а через транспортний рівень обміну повідомленнями (message broker).

Кожен мікросервіс:

  • незалежний від інших;
  • має своє сховище даних;
  • виконує чітко обмежені функції (наприклад, Auth, Orders, Payments);
  • спілкується через транспортні протоколи (TCP, Redis, RabbitMQ, Kafka, NATS та ін.).

Основна ідея

Замість прямих HTTP-запитів на кшталт:

javascript
Auth → Users → Orders → Payments

мікросервіси NestJS взаємодіють через повідомлення (messages):

javascript
[Client] → (send message) → [Microservice]

Кожен сервіс слухає певні патерни повідомлень (message patterns), і відповідає, не знаючи нічого про реалізацію інших сервісів.

Проста схема

javascript
┌───────────────────┐ ┌────────────────────┐ │ Auth Microservice │◀────▶│ Users Microservice │ └───────────────────┘ └────────────────────┘ ▲ ▲ │ │ ▼ ▼ [Gateway API] ⇄ [Message Broker]

Усі сервіси пов'язані через брокер (наприклад, Redis, RabbitMQ чи Kafka). Якщо один з них "падає" - інші продовжують працювати.

Приклад мікросервісу в NestJS

Сервіс

javascript
// 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); } }

Модуль

javascript
import { Module } from '@nestjs/common'; import { MathController } from './math.controller'; @Module({ controllers: [MathController], }) export class MathModule {}

Bootstrap мікросервісу

javascript
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();

Клієнт (викликає мікросервіс)

javascript
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)
MQTTIoT, легковагові пристрої
gRPCВисокопродуктивний RPC-зв'язок (protobuf)

Принципи мікросервісів у NestJS

ПринципОпис
ІзоляціяКожен сервіс автономний (має свій код, БД, конфігурацію)
Взаємодія через повідомленняАсинхронна комунікація замість HTTP
СтійкістьВідмова одного сервісу не ламає всю систему
МасштабуванняМожна масштабувати конкретний мікросервіс незалежно
Чітка відповідальністьКожен мікросервіс виконує обмежену бізнес-функцію

Шаблон взаємодії

Запит-відповідь (send / @MessagePattern)

Клієнт надсилає запит і очікує відповідь.

javascript
client.send({ cmd: 'sum' }, [1, 2, 3])

Подієва модель (emit / @EventPattern)

Клієнт просто надсилає подію, без очікування відповіді.

javascript
client.emit('user_created', { id: 1, name: 'John' })
javascript
@EventPattern('user_created') handleUserCreated(data: any) { console.log('Новий користувач:', data); }

Коли використовувати мікросервіси

Підходять, якщо:

  • проєкт великий і з різними бізнес-доменами;
  • потрібна висока масштабованість;
  • важливо незалежно розгортати сервіси;
  • ти хочеш використовувати різні технології в різних сервісах;
  • система має стійко працювати при збоях окремих компонентів.

Не підходять, якщо:

  • проєкт невеликий чи моноліт простіше підтримувати;
  • висока складність мережі не виправдана;
  • команда невелика й не потребує розділення доменів.

Приклад архітектури

javascript
┌─────────────┐ ┌─────────────┐ │ API Gateway │──────▶│ Auth Service│ │ (HTTP) │ │ (JWT/Auth) │ └─────────────┘ └─────────────┘ │ │ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ Orders Svc │◀────▶│ Payments Svc│ └─────────────┘ └─────────────┘

Усі вони спілкуються через брокер повідомлень, а не напряму.

Підсумок

ПоняттяОпис
Мікросервіси в NestJSНезалежні частини застосунку, що спілкуються через повідомлення
Основний інтерфейс@MessagePattern() / @EventPattern()
Транспортні шариTCP, Redis, RabbitMQ, Kafka, NATS, MQTT, gRPC
Головні перевагиМасштабованість, відмовостійкість, ізоляція
Основний принципАсинхронна комунікація й слабка зв'язаність
Ключові класиClientProxy, ClientProxyFactory, MicroserviceOptions

Коротка відповідь

Для співбесіди
Premium

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