Конфигурация HTTP-клиента
Настройки читаются из глобального Setup с префиксом api.. Для интерфейса
@Api(name = "catalog") используется секция api.catalog:
api.catalog.<параметр>=<значение>
Секция обязательна даже при передаче URL вторым аргументом getClient().
Общие параметры
| Ключ | По умолчанию | Назначение |
|---|---|---|
|
пустая строка |
Человекочитаемое имя. Используется в сообщениях и |
|
нет |
Base URL. Обязателен, если URL не передан в |
|
|
Отключает проверку сертификата и имени узла для этого клиента. |
ignoreSSL=true принимает любой сертификат и любое имя узла. Настройка
допустима только для контролируемого тестового контура и не должна использоваться
для обхода проблем сертификата в рабочей среде.
|
HTTP и логирование
| Ключ | По умолчанию | Назначение |
|---|---|---|
|
|
Тайм-аут установления соединения, мс. |
|
|
Тайм-аут чтения ответа, мс. |
|
|
Уровень |
Уровень BODY пишет тела запросов и ответов, а HEADERS — заголовки. В них могут
оказаться токены, персональные данные и большие документы. Включать эти уровни
следует только на ограниченное время и после проверки состава данных.
Пул соединений и Dispatcher
| Ключ | По умолчанию | Назначение |
|---|---|---|
|
|
Максимальное число простаивающих соединений OkHttp. |
|
|
Срок хранения простаивающего соединения. |
|
|
Единица |
|
|
Максимум одновременно выполняемых запросов Dispatcher. |
|
|
Максимум одновременно выполняемых запросов к одному узлу. |
Пул соединений и Dispatcher создаются лениво при сборке первого клиента и
кэшируются по ключу @Api.name. Поэтому разные интерфейсы с одинаковым name
делят эти компоненты.
Rate Limiter
Rate Limiter Resilience4j ограничивает число начатых вызовов за период. Он отключён по умолчанию.
| Ключ | По умолчанию | Назначение |
|---|---|---|
|
|
Включить ограничитель. |
|
|
Период пополнения разрешений, мс. |
|
|
Число разрешений на период. |
|
|
Сколько ждать свободное разрешение, мс. |
Если разрешение не появилось за timeoutDuration, клиент выбрасывает
BGMessageException с сообщением о превышении частоты запросов.
Circuit Breaker
Circuit Breaker Resilience4j прекращает обращения к нестабильному сервису. Он
отключён по умолчанию и использует автоматический переход OPEN → HALF_OPEN.
| Ключ | По умолчанию | Назначение |
|---|---|---|
|
|
Включить Circuit Breaker. |
|
|
Процент ошибок, после которого цепь открывается. |
|
|
Время состояния |
|
|
Допустимый процент медленных вызовов. |
|
|
Порог медленного вызова, мс. |
|
|
Число пробных вызовов в состоянии |
|
|
Размер скользящего окна вызовов. |
|
|
Минимум накопленных вызовов до расчёта процента ошибок. |
Ошибками для Circuit Breaker считаются TimeoutException, IOException,
ApiException и ResourceNotFoundException. Наследники BGException, включая
BGMessageException, не меняют его статистику. Поведение исключений на границе
компонента описано в разделе об ошибках.
Полный пример
api.catalog.name=Каталог товаров
api.catalog.url=https://catalog.example.test/
api.catalog.ignoreSSL=false
api.catalog.auth.type=STATIC_TOKEN
api.catalog.auth.header=Authorization
api.catalog.auth.token=<service-token>
api.catalog.http.connectTimeout=5000
api.catalog.http.readTimeout=15000
api.catalog.http.logLevel=BASIC
api.catalog.http.pool.idle=5
api.catalog.http.pool.keepAlive=5
api.catalog.http.pool.timeUnit=MINUTES
api.catalog.worker.pool.maxRequests=32
api.catalog.worker.pool.maxRequestsPerHost=8
api.catalog.rate.limiter.enabled=true
api.catalog.rate.limiter.limitRefreshPeriod=1000
api.catalog.rate.limiter.limitForPeriod=20
api.catalog.rate.limiter.timeoutDuration=2000
api.catalog.circuit.breaker.enabled=true
api.catalog.circuit.breaker.failureRateThreshold=50
api.catalog.circuit.breaker.waitDurationInOpenState=10000
api.catalog.circuit.breaker.slowCallRateThreshold=50
api.catalog.circuit.breaker.slowCallDurationThreshold=5000
api.catalog.circuit.breaker.permittedNumberOfCallsInHalfOpenState=3
api.catalog.circuit.breaker.slidingWindowSize=10
api.catalog.circuit.breaker.minimumNumberOfCalls=10
Параметры авторизации приведены отдельно в разделе авторизации.
Изменение настроек без перезапуска
getClient() каждый раз заново читает конфигурацию и строит Retrofit/OkHttp.
Уже полученный объект API не обновляется. После изменения настройки код должен
получить клиент повторно либо использовать поставщик, который делает это перед
вызовом.
Пулы и компоненты Resilience4j сравнивают новую конфигурацию с закэшированной.
При отличии компонент пересоздаётся и его MBean регистрируется заново. Из-за
текущей реализации первый getClient() после изменения ещё получает прежний
компонент, а пересозданный начинает использоваться со следующего getClient().