Service-Oriented Architecture
Архитектура, ориентированная на сервисы
SOA — архитектурный подход, при котором приложение строится из независимых сервисов, взаимодействующих через стандартные протоколы (SOAP, REST).
| Критерий | SOA | Microservices |
|---|---|---|
| Размер сервисов | Крупные | Мелкие |
| Коммуникация | SOAP, ESB | REST, gRPC, Events |
| Данные | Общая БД | БД на сервис |
| Развертывание | Централизованное | Независимое |
| Когда появился | 2000-е | 2010-е |
# User Service
class UserService:
def get_user(self, user_id: int) -> User:
# Логика получения пользователя
return user
def create_user(self, user_data: dict) -> User:
# Логика создания пользователя
return user
# Expose через SOAP или REST
@app.route("/users/")
def get_user(user_id):
service = UserService()
user = service.get_user(user_id)
return jsonify(user.to_dict())
Service A → ESB → Service B Service C → ESB → Service D Service E → ESB → Service F ESB обеспечивает: - Маршрутизацию - Трансформацию данных - Мониторинг - Безопасность
💡 ESB — централизованная шина для коммуникации сервисов
# Service Registry хранит информацию о сервисах
service_registry = {
"user_service": {
"url": "http://user-service:8001",
"version": "1.0",
"endpoints": ["/users", "/users/{id}"]
},
"order_service": {
"url": "http://order-service:8002",
"version": "1.0",
"endpoints": ["/orders", "/orders/{id}"]
}
}
# Клиент находит сервис через registry
def get_service_url(service_name):
return service_registry[service_name]["url"]
user
pass
123
💡 SOAP — XML-based протокол с строгой структурой
GET /users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer token123
Response:
{
"id": 123,
"name": "Alice",
"email": "alice@example.com"
}
💡 REST — простой HTTP-based протокол
| Критерий | SOAP | REST |
|---|---|---|
| Формат | XML | JSON, XML |
| Протокол | HTTP, SMTP | HTTP |
| Сложность | Высокая | Низкая |
| Безопасность | WS-Security | HTTPS, OAuth |
| Использование | Корпоративные системы | Веб-API, мобильные приложения |
Client → Service Gateway → [Service1, Service2, Service3] Gateway обеспечивает: - Единая точка входа - Аутентификация - Маршрутизация - Rate limiting - Кэширование
# Composite Service объединяет несколько сервисов
class OrderService:
def __init__(self, user_service, payment_service, inventory_service):
self.user_service = user_service
self.payment_service = payment_service
self.inventory_service = inventory_service
def create_order(self, order_data):
# 1. Проверяем пользователя
user = self.user_service.get_user(order_data.user_id)
# 2. Проверяем наличие товара
inventory = self.inventory_service.check_availability(order_data.items)
# 3. Обрабатываем платеж
payment = self.payment_service.process_payment(order_data.payment)
# 4. Создаём заказ
order = Order.create(order_data)
return order
# Facade предоставляет упрощённый интерфейс
class UserFacade:
def __init__(self, user_service, profile_service, preferences_service):
self.user_service = user_service
self.profile_service = profile_service
self.preferences_service = preferences_service
def get_user_complete(self, user_id):
# Объединяем данные из нескольких сервисов
user = self.user_service.get_user(user_id)
profile = self.profile_service.get_profile(user_id)
preferences = self.preferences_service.get_preferences(user_id)
return {
"user": user,
"profile": profile,
"preferences": preferences
}
SOA был популярен в 2000-х, но сегодня его место заняли:
💡 SOA всё ещё используется в крупных корпоративных системах, но для новых проектов лучше использовать Microservices.
"SOA — это предшественник Microservices.
Многие принципы SOA актуальны и сегодня, но реализация стала проще."