Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке мікросервіси в NestJS?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Мікросервіс у NestJS - окремий застосунок, що спілкується з іншими сервісами не по HTTP, а через транспортний рівень обміну повідомленнями (TCP, Redis, RabbitMQ, Kafka, NATS, gRPC тощо); слухає патерни повідомлень через `@MessagePattern()`/`@EventPattern()` і не знає нічого про реалізацію інших сервісів. **Ключове:** мікросервіси підходять для великих проєктів з різними бізнес-доменами, де потрібні незалежне масштабування й розгортання та стійкість до збоїв окремих компонентів; для невеликих проєктів простіше підтримувати монoліт.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке мікросервіси в 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) | | MQTT | IoT, легковагові пристрої | | 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` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.