Что такое микросервисная архитектура

Ответ

Микросервисная архитектура — это подход к созданию приложения как набора небольших, независимо развертываемых сервисов. Каждый сервис отвечает за конкретную бизнес-функцию и взаимодействует с другими по сети через четко определенные API. Этот подход является альтернативой монолитной архитектуре, где все компоненты приложения тесно связаны и развертываются как единое целое.

Ключевые принципы:

  • Автономность: Каждый сервис может быть разработан, развернут и масштабирован независимо от других.
  • Специализация: Сервис решает одну бизнес-задачу (например, управление пользователями, обработка платежей).
  • Технологическая гетерогенность: Команды могут выбирать наиболее подходящий стек технологий для своего сервиса.
  • Децентрализованное управление данными: Каждый сервис, как правило, владеет своей базой данных.

Упрощенный пример взаимодействия:

Представим два сервиса: users-service и orders-service. Сервис заказов для получения полной информации обращается к сервису пользователей.

# users-service.py (запущен на порту 5001)
from flask import Flask, jsonify

app = Flask(__name__)
users_db = {"1": {"name": "Alice", "email": "alice@example.com"}}

@app.route("/users/<user_id>")
def get_user(user_id):
    return jsonify(users_db.get(user_id, {}))

# app.run(port=5001)
# orders-service.py (запущен на порту 5002)
import requests
from flask import Flask, jsonify

app = Flask(__name__)
orders_db = {"101": {"user_id": "1", "item": "Laptop"}}

@app.route("/orders/<order_id>")
def get_order_details(order_id):
    order = orders_db.get(order_id)
    if not order:
        return "Not Found", 404

    # Сетевой вызов к другому сервису
    user_response = requests.get(f"http://users-service:5001/users/{order['user_id']}")
    order['user_info'] = user_response.json()

    return jsonify(order)

# app.run(port=5002)

Преимущества:

  • Масштабируемость: Можно масштабировать только те сервисы, которые испытывают высокую нагрузку.
  • Надежность: Сбой одного сервиса не приводит к отказу всей системы (при правильном проектировании).
  • Гибкость в разработке: Небольшие команды могут работать над своими сервисами параллельно.

Недостатки:

  • Операционная сложность: Требуется управлять развертыванием, мониторингом и связностью множества сервисов.
  • Сетевые задержки: Взаимодействие по сети медленнее, чем вызовы внутри монолита.
  • Распределенные транзакции: Обеспечение консистентности данных между сервисами — сложная задача.