Ответ
Способы взаимодействия между микросервисами делятся на две большие категории: синхронные и асинхронные.
1. Синхронное взаимодействие (запрос-ответ)
Сервис-клиент отправляет запрос и блокируется в ожидании ответа от другого сервиса. Подходит для операций, требующих немедленного результата.
-
REST/HTTP: Самый популярный подход. Использует стандартные HTTP-методы (GET, POST, PUT, DELETE) и форматы данных (чаще всего JSON).
- Плюсы: Простота, человекочитаемость, огромная экосистема.
- Минусы: Относительно медленный (текстовый формат, HTTP-оверхед).
// Сервис A запрашивает данные у сервиса B resp, err := http.Get("http://inventory-service/api/items/123")
-
gRPC: Современный фреймворк от Google. Использует бинарный протокол Protocol Buffers (Protobuf) поверх HTTP/2.
- Плюсы: Высокая производительность, строгая типизация контрактов (.proto файлы), поддержка стриминга.
- Минусы: Бинарный формат сложнее отлаживать, требует кодогенерации.
// Сервис A вызывает RPC-метод у сервиса B conn, _ := grpc.Dial("order-service:50051", grpc.WithInsecure()) client := pb.NewOrderServiceClient(conn) response, _ := client.CreateOrder(ctx, &pb.CreateOrderRequest{...})
2. Асинхронное взаимодействие (на основе событий)
Сервис-отправитель публикует сообщение (событие) и не ждет ответа. Другие сервисы подписываются на эти сообщения и реагируют на них. Это обеспечивает слабую связанность (loose coupling) и повышает отказоустойчивость системы.
- Брокеры сообщений (Message Brokers): Системы вроде Kafka, RabbitMQ, NATS выступают посредниками.
- Плюсы: Декаплинг сервисов (отправителю не нужно знать о получателях), буферизация нагрузки, гарантии доставки.
- Минусы: Усложнение архитектуры (нужно поддерживать брокер), сложность отслеживания цепочки вызовов.
// Сервис заказов публикует событие 'order_created' в RabbitMQ ch.Publish( "orders_exchange", // exchange "order.created", // routing key false, // mandatory false, // immediate amqp.Publishing{ ContentType: "application/json", Body: []byte(orderJSON), })
Важные аспекты
- Service Discovery: Как сервис A узнает сетевой адрес сервиса B? Для этого используют инструменты вроде Consul, etcd или встроенные механизмы оркестраторов (например, DNS в Kubernetes).
- API Gateway: Единая точка входа для внешних клиентов, которая маршрутизирует запросы к внутренним микросервисам, выполняя аутентификацию, логирование и rate limiting.