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.