[Spring Cloud] Подробное объяснение общих конфигураций Feign

Spring Cloud
[Spring Cloud] Подробное объяснение общих конфигураций Feign

1 Имитация общей конфигурации

Feign, оснащенный автостопщиками Spring Cloud, становится предпочтительной платформой для выполнения HTTP-вызовов большими и малыми интернет-компаниями, использующими архитектуру Spring. Декларативные определения на основе интерфейса, балансировка нагрузки на стороне клиента, автоматические выключатели и резервные копии — вот четыре основных преимущества Feign по сравнению с платформами HTTP-вызовов предыдущего поколения (такими как Spring Template, Apache HttpClient).

Подобно взаимосвязи между Retrofit и OkHttp, Feign на самом деле является слоем инкапсуляции обычных HTTP-клиентов, целью которого является снижение затрат на интеграцию и повышение надежности. Feign поддерживает три HTTP-клиента, включая собственный HttpURLConnection JDK, Apache HttpClient и Square OkHttp, а Apache HttpClient используется по умолчанию.

  • HttpURLConnection: не поддерживает пулы потоков и обычно не используется.
  • HttpClient: По сравнению с OkHttp, HttpClient не имеет очевидных преимуществ, может быть выбран Feign в качестве реализации по умолчанию, поскольку он более широко используется. HTTP/2 поддерживается только с версии 5.0.
  • OkHttp: предпочтительный HTTP-клиент для разработки приложений Android, поддерживает HTTP/2, установивfeign.okhttp.enabled=trueвключить.

Feign предоставляет две категории свойств конфигурации для настройки трех вышеуказанных HTTP-клиентов:feign.client.*а такжеfeign.httpclient.*, первый поддерживает настройку по экземпляру (Примечание 1), второй использует глобальный набор настроек, включая конфигурацию пула потоков, но влияет только на HttpClient и OkHttp, а не на HttpURLConnection. Конкретная связь показана в следующей таблице.

Примечание-1: Так называемая конфигурация по экземпляру означает, что каждый экземпляр FeignClient может быть настроенfeign.client.<feignClientName>.*Чтобы настроить его отдельно, обратите внимание на строчные буквы первой буквы. а такжеfeign.client.default.*Указывает конфигурацию по умолчанию.

HTTP-клиент время соединения вышло тайм-аут запроса время выживания нити Максимальное количество подключений в пуле потоков (глобальном) Максимальное количество подключений в пуле потоков (один HOST)
HttpURLConnection feign.client.[default|<feignClientName>].connect-timeout
По умолчанию: 10 секунд
feign.client.[default|<feignClientName>].read-timeout
По умолчанию: 60 секунд
N/A N/A N/A
HttpClient feign.httpclient.connection-timeout
По умолчанию: 2 секунды
По умолчанию: -1 (RequestConfig.Builder.socketTimeout) feign.httpclient.time-to-live
По умолчанию: 900 секунд
feign.httpclient.max-connections
По умолчанию: 200
feign.httpclient.max-connections-per-route
По умолчанию: 50
OkHttp feign.httpclient.connection-timeout
По умолчанию: 2 секунды
feign.client.[default|<feignClientName>].read-timeout
По умолчанию: 10 секунд
feign.httpclient.time-to-live
По умолчанию: 900 секунд
feign.httpclient.max-connections
По умолчанию: 200
N/A

Как видно из приведенной выше таблицы, Feign предоставляет две конфигурации времени ожидания соединения, HttpURLConnection используетfeign.client.[default|<feignClientName>].connect-timeout, а HttpClient и OkHttp используютfeign.httpclient.connection-timeout, обратите на это особое внимание.

2 Включить Hystrix

установивfeign.hystrix.enabled=trueМожно включить поддержку автоматических выключателей Feign (на базе Hystrix). Как и Feign, Hystrix также поддерживает настройку по экземплярам Подробные сведения о свойствах конфигурации см.официальная документация.

Поскольку время ожидания запроса по умолчанию для Hystrix составляет 1 секунду, легко вызвать исключение времени ожидания, поэтому часто необходимо увеличить его. Есть два способа увеличить время ожидания:

  • Первый способ, поhystrix.command.default.execution.isolation.thread.timeoutInMillisecondsУстановите тайм-аут по умолчанию, который влияет на все запросы.
  • Второй способ, если вы не хотите менять таймаут для всех запросов, вы можете пройтиhystrix.command.<HystrixCommandKey>.execution.isolation.thread.timeoutInMillisecondsУстановите время ожидания команды Hystrix индивидуально. Итак, вопрос в том, что такое Feign, что такое этот командный ключ Hystrix, совпадает ли он с именем клиента Feign? ответ отрицательный. Ниже Feign команда Hystrix соответствует методу клиента Feign, поэтому определение ключа команды Hystrix:<FeignClientName>#<methodName>(<arg1ClassName>,<arg2ClassName>...), обратите внимание на заглавную букву, см.SetterFactory.Default#create()метод.

3 Резюме

Будь то Spring или Spring Cloud, потому что вся экосистема слишком велика, даже официальная документация едва может охватить общую структуру каждого компонента.После того, как вы углубитесь в детали, вы можете полагаться только на разработчиков, которые изучат исходный код, чтобы найти ответ. Как сказал Линус Торвальдс,Talk is cheap. Show me the code.

4 Ссылка