Почему gRPC заменяет исключения?

Каким образом можно настроить шлюз для перенаправления входящих запросов к нужному сервису?
  • 16 января 2024 г. 7:08
Ответы на вопрос 2
### Почему gRPC заменяет исключения?

gRPC использует механизм статусов для сообщения об успехе или ошибке при выполнении удаленных вызовов процедур. Исключения, как известно, являются ключевой особенностью многих языков программирования для обработки ошибок в синхронных системах. Однако в распределенных системах, таких как gRPC, исключения могут быть проблематичными по нескольким причинам:

1. **Переносимость:** Различные языки программирования имеют различные модели исключений, что усложняет переносимость исключений между языками.
2. **Сериализация:** Исключения не всегда легко сериализовать или десериализовать при передаче по сети.
3. **Прозрачность потока выполнения:** В асинхронных системах использование исключений может затруднить понимание логики обработки ошибок и потока выполнения программы.

Как следствие, в gRPC используются статусные коды и метаданные для сообщения о возникновении ошибок. Каждый ответ от сервера к клиенту содержит статусный код, который может указывать на успех (OK) или на один из многих стандартных типов ошибок (например, `NOT_FOUND`, `UNAVAILABLE`, `PERMISSION_DENIED` и др.). Кроме того, можно добавить дополнительные метаданные в виде сообщений об ошибках для обеспечения более детального описания проблемы.

### Как можно настроить шлюз для перенаправления входящих запросов к нужному сервису?

Для перенаправления входящих запросов к нужному сервису можно использовать API-шлюз (API Gateway), который будет действовать как прокси и распределять трафик между сервисами. Процесс настройки обычно включает следующие шаги:

1. **Роутинг:** Настройка правил роутинга для перенаправления запросов на основе URL-путь, заголовков, методов и других параметров запроса.
2. **Загрузка конфигурации:** Предоставление файла конфигурации шлюза, в котором определены правила и маршруты.
3. **Поддержка сервисного открытия:** Интеграция со службой сервисного открытия (например, Consul, Eureka) для автоматического обнаружения сервисов и их адресов.
4. **Настройка балансировки нагрузки:** Определение политик балансировки нагрузки для распределения запросов между инстансами сервиса.
5. **Настройка аутентификации и авторизации:** Внедрение механизмов безопасности для проверки подлинности и авторизации запросов перед перенаправлением.
6. **Логирование и мониторинг:** Настройка логирования и мониторинга для отслеживания работы шлюза и запросов.
7. **Обработка ошибок:** Определение политик обработки ошибок, чтобы корректно реагировать на сбои сервисов или проблемы с сетью.

Популярными решениями для API-шлюзов являются Nginx, HAProxy, Amazon API Gateway, Google Cloud Endpoints, и
А откуда другой сервис знает, какие КЛАССЫ/ОБЪЕКТЫ есть в другом сервисе? 
Если нужно кидать такое-же исключение на сервисе клиенте, то нужно это исключение там и создать.

А вообще, для своих типов исключений необходимо использовать GRPC_STATUS_UNKNOWN . В документации так и написано:
Server threw an exception (or did something other than returning a status code to terminate the RPC)


Решение только одно - в каждом сервисе писать свои обработчики таких исключений и свои классы исключений
Похожие вопросы