Введение, принципы и методы оптимизации использования компонента Feign, который вызывается между микросервисами.
Введение, принципы и методы оптимизации использования компонента Feign, который вызывается между микросервисами.

Введение, принципы и методы оптимизации использования компонента Feign, который вызывается между микросервисами.

Feign — декларативный клиент веб-службы. Это упрощает вызовы между микросервисами. Feign имеет подключаемую поддержку аннотаций, включая аннотации Feign и аннотации JAX-RS. Feign также поддерживает подключаемые кодеры и декодеры. В Spring Cloud добавлена ​​поддержка аннотаций Spring MVC, а также поддерживается Spring WebFlux.

Feign можно комбинировать с Eureka и Ribbon для поддержки балансировки нагрузки.

Введение в контент

Основное содержание этой статьи включает в себя:

  1. Притворяться основными понятиями, принципами и использованием. Feign использует декларативный интерфейс,Автоматически объединяйте URL-адреса, добавляйте параметры и т. д.,Упростите разработку HTTP-клиента.
  2. Расширенные функции Feign, такие как ведение журнала, сжатие, повторные попытки, прослушиватели, обработка ошибок и т. д. Эти функции делают Feign мощным клиентом.
  3. Притворятьсяпроизводительностьоптимизация,Включает пул соединений、Замена HTTP-клиента、Настройки тайм-аута、GZIP-сжатие и т. д. Эти меры могут существенно улучшить показатели Притворяться.
  4. Притворяться решением высокой доступности. Через центр регистрации с помощью Служить、предохранитель、Объединение таких компонентов, как отслеживание ссылок, Обеспечить высокую доступность Feign Служить.
  5. Лучшие практики Feign. Используйте Feign рационально, используя передовые методы, такие как настройки тайм-аута, обработка перехода на более раннюю версию и контроль уровня журнала.
  6. Анализ исходного кода Feign. Проанализируйте основные компоненты Feign, такие как класс Feign, интерфейс контракта, клиентский интерфейс, регистратор и т. д., и поймите внутренний механизм Feign.
  7. Разница между Feign и OpenFeign. OpenFeign внес множество улучшений на основе Feign и ближе к системе Spring Cloud, поэтому Spring Cloud более ориентирован на OpenFeign.
  8. Сравнение Feign и RestTemplate. В системе Spring Cloud Feign больше подходит в качестве HTTP-клиента, чем RestTemplate.
  9. Притворитесь FAQ. Ответьте на распространенные проблемы при использовании Feign, такие как вызов 404, тайм-аут, аннотации, не вступающие в силу и т. д.

Использование притворства

  1. Добавить зависимость Feign
Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  1. Создать интерфейс и добавить@FeignClientаннотация
Язык кода:javascript
копировать
//определить Притвориться интерфейс
@FeignClient("эврика-клиент") 
общедоступный интерфейс ComputeClient {
   @GetMapping("/добавить")
   int add(@RequestParam(value = "a") int a, @RequestParam(value = "b") int b);
}

@FeignClient("eureka-client")Указан для звонка Служитьимя,Здесь называется эврика-клиент Служить, зарегистрированный в Эврике.

  1. @FeignClientсерединаизинтерфейсиспользоватьSpring Аннотации MVC для объявления Web Запрос на обслуживание
  2. Добавить в основной класс запуска@EnableFeignClientsаннотациявключать Притворяться Функция
Язык кода:javascript
копировать
@SpringBootApplication
@EnableFeignClients 
public class Application {
   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
   }
}
  1. Вызов метода интерфейса Feign может завершить вызов Служить.
Язык кода:javascript
копировать
@Autowired
private ComputeClient computeClient;

public int add(int a, int b) {
   return computeClient.add(a, b);  
}

вызовcomputeClient.add(a, b)чтобы завершить сопряжениеeureka-clientСлужитьизвызов。

Feign интегрирует Ribbon внутри себя, поэтому в приведенном выше примере также есть функция балансировки нагрузки клиента.

Обзор процесса исполнения Фейна

Когда Feign вызывает другие службы, он перенаправляет запрос в соответствии с URL-адресом в аннотации. Как это работает:

  1. в соответствии с@FeignClientизvalueнайдено значение Служить,Если настроен центр регистрации «Служить»,Список экземпляров Служить также получается на основе имени Служить.
  2. Создайте параметры запроса и определите параметры запроса в соответствии с аннотациями к методу (например, @PathVariable, @RequestParam, @RequestBody и т. д.).
  3. Определите метод и путь запроса на основе аннотаций (@GetMapping, @PostMapping, @DeleteMapping и т. д.).
  4. Инициируйте просьбу позвонить другим Служить и получите результат.
  5. Инкапсулируйте результат и верните его вызывающей стороне.

Настройка Feign

Feign предоставляет различные методы настройки:

  1. Уровень журнала: Feign поддерживает ведение журнала, мы можем установить уровень журнала для просмотра деталей вызовов Feign.
Язык кода:javascript
копировать
feign:
  client: 
    config:
      default: 
        loggerLevel: FULL 

Если установлено значение «ВСЕ», будут отображены полные сведения журнала запросов и ответов.

  1. Кодер и декодер: Feign по умолчанию использует JSON для кодирования и декодирования, и мы можем установить собственные кодеки.
Язык кода:javascript
копировать
@Component
public class CustomEncoder implements Encoder {
    //...
}

@Bean
public Encoder feignEncoder() {
    return new CustomEncoder();
}
  1. FeignПерехватчик:Мы можем пройтивыполнитьRequestInterceptorи ResponseInterceptorинтерфейс Приходитьсделанный на заказперехватить запросиответ。
Язык кода:javascript
копировать
@Bean 
public RequestInterceptor requestInterceptor() { 
  return template -> {
     //Пользовательская логика...
     template.header("Content-Type", "application/json");
   }; 
}
  1. Наследование интерфейса Feign. Наш интерфейс Feign может наследовать другой интерфейс, чтобы мы могли переопределить методы родительского интерфейса для достижения конкретных требований к настройке.
Язык кода:javascript
копировать
@FeignClient("some-service")
public interface SomeServiceClient extends SomeService {
    @Override
    @GetMapping("/{path}")
    String doSomething(@PathVariable("path") String path);
}
  1. Контракт: Spring Cloud Feign по умолчанию использует SpringMvcContract. Мы можем реализовать собственные контракты для управления некоторыми вариантами поведения Feign, такими как пути, методы запроса и т. д.

Практика эксплуатации и технического обслуживания Feign

Вы также столкнетесь с некоторыми проблемами при использовании Feign в реальных проектах. Вот несколько практических советов по эксплуатации и обслуживанию:

  1. По умолчанию Feign использует собственный URLConnection JDK для отправки HTTP-запросов. Мы можем выбрать более производительные HTTP-клиенты, такие как HTTP-клиент Apache, OkHttp и т. д.
Язык кода:javascript
копировать
feign:
  client: 
    config:
      default: 
        httpClient:
          enabled: true
          connectionTimeout: 5000
          followRedirects: true 
        loggerLevel: full
        okhttp:
          enabled: true # Включите Ок Хттп
  1. Настройки тайм-аута. Настройки тайм-аута клиента Feign включают:
  • connectTimeout:Тайм-аут соединения,По умолчанию — 10 секунд.
  • readTimeout:Тайм-аут чтения,По умолчанию — 60 секунд.

Мы можем установить его в соответствии с трудоемкими вызовами службы, чтобы избежать тайм-аутов.

оfeignПараметры конфигурации по умолчанию можно найти вFeignClientConfigurationКласс исходного кодаиз Полесвойство。

  1. Понижение версии Служить: когда вызов Служить завершается неудачей или истекает время ожидания.,Нам нужна стратегия понижения,Избегайте влияния на всю систему。мы можемFeignинтерфейс УвеличиватьfallbackУкажите понижение версиивыполнитьдобрый。
Язык кода:javascript
копировать
@FeignClient(value = "compute-service", fallback = ComputeClientFallback.class)
public interface ComputeClient {
    //..
}

public class ComputeClientFallback implements ComputeClient {
    public int add(int a, int b) {
        return -1; 
    }
} 

В случае сбоя вызова службы вычислений метод в ComputeClientFallback будет вызван как возврат к более ранней версии.

  1. Повтор: мы можем добавить настройки повтора в Feign.,Повторите попытку, если вызов Служить не удался.,Избегайте распространения ошибок.
Язык кода:javascript
копировать
feign:
  client:
    retry:
      enabled: true # Включить повторную попытку
      maxAttempts: 5 # Максимальное количество повторов
      period: 5000    # Интервал повтора

См. класс исходного кода:feign.Retryer.Default

  1. Балансировка нагрузки: Feign по умолчанию интегрирует ленту для балансировки нагрузки клиента. Мы можем установить некоторые параметры, связанные с лентой, для конфигурации, такие как время ожидания соединения, повтор и т. д.
Язык кода:javascript
копировать
ribbon: 
  ConnectTimeout: 1000 # Тайм-аут соединения
  ReadTimeout: 3000 # Тайм-аут чтения
  OkToRetryOnAllOperations: true # Повторять ли все методы запроса
  MaxAutoRetriesNextServer: 1 # После переключения экземпляровиз Максимальное количество повторов

Часто задаваемые вопросы по Притворству

  1. Притворный вызов возвращает 404

Обычно это вызвано неправильным URL-адресом, указанным Feign. Мы можем:

  • подтверждать@FeignClientсерединаизvalueЗначение правильное,Соответствует названию Служить в регистрационном центре Служить.
  • Подтвердите правильность пути в URL-адресе. Вы можете распечатать журнал Feign, чтобы просмотреть фактический путь запроса.
  • Если экземпляров Служить много,Вам также необходимо подтвердить, вызывает ли политика балансировки нагрузки Ribbon запросы к неправильному экземпляру.
  1. Притворный вызов возвращает тайм-аут

Обычно для этого есть две причины:

  • Служить Время обработки поставщиком слишком велико,вне Притворяться Тайм-аут чтения。Нам нужно соответствующим образом увеличить ПритворятьсяreadTimeout
  • Служить Вызывающая ссылка слишком длинная,Время обработки одного из средних сообщений слишком велико.,В результате общее время вызова Feign превышено. В этом случае вам необходимо проверить время обработки каждой ссылки.,руководитьоптимизация。
  1. Служитьпонижение не вступило в силу

Для этого есть две основные причины:

  • @FeignClientНе указанfallbackсвойство,Понижение классов реализации не происходит. В этом случае необходимо добавить класс понижения.
  • Пониженный класс отсутствует в контейнере Spring,Не сканируется。Эта ситуация требуетподтверждать降级добрый是否被@Componentаннотация,или увеличить@FeignClientизfallbackFactoryУкажите фабричный класс для создания экземпляров пониженной версии класса.。
  1. Недопустимая настройка уровня журнала Feign.

Это связано с тем, что существует два способа установить уровень журнала Feign с разными приоритетами:

  • проходитьlogging.level.xx=DEBUGнастраивать Притворяться Уровень журнала,Высокий приоритет.
  • проходитьfeign.Client.config.loggerLevel=FULLнастраивать,Низкий приоритет.

Итак, если оба метода установлены одновременно,logging.level.xx=DEBUGизнастраиватьпокроетfeign.Client.config.loggerLevel=FULL。нам просто нужнонастраивать Только один путь,и приоритетное использованиеlogging.level.xx=DEBUGнастраиватьFeignУровень журнала。

  1. Пользовательский клиент не вступает в силу?
  • Проверьте, установлено ли значение feign.client.name и соответствует ли ClientName.
  • Проверьте правильность атрибута имени @FeignClient("name"), соответствующего feign.client.name.
  • Проверьте, помечен ли класс реализации клиента с помощью @Component и правильно ли он внедрен в контейнер Spring.
  1. Хотите использовать аннотации Spring MVC, но это не работает?
  • Подтвердите, используете ли вы OpenFeign, поскольку OpenFeign поддерживает только аннотации Spring MVC.
  • Проверьте, не слишком ли низкая версия OpenFeign. Поддержка аннотаций более ранних версий OpenFeign неполная.
  • Проверьте, имеются ли соответствующие аннотации к методу и параметрам. Если аннотация отсутствует, она не вступит в силу.
  1. Как добавить перехватчики, АОП и т. д. в бобы Feign?
  • Поскольку FeignClient генерируется через прокси-сервер JDK, перехватчики, AOP и т. д. не могут быть напрямую добавлены в его bean-компоненты.
  • «может пройти» добавляет перехватчик в FeignClient, добавляя аннотации перехватчика к интерфейсу, определенному FeignClient.
  • Вы также можете добавить AOP и т. д. в класс реализации FeignClient (по умолчанию — Feign.Default).
  • Определите свой собственный перехватчик Feign @Component и настройте его на feign.client.config.defaultInterceptors.
  1. Как Feign реализует загрузку файлов?
  • Для загрузки файла требуется использование формы, состоящей из нескольких частей, которую кодировщик форм Feign по умолчанию FormEncoder не поддерживает.
  • Необходимо добавить поддержку multipart/form-data и ввести зависимость feign-form.
  • И добавьте MULTIPART_FORM_ENCODER в файл feign.clients.default.encoders.
  • Затем вы можете определить интерфейс Feign, который получает MultipartFile для загрузки файла.
  1. Может ли Feign вызвать интерфейс HTTPS?

Может. Клиент Feign по умолчанию поддерживает HTTPS. Вам нужно только указать протокол https и конфигурацию, связанную с сертификатом, в URL-адресе @FeignClient. Вы также можете использовать ApacheHttpClient для замены клиента по умолчанию и реализации более сложной схемы вызовов HTTPS.

  1. Поддерживает ли Feign отправку формы?

поддерживать. Feign может передавать значение формы формы через аннотацию @RequestParam SpringMVC, а также поддерживает тип запроса application/x-www-form-urlencoded. В притворстве Используйте @RequestMapping(метод в методе Client = RequestMethod.POST)и@RequestParamВот и всеFormпредставлять на рассмотрение。

Это несколько распространенных проблем и решений при использовании Feign. Понимая принципы Feign и имея опыт выявления ошибок, вы сможете лучше использовать и поддерживать Feign, а также сделать его приложение более стабильным.

Притворная оптимизация производительности

Производительность Feign как компонента вызова сервисов также является тем, что нам необходимо учитывать. Вот несколько советов по оптимизации производительности Feign:

  1. Выберите более производительный HTTP-клиент. Как упоминалось выше, замените URLConnection по умолчанию Feign и выберите более производительный HTTP-клиент, например Apache HTTP Client и OkHttp.
  2. пул соединенийоптимизация:
  • Установите соответствующий размер пула соединений: не слишком большой и не слишком маленький.
  • Выберите HTTP-клиент, который поддерживает повторное использование пула соединений, например OkHttp.
  • На ленте также есть настройки пула соединений.,Работает с оптимизацией HTTP-клиента Притворяться.
  1. тайм-аутоптимизация:
  • Правильно установите таймаут соединения «Притворяться» и таймаут чтения. Таймаут соединения не должен быть слишком большим.,Тайм-аут чтения устанавливается в зависимости от того, сколько времени занимает вызов Служить.
  • RibbonТакже имеется соответствующий Настройки тайм-аута,иFeignСотрудничествооптимизация。
  1. Служитьпул потоковоптимизация:

Feign использует пул потоков JDK по умолчанию, который мы можем настроить:

Язык кода:javascript
копировать
@Bean
public ExecutorService feignExecutorService(){
    // Установите количество основных потоков, максимальное количество потоков, размер очереди и время задержки при освобождении ресурсов.
    return new ThreadPoolExecutor(xx, yy, zz, TimeUnit.SECONDS, 
        new LinkedBlockingQueue<Runnable>(zzz), 
        new NamedThreadFactory("feign"));
}
  1. Попробуйте еще разоптимизация:
  • Установите количество повторов и временной интервал для Feign соответствующим образом.
  • Дифференцировать стратегии повторных попыток для разных,Предотвратите чрезмерные повторные попытки, вызывающие чрезмерное потребление системных ресурсов.
  1. Оптимизация уровня журнала:

Хотя журналы Feign можно использовать для отладки, слишком подробные уровни журналов будут влиять на производительность, поэтому вы можете установить разные уровни журналов в зависимости от среды:

  • Среда разработки: Logger.Level.FULL, удобная для разработки и отладки.
  • Тестовая среда: Logger.Level.BASIC, понимание общего процесса вызова.
  • Производственная среда: Logger.Level.NONE, отключите логи для повышения производительности.
  1. GZIP-сжатие:

Feign поддерживает сжатие запросов и ответов GZIP для повышения производительности передачи по сети. Мы можем включить:

Язык кода:javascript
копировать
feign:
  compression: 
    request:
      enabled: true # Включить сжатие запроса GZIP
    response:
      enabled: true # Включить адаптивное сжатие GZIP

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

Симулируем тест производительности

Также важно протестировать производительность и надежность клиента Feign. Вот несколько рекомендаций по тестированию:

  1. Модульные тесты:

Мы можем написать модульные тесты для интерфейса Feign, вызвать интерфейс и проверить результаты ответа, чтобы убедиться в правильности логики интерфейса.

Язык кода:javascript
копировать
@RunWith(SpringRunner.class) 
@SpringBootTest
public class ComputeClientTest {

    @Autowired
    private ComputeClient computeClient;

    @Test
    public void testAdd() {
        int result = computeClient.add(1, 2);
        assertEquals(3, result);
    }
} 
  1. Интеграционное тестирование:

Запустите все службы, а затем вызовите клиент Feign для сквозного тестирования, чтобы проверить правильность всего процесса и результатов.

  1. Стресс-тест:

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

  • QPS: частота запросов в секунду, которая должна соответствовать ожидаемому количеству QPS системы.
  • РТ: Время реагирования необходимо контролировать в пределах приемлемого диапазона и не должно быть слишком большим.
  • Частота ошибок: необходимо контролировать частоту ошибок вызовов в приемлемом диапазоне.
  • Потребление ресурсов: находится ли потребление ресурсов, таких как ЦП, память, пропускная способность сети и т. д., в контролируемом диапазоне.
  1. Тест стабильности:
  • Долгосрочное тестирование с высокой нагрузкой: моделируйте сценарии с высоким трафиком, осуществляйте большой одновременный доступ к клиенту Feign в течение длительного времени и проверяйте его стабильность.
  • Тест на ошибку «Служить»: смоделировать сбой некоторых экземпляров провайдера «Служить», чтобы проверить, эффективны ли аварийное восстановление и понижение версии Притворяться.
  • Тест на сбой сети: имитируйте дрожание сети, высокую задержку, кратковременное прерывание сети и т. д. для проверки стабильности Feign.

Эти тесты могут эффективно проверить надежность клиента Feign и гарантировать его стабильную работу в сложных средах. Мы также можем разработать различные показатели производительности и показатели доступности, исходя из важности системы и масштаба трафика, а также провести строгую оценку SLA на Feign.

Примените некоторые популярные фреймворки, такие как:

  • Spring Cloud Contract для контрактного тестирования микросервисов
  • Resilience4j обеспечивает защиту от перегрузки, например автоматические выключатели, ограничение тока и повторные попытки.
  • Hystrix выполняет разрыв цепи и изоляцию потоков

Это может лучше обеспечить высокую доступность Feign. Таким образом, тестирование и защита от перегрузки являются важной частью обеспечения стабильности Feign. Мы надеемся, что благодаря этим методам тестирования и приложениям платформы Feign сможет работать более надежно в сложных средах.

Решение для имитации высокой доступности

Для микросервисной системы вызов службы является очень важным звеном. Как важный компонент вызова, высокая доступность Feign напрямую влияет на высокую доступность всей системы. Вот несколько решений для повышения высокой доступности Feign:

  1. Служить Обнаружение и регистрация:

Feign часто используется совместно с центрами регистрации служб, такими как Eureka и Consul. Эти центры регистрации служб также поддерживают развертывание кластеров, что может повысить высокую доступность вызовов службы Feign.

  1. Балансировка нагрузки ленты:

С помощью встроенного компонента Feign Ribbon мы можем настроить несколько экземпляров службы и выбрать подходящую стратегию балансировки нагрузки, чтобы избежать единых точек отказа.

  1. Отказоустойчивая защита Hystrix:

Hystrix может защитить Feign с помощью изоляции потоков, автоматического выключателя и других стратегий, позволяющих избежать перегрузки сервисов при высоком уровне параллелизма. Механизм автоматического выключателя может быстро выйти из строя, чтобы избежать блокировки операций.

  1. Пул соединений HTTP-клиента:

Использование пулов соединений, таких как HTTP-клиент Apache, OKHttp и т. д., позволяет повторно использовать соединения и избегать установления новых соединений для каждого вызова. Сами эти клиенты также поддерживают настройку высокой доступности, например установку нескольких URL-адресов.

  1. Механизм таймаута и повтора:

Правильная настройка тайм-аута соединения и тайм-аута чтения Feign позволяет быстро обнаружить проблемы со службами и быстро выйти из строя, избегая слишком длительного использования ресурсов. Взаимодействуйте с механизмом повторных попыток, чтобы быстро вернуться после определенного количества раз, чтобы не допустить, чтобы долгосрочные недоступные службы приводили к недоступности системы.

  1. Предохранители и ограничение тока:

Помимо Hystrix, компоненты с открытым исходным кодом, такие как Resilience4J, можно использовать для более комплексных и мощных автоматических выключателей, ограничения тока и повторных попыток. Ограничение тока может предотвратить внезапный высокий трафик, вызывающий недоступность системы.

  1. Служитьотслеживать:

Используйте такие компоненты, как Zipkin, для отслеживания ссылок на вызовы служб. При возникновении высокой задержки или недоступности служб вы можете быстро обнаружить проблему.

  1. Стратегия понижения версии:

Укажите резервную стратегию и соответствующие стратегии перехода на более раннюю версию для интерфейса Feign, чтобы предоставить альтернативы, когда служба недоступна, чтобы избежать недоступности служб, вызывающих полную недоступность зависимых служб.

  1. Ведение журнала и мониторинг:

Правильно настройте уровень журнала Feign и отслеживайте его с помощью инструментов сбора журналов, таких как ELK. При возникновении отклонений в работе службы проблема может быть быстро обнаружена и локализована.

Таким образом, высокая доступность Feign требует многогранных гарантий, а также эксплуатации и обслуживания. Для совместного улучшения производительности Feign необходимо сотрудничать с центром регистрации услуг, компонентами автоматического выключателя и ограничения тока, компонентами отслеживания ссылок, компонентами журнала мониторинга и т. д. и вся система микросервисов, которая на этом основана. Высокая доступность.

Притворный анализ исходного кода

Понимание исходного кода Feign поможет нам глубже понять принцип его работы, чтобы мы могли разумно использовать и настраивать Feign. Вот краткий анализ исходного кода Feign:

  1. Класс Feign: Класс Feign — это вход в Feign. Его основные задачи:
  • Анализируйте аннотации Feign и получайте такую ​​информацию, как связь между методами интерфейса и URL-адресом, тип запроса и т. д.
  • Создайте класс ReflectiveFeign для инкапсуляции сопоставления между методами интерфейса и деталями запроса.
  • Создайте Feign.Builder, используемый для создания экземпляров Feign.
  • Создайте регистратор для записи журналов Feign.
  • Привяжите контракт контракта, по умолчанию — SpringMvcContract.
  1. Класс ReflectiveFeign:
  • Поддерживайте сопоставление между методами интерфейса Feign и шаблоном запроса (RequestTemplate).
  • При вызове метода интерфейса найдите шаблон запроса, используйте параметры запроса для создания URL-адреса и инициируйте HTTP-запрос.
  • Преобразуйте результат ответа в определенный тип возвращаемого значения метода интерфейса и верните его вызывающей стороне.
  1. Интерфейс контракта и SpringMvcContract:
  • Интерфейс контракта определяет такие правила, как генерация шаблонов запросов и конструирование значений параметров в переменные шаблона.
  • SpringMvcContract реализует метод аннотаций Spring MVC, преобразуя аннотации методов и параметров в переменные и значения шаблона запроса.
  1. Клиентский интерфейс и реализация Client.Default:
  • Интерфейс клиента определяет методы для инициации HTTP-запросов. Feign использует шаблон построителя, позволяющий нам выбирать различные реализации клиента для отправки запросов.
  • Client.Default реализует использование встроенного URLConnection JDK для отправки HTTP-запросов. Мы можем реализовать собственный клиент, например, используя OKHttp и т. д.
  1. Кодер и декодер:
  • Encoder отвечает за кодирование параметров запроса. По умолчанию SpringEncoder используется для кодирования параметров в JSON.
  • Декодер отвечает за декодирование результатов ответа. По умолчанию для декодирования ответа JSON используется SpringDecoder.
  1. Logger и LoggingInterceptor:
  • Logger определяет спецификацию записи журналов Feign с 4 уровнями: NONE, BASIC, HEADERS и FULL.
  • LoggingInterceptor перехватывает запросы и ответы Feign и записывает подробную информацию в виде файла журнала Feign, в котором можно указать местоположение записи журнала.
  1. Интерфейс повторной попытки. Определите стратегию повторной попытки. Feign имеет встроенную поддержку стратегий повторной попытки и экспоненциальной отсрочки. Мы также можем настроить реализацию Retryer.

Это основные компоненты Feign. Feign эффективен и гибок именно потому, что эти компоненты используют дизайн интерфейса, что позволяет нам гибко выбирать и заменять их. Понимание функций и взаимоотношений этих компонентов поможет нам использовать исходный код Feign для индивидуальной разработки.

Разница между Feign и OpenFeign

Feign и OpenFeign — это декларативные HTTP-клиенты Netflix с открытым исходным кодом, но есть определенные различия:

  1. Источник:

Feign возник из Netflix, позже был передан в дар Spring Cloud и стал частью Spring Cloud Netflix. OpenFeign — это усовершенствованная версия Feign в Spring Cloud, которая становится неотъемлемой частью Spring Cloud. Цель состоит в том, чтобы предоставить новые функции, такие как поддержка аннотаций Spring MVC и механизмов ошибочного прослушивания.

  1. Поддержка аннотаций:

Feign поддерживает только аннотации JAX-RS и не поддерживает аннотации Spring MVC. OpenFeign поддерживает аннотации Spring MVC, которые ближе к опыту разработки Spring и поддерживают согласование, проверку и другие механизмы содержимого.

  1. Кодек:

Feign поддерживает только три кодека: QueryStringEncoder, FormEncoder и JsonEncoder. OpenFeign имеет встроенные SpringEncoder и StringDecoder, которые поддерживают кодирование и декодирование более сложных объектов и HTTP-запросов, таких как коллекции, карты и т. д.

  1. contract:

Feign поддерживает только сопоставление между сигнатурами методов интерфейса и URL-адресами, а детали запроса нельзя настроить. OpenFeign поддерживает SpringMvcContract, который может настраивать методы запроса, привязку параметров и другие детали.

  1. Перехватчик:

Feign не поддерживает перехватчики запросов и ответов. OpenFeign поддерживает ClientRequestInterceptor и ClientResponseInterceptor, позволяя перехватывать и настраивать запросы и ответы Feign.

  1. Поддержка мониторинга:

Feign не поддерживает мониторинг индикаторов и событий. OpenFeign поддерживает индикаторы мониторинга, такие как размер пула соединений, количество запросов, время обработки и такие события, как успешное и неудачное соединение. Удобно отслеживать рабочее состояние Feign.

  1. Дань Облаку:

Feign — это проект Netflix с открытым исходным кодом, который не зависит от Spring Cloud. OpenFeign отдает дань уважения Spring Cloud, глубоко интегрирован с Spring Cloud и опирается на Spring Cloud Context и Spring Boot.

Видно, что OpenFeign сделал много улучшений на основе Feign, ближе к системе Spring Cloud, имеет более богатые и полные функции и более активно поддерживается. Поэтому в рамках микросервисной архитектуры Spring Cloud OpenFeign часто оказывается лучшим выбором. Но Feign сам по себе также является зрелым и надежным HTTP-клиентом. Если мы не слишком зависим от системы Spring, прямое использование Feign также является хорошим выбором. Короче говоря, это все еще необходимо взвесить, исходя из нашего выбора технологий и потребностей.

Сравнение Feign и RestTemplate

Feign и RestTemplate — широко используемые HTTP-клиенты, но они имеют следующие основные различия:

  1. Как использовать:

Использование RestTemplate ближе к традиционному HTTP API, который требует ручного создания URL-адресов, параметров сращивания и т. д.:

Язык кода:javascript
копировать
RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/users?name={name}";
String result = restTemplate.getForObject(url, String.class, "Jack");

Использование притворства декларативным способом.,Просто определите интерфейс и аннотируйте его,Более ориентированный на интерфейс:

Язык кода:javascript
копировать
@FeignClient("example.com")
public interface UserClient {
    @GetMapping("/users")
    String getUser(@RequestParam("name") String name);
}
  1. Ремонтопригодность:

Интерфейс Feign более абстрактный, скрывает детали реализации и облегчает последующее обслуживание и замену. Вызывающий метод RestTemplate слишком специфичен и не способствует изменениям.

  1. Масштабируемость:

Feign имеет более широкие возможности расширения, такие как поддержка нескольких кодеков, перехватчиков, клиентов и т. д. Расширение RestTemplate сложнее.

  1. Поддерживаемые функции:

Feign имеет встроенные механизмы балансировки нагрузки, повторных попыток, мониторинга и другие механизмы. Для завершения RestTemplate необходимо использовать вместе с другими компонентами, такими как Ribbon и т. д.

  1. Интеграция с Spring:

Feign является частью Spring Cloud и глубоко интегрирован со средой Spring. RestTemplate необходимо отдельно интегрировать с Spring.

Связь и разница между Feign и другими компонентами

  1. Разница и взаимосвязь между Feign и Ribbon:
  • Feign и Ribbon являются компонентами Netflix с открытым исходным кодом.,Используется для вызовов микросервисов.
  • Feign — декларативный HTTP-клиент, в основном отвечающий за отправку HTTP-запросов.
  • Лента — это балансировщик нагрузки, в основном используемый для балансировки нагрузки клиентов.
  • Feign использует Ribbon внутри себя для балансировки нагрузки, поэтому при использовании Feign нет необходимости использовать Ribbon отдельно.
  • Но мы все равно можем настроить или заменить Ribbon в Feign для реализации индивидуальных стратегий балансировки нагрузки.
  1. Разница и взаимосвязь между Feign и Hystrix:
  • Feign и Hystrix также являются компонентами Netflix с открытым исходным кодом.,Для системы микросервисов.
  • Feign — это HTTP-клиент, в основном используемый для отправки HTTP-запросов.
  • Hystrix — отказоустойчивый инструмент управления, в основном используемый для повышения надежности и отказоустойчивости микросервисов.
  • Feign можно объединить с Hystrix и использовать механизм отказоустойчивости Hystrix для защиты вызовов Притворяться Служить.
  • Нам нужно только добавить указанный резервный метод отказоустойчивости в @FeignClient на клиенте Feign, чтобы включить отказоустойчивость Hystrix.
  • Вы также можете вручную использовать HystrixCommand в резервном методе для выполнения таких операций, как понижение версии Служить.
  1. Разница и взаимосвязь между Фейном и Зуулом:
  • Feign — HTTP-клиент для Netflix.,Используется для звонков Служить. Zuul — это ворота в Netflix,Используется для маршрутизации и пересылки.
  • В системе микросервисов обычно используются компоненты Feign и Zuul.
  • Feign используется для внутренних звонков в Служить, а Zuul в основном используется как единый вход для внешних систем доступа.
  • Zuul можно комбинировать с Feign,Маршрут внешнего доступа к внутреннему Служить,И эти внутренние Служить могут использовать Feign, чтобы звонить друг другу.
  • Так что, хотя у Зуула и Фейна разные функции,Но могут хорошо работать вместе,Вместе они поддерживают структуру микросервисов.

Понимание этого содержания может дать нам более полное представление о Feign и других компонентах микросервисов, а также узнать взаимосвязи и различия между ними, что поможет нам сделать лучший выбор и комбинации при разработке решений для микросервисов. Хотя Feign очень мощный инструмент, он обычно не существует изолированно, а используется в сочетании с другими компонентами для повышения ценности.

Расширенный контент Feign и практика пользовательских расширений

  1. Поддержка наследования Feign:

Feign по своей сути поддерживает наследование интерфейсов, а подинтерфейсы автоматически наследуют методы и аннотации родительского интерфейса. Это позволяет нам разработать четко иерархический интерфейс Feign, например:

Язык кода:javascript
копировать
public interface HelloService {
  @RequestMapping(method = RequestMethod.GET, value = "/hello")
  String sayHello(); 
}

public interface HelloServiceExtended extends HelloService {
  @RequestMapping(method = RequestMethod.GET, value = "/hi")
  String sayHi();
}

затем в@FeignClientуказано вHelloServiceExtendedинтерфейс,ТакFeignClientбудут обаsayHello()иsayHi()два метода。

  1. Шаблон запроса Фейна:

Иногда в нашем методе Feign присутствует большое количество повторяющихся аннотаций и параметров. В этом случае для их извлечения можно использовать шаблон запроса Feign. нравиться:

Язык кода:javascript
копировать
@Configuration 
public class FeignConfig {
  @Bean
  public RequestInterceptor basicAuthRequestInterceptor() {
    return template -> {
      template.header("Authorization", "Basic YWRtaW46YWRtaW4=");  
      template.query("limit", 100);
    };
  }
}

затем в@FeignClientуказано вэтот Перехватчик:

Язык кода:javascript
копировать
@FeignClient(name = "example", configuration = FeignConfig.class)
public interface ExampleFeignClient {
 //Этот метод автоматически унаследует параметры шаблона в BasicAuthRequestInterceptor    
  @GetMapping("/users") 
  List<User> getUsers();
} 

такgetUsers()Нет необходимости добавлять методыlimitпараметриAuthorization заголовок.

  1. Соглашение о контракте Фейна:

Методы Feign Maps для запроса шаблонов через соглашение о контракте, включая привязку запроса, правила сопоставления URL-адресов и т. д. Контракты, предоставленные Feign, включают:

  • DefaultContract: простое соглашение, которое сопоставляет имена методов с одним и тем же URL-адресом и использует аннотации JAXRS для привязки параметров.
  • SpringMvcContract: принимает соглашения SpringMVC, поддерживает переменные пути, параметры запроса и т. д. и ближе к стилю разработки Spring.
  • HystrixDelegatingContract: на основе SpringMvcContract создайте HystrixCommand для каждого метода для поддержки отказоустойчивости.

Мы можем пройтиfeign.client.contractуказатьContract,Или унаследуйте Контракт для настройки. Контракт позволяет нам изменить соглашение о вызовах Притворяться.,Адаптируйте его к различным стилям.

Здесь мы познакомим вас с поддержкой наследования, шаблонами запросов, договорными соглашениями и т. д. в Feign. Понимание этого содержимого позволяет нам иметь более широкий выбор и возможности при разработке интерфейсов Feign и вызовов методов. Хотя Feign прост и удобен в использовании, его механизм на самом деле достаточно гибок и богат, чтобы удовлетворить наши потребности в настройке.

  1. Притворяться Перехватчик:

Feign поддерживает использование перехватчиков для перехвата своих запросов. Мы можем реализовать следующие перехватчики:

  • RequestInterceptor: перехватывает запрос перед его отправкой и может изменить запрос.
  • ResponseInterceptor: перехватывает после получения ответа и может изменить ответ.
  • ErrorInterceptor: перехватывает возникновение исключения, и вы можете изменить или повторить запрос.

может пройти feign.client.config.defaultInterceptorsДобавить перехватчик,нравиться:

Язык кода:javascript
копировать
feign:
  client:
    config:
      defaultInterceptors:
        - feign.auth.BasicAuthRequestInterceptor  #Добавляем перехватчик BasicAuth
        - com.example.logging.LoggingInterceptor  #Добавляем перехватчик журналов 

Вы также можете добавить перехватчики для указанного FeignClient:

Язык кода:javascript
копировать
@FeignClient(name="example", configuration = ExampleFeignConfig.class) 
public interface ExampleFeignClient {
}

@Configuration
class ExampleFeignConfig {
  @Bean
  public RequestInterceptor requestInterceptor() {
    return new BasicAuthRequestInterceptor("username", "password");  
  }  
}

Перехватчики позволяют более гибко настраивать поведение Feign и реализовывать сложную логику обработки запросов.

  1. Декодер Фейна:

FeignИспользуется по умолчаниюResponseEntityDecoder对ответруководитьдекодирование,расшифровать это какResponseEntity<T>объект。мы можемвыполнить Собственныйиздекодирование器,нравиться:

Язык кода:javascript
копировать
public class ExampleDecoder implements Decoder {
  @Override
  public Object decode(Response response, Type type) {
    if (type == Example.class) {
      //Настраиваемое декодирование ответа
      return ... ; 
    } 
  }
}

Затемпроходитьfeign.client.config.decoderУкажите этот декодер,нравиться:

Язык кода:javascript
копировать
feign:
  client: 
    config:
      example:   #Указанное имя FeignClient
        decoder: com.example.ExampleDecoder

Настраиваемый декодер позволяет нам преобразовывать и настраивать ответ Feign в соответствии с форматом ответа службы.

  1. Валидатор Feign:

Feign также поддерживает валидатор Validator.,Когда полученный ответ не может быть правильно декодирован,Можетиспользоватьвалидаторруководить Вторая проверкаииметь дело с。мы должнывыполнитьValidatorинтерфейс,И назначен для использования FeignClient.

Перехватчики, декодеры и валидаторы Feign позволяют нам гибко настраивать процесс обработки запросов/ответов Feign, что также является отражением высокой масштабируемости Feign. Используя эти механизмы, мы можем легко позволить Feign поддерживать индивидуальные форматы протоколов и сложные процессы запросов/ответов. Это делает Feign не только простым HTTP-клиентом, но и многофункциональным универсальным решением для вызова служб.

  1. ПритворятьсяAPIоптимизация:

По мере развития бизнеса,ПритворятьсяAPI будет становиться все больше и больше,这会带Приходить一定из Сложность обслуживания。Мы можем пройти Следующий способоптимизация ПритворятьсяAPI:

  • Разделите FeignClient в соответствии с бизнес-модулями: не определяйте слишком большой FeignClient. Вы можете разделить его на несколько FeignClient в соответствии с бизнес-модулями.
  • Используйте наследование интерфейсов для абстракции: определите базовый интерфейс, разрешите наследование другим интерфейсам и извлеките общедоступные методы.
  • Используйте шаблоны запросов, чтобы уменьшить количество повторяющихся аннотаций. Используйте механизм шаблонов запросов Feign, чтобы уменьшить количество повторяющихся аннотаций в методах Feign.
  • Используйте DTO в качестве параметров метода. Не используйте базовые типы в качестве параметров метода Feign. Вместо этого используйте объекты DTO, чтобы сделать метод более семантическим.
  • Выберите имена семантических методов: дайте методам Feign семантическое имя, а не только URL-адрес.
  • Извлечение общедоступных параметров как констант: если некоторые методы Feign имеют большое количество повторяющихся параметров, их можно извлечь как константу, и только эта константа передается в метод.
  • Используйте режим Builder для создания сложных параметров. Если для метода Feign требуется сложный параметр, вы можете использовать режим Builder для создания параметра вместо определения слишком большого DTO параметра.

Эти меры по оптимизации могут сделать наш Feign API более понятным и простым в обслуживании. Хотя Feign прост, по мере роста бизнеса его может стать сложно поддерживать, если не управлять им, поэтому оптимизация API становится более важной темой.

  1. Дополнительные параметры для Feign:

Feign по умолчанию использует аннотации JAXRS для сопоставления методов с HTTP-запросами, но аннотации JAXRS не поддерживают необязательные параметры. Для поддержки необязательных параметров мы можем:

  • Определите значения по умолчанию для необязательных параметров:
Язык кода:javascript
копировать
@GetMapping("/users")
List<User> getUsers(@RequestParam(value="age", required=false) Integer age); 
  • использовать@Nullableаннотация标记可选параметр:
Язык кода:javascript
копировать
@GetMapping("/users")
List<User> getUsers(@Nullable @RequestParam Integer age);
  • Добавитьjava.util.Optional<T>добрый型изпараметр:
Язык кода:javascript
копировать
@GetMapping("/users")
List<User> getUsers(Optional<@RequestParam Integer> age); 
  • Используйте режим Builder для построения параметров, при этом необязательные параметры не передаются в Builder:
Язык кода:javascript
копировать
@GetMapping("/users") 
List<User> getUsers(UserSearchCriteria criteria);

UserSearchCriteria criteria = UserSearchCriteria.builder()  
                                          .age(30)  
                                          .build();

Эти методы могут заставить наш интерфейс Feign поддерживать дополнительные параметры и стать более гибким.

  1. Загрузка файла Feign:

По умолчанию Feign не поддерживает загрузку файлов напрямую. У нас есть следующие способы реализовать это:

  • использоватьfeign.codec.Encodedecode.MultiPartFormContentкодер:
Язык кода:javascript
копировать
@PostMapping("/upload")
void uploadFile(@Part("file") RequestBody file); 

Затем добавьте в FeignClient:

Язык кода:javascript
копировать
@FeignClient(configuration=MultipartSupportConfig.class)
public interface FileUploadClient {
} 

@Configuration
public class MultipartSupportConfig {
  @Bean
  public Encoder feignEncoder() {
    return new MultipartFormContent();
  }
}  
  • Непосредственно вызовите базовый клиент Feign для загрузки файлов:
Язык кода:javascript
копировать
@PostMapping("/upload")
void uploadFile(); 

public void uploadFile() {
  Client client = ...;  //получать ПритворятьсяClient  Request request = ... //Создаем запрос на загрузку файла
  client.execute(request); 
}
  • Используйте перехватчик Feign для получения файла, а затем вручную создайте запрос MultiPart:
Язык кода:javascript
копировать
@PostMapping("/upload")
void uploadFile();  

public void uploadFile() {
  File file = ...; //Получаем файл для загрузки
  String uploadUrl = ...; //Получить URL-адрес загрузки
  
  //Вручную создаем многочастный запрос
  MultiPartRequest request = new MultiPartRequest(uploadUrl);
  request.addFile("file", file);
  ... ...
} 

Эти методы позволяют нашему интерфейсу Feign поддерживать функцию загрузки файлов и подключаться к сервисам, требующим загрузки файлов.

Feign прост и удобен в использовании.,Но мы также можем использовать различные способы расширения,Реализация более сложных требований к вызову.

  1. Поддержка OAuth2 Feign:

Feign не поддерживает OAuth2 по умолчанию.,Мы можем проход реализуется следующими способами:

  • Настройте перехватчик RequestInterceptor и добавьте заголовок авторизации OAuth2 к каждому запросу.
  • Расширьте контракт Feign и добавьте данные заголовка авторизации OAuth2 в каждый шаблон запроса.
  • Используя поддержку OAuth2 Zuul, получите токен доступа на шлюзе, а затем переправьте его клиенту Feign.
  • Непосредственное использование базового клиента Притворяться.,перед выполнением каждого запроса,Получить токен доступа с сервера OAuth2Служить,И вручную добавить его в заголовок запроса.

Поддержка Hystrix от Feign

Feign обеспечивает интегрированную поддержку Hystrix по умолчанию, и мы можем легко включить Hystrix для интерфейса Feign. Основные методы следующие:

  • Укажите глобально в application.yml:
Язык кода:javascript
копировать
feign:
  hystrix:
    enabled: true
  • Укажите резервный вариант в @FeignClient:
Язык кода:javascript
копировать
@FeignClient(name = "user", fallback = UserClientFallback.class)
public interface UserClient {
}
  • Реализовать FallbackFactory:
Язык кода:javascript
копировать
@Component 
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
  @Override
  public UserClient create(Throwable cause) {
    return new UserClientFallback(cause); 
  }
}

@FeignClient(name = "user", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient { 
}
  • Настройте атрибут команды Hystrix:
Язык кода:javascript
копировать
feign:
  client:
    config:
      user:  #FeignClientName
        hystrix:
          command:  #HystrixCommandConfiguration
            default:
              execution.isolation.thread.timeoutInMilliseconds: 1000 
  • Настройте пул потоков Hystrix и стратегию изоляции семафоров:
Язык кода:javascript
копировать
@Configuration
public class FeignHystrixConcurrencyStrategy {
  @Bean
  public HystrixConcurrencyStrategy feignHystrixConcurrencyStrategy() {
    return hystrixConfig -> {  
      // сделанный на заказ Hystrix Стратегия пула потоков
      HystrixThreadPoolProperties.Setter()...
      // сделанный на заказ Hystrix Стратегия изоляции семафора  HystrixSemaphoreProperties.Setter()... 
    };
  }
}

Поддержка Hystrix от Feign позволяет нам легко применять меры по объединению и отказоустойчивости к интерфейсу Feign для повышения стабильности микросервисов.

Практический пример Фейна

Вот лучший пример Feign:

Язык кода:javascript
копировать
@FeignClient(name = "order", url = "http://order-service")
public interface OrderClient {
    @GetMapping("/orders/{id}")
    Order getOrder(@PathVariable("id") Long id);
}

@FeignClient(name = "inventory", url = "http://inventory-service")
public interface InventoryClient {
    @GetMapping("/inventories/{productId}")
    Product getInventory(@PathVariable("productId") String productId);
}

@Service
public class BussinessService {
    @Autowired
    private OrderClient orderClient;
    @Autowired
    private InventoryClient inventoryClient;

    public void purchase(Long orderId, String customer) {
        //Порядок запроса
        Order order = orderClient.getOrder(orderId);
        //Запрос инвентаря
        Product product = inventoryClient.getInventory(order.getProductId()); 
        //Осуществляем процесс покупки
        //...
    }
}

Это простой бизнес-сценарий закупок, который в основном включает в себя:

  • OrderClient: используется для вызова Ordermicroservices.,Предоставьте методы запроса заказа.
  • InventoryClient: используется для вызова Inventoryмикросервисов и предоставления методов запроса инвентаризации.
  • BussinessService: обеспечивает бизнес-логику закупок через Feign. ClientвызовOrderиInventoryСлужить。
  • Здесь OrderClient и InventoryClient объявлены как Feign. Клиент, укажите адрес Служить через URL, используя стандартные Spring Аннотации. MVC.
  • BussinessService может вызывать этих Feign Clients так же легко, как и локальные методы.
  • Эти клиенты Feign естественным образом поддерживают балансировку нагрузки ленты, и нам не нужна дополнительная настройка.
  • Вы также можете легко включить механизм автоматического выключателя Hystrix для этих клиентов Feign.

Это типичный пример передовой практики Feign. Feign используется для реализации вызовов между микросервисами, что одновременно просто и элегантно.

Модель нити Фейна

Feign по умолчанию использует модель потоков SimpleClient, и ее основные функции заключаются в следующем:

  • Клиент имеет только один поток, и все запросы выполняются последовательно.
  • Этот поток также отвечает за инициацию соединений, передачу ответов и другие задачи.
  • Поток будет блокироваться во время простоя, чтобы уменьшить использование ресурсов.
  • Статус демона этого потока закрывается при закрытии приложения.

Эта простая модель потоков может эффективно снизить затраты на переключение потоков и управление ими, а также повысить производительность. Но есть и несколько проблем:

  • Медленный запрос может блокировать другие запросы, влияя на общую задержку.
  • Невозможно полностью использовать ресурсы в среде с высоким уровнем параллелизма.
  • Трудно настроить, использование потоков неконтролируемо.

Для этой цели Feign также предлагает другие модели резьбонарезания:

  • HystrixFeign: обеспечивает изоляцию через пул потоков Hystrix, чтобы предотвратить влияние медленного запроса на другие запросы и повысить отказоустойчивость.
  • Пул потоков Feign: используя собственный пул потоков, вы можете настроить количество потоков, улучшить параллелизм и контролировать задержку, а также лучше использовать ресурсы.

может пройтинастраиватьfeign.client.config.default Элемент конфигурации для выбора модели резьбы.

Выбор подходящей модели потоков может значительно оптимизировать производительность Feign, улучшить использование ресурсов и отказоустойчивость. Но есть и компромисс со сложностью соответствующей конфигурации.

Пул соединений Feign

Feign также по умолчанию использует пул соединений, и его основные функции заключаются в следующем:

  • Максимальное количество подключений по умолчанию — 200.
  • Время простоя соединения по умолчанию составляет 60 секунд и будет закрыто по истечении времени ожидания.
  • По умолчанию поддерживаются 100 долгосрочных подключений со временем открытия соединения более 30 секунд.
  • Пул соединений реализован с помощью CommonsPool, который прост и надежен.

Мы можем пройтиfeign.client.configКонфигурацияпул соединенийпараметр,нравиться:

Язык кода:javascript
копировать
feign:
  client: 
    config:
      default: 
        pool: 
          maxTotal: 500     #Максимальное количество подключений
          maxPerRoute: 50   #Максимальное количество соединений на маршруте  
          validateAfterInactivity: 1s #Проверка времени простоя соединения      

Конфигурация и оптимизация пула соединений также являются важной частью повышения производительности и стабильности Feign.

Управление HTTP-соединениями Feign

Управление HTTP-соединениями Feign в основном включает в себя:

  • Длинное соединение и короткое соединение: Feign по умолчанию использует заголовок Keep-Alive для поддержания длительного соединения. Вы можете настроить ConnectionTimeout, чтобы указать максимальное время выживания соединения. Он также поддерживает настройку короткого замыкания соединения.
  • Максимальное количество подключений: каждый URL-адрес соответствует пулу подключений (200). Вы можете настроить настройку maxConnections.
  • Повторное использование соединения: запросы к одному и тому же хосту и соединению могут повторно использовать соединение для достижения повторного использования соединения. если соединение не закрыто.
  • Управление неактивными соединениями: Feign будет регулярно очищать соединения, время простоя которых превысило определенное время. По умолчанию — 60 секунд. Настраиваемая настройкаdleTimeout.
  • Очистка мертвых соединений: Feign также будет регулярно очищать мертвые соединения, время жизни которых превысило максимальное. По умолчанию — 5 минут. Настраиваемая настройка timeToLive.
  • Прогрев соединения: при первом доступе к URL-адресу,Фейн заранее установит определенное количество связей со Служить,По умолчанию установлено максимальное количество подключений для URL-адреса.,Включите быстрый ответ. Предварительный нагрев можно отключить,Настройте параметр InitialLineRequests на 0.

Эти механизмы управления соединениями могут позволить Feign полностью повторно использовать соединения, разумно распределять ресурсы соединений и достигать эффективного сетевого ввода-вывода. Однако конфигурации также необходимо взвешивать на основе реальных сценариев:

  • Длительное время соединения слишком велико, и ресурсы соединения могут быть чрезмерно заняты.
  • Если время истечения простоя соединения слишком короткое, соединение не может быть полностью использовано повторно, что приводит к дополнительным издержкам.
  • Слишком много подключений для разогрева, задержка на этапе запуска велика, а возможности параллелизма могут быть ограничены.
  • Частота регулярной очистки слишком низкая, и неисправные соединения не могут быть быстро отключены, что приводит к пустой трате ресурсов.

Таким образом, конфигурация параметров управления соединениями Feign должна быть настроена с всесторонним учетом показателей стабильности системы, одновременного выполнения и задержки.

Кодер и декодер Фейна

Feign обеспечивает поддержку кодирования и декодирования JSON по умолчанию, а также мы расширяем возможности кодирования и декодирования «Притворяться» с помощью интерфейсов «может пройтиEncoder» и «Decoder». Общие кодеки включают:

  • ContentTypeDecoder: анализирует тело ответа в соответствии с Content-Type, поддерживая несколько форматов.
  • FormEncoder: закодировать запрос формы, Content-Type — application/x-www-form-urlencoded.
  • XMLDecoder/XMLEncoder: поддержка кодирования и декодирования формата XML.
  • GZIPDecoder/GZIPEncoder: поддерживает декодирование сжатых ответов GZIP и кодирование запросов.
  • CBORDecoder/CBOREncoder: поддерживает кодирование и декодирование двоичного формата CBOR с более высокой производительностью.

Расширение кодека Feign может поддерживать больше форматов ответов и запросов, таких как XML, Protobuf, CBOR и т. д., для достижения диверсифицированной интеграции сервисов. Мы можем проход распространяется двумя способами:

  1. Глобальная конфигурация: переопределить свойства feign.codec.decoder и feign.codec.encoder.
  2. Локальная конфигурация: укажите декодер и кодировщик для FeignClient.

Например, чтобы настроить кодек XML:

Язык кода:javascript
копировать
feign:
  client: 
    config:
      default: 
        decoder: feign.codec.xml.XMLDecoder
        encoder: feign.codec.xml.XMLEncoder

Настройте клиента:

Язык кода:javascript
копировать
@FeignClient(name="clientName", decoder = XMLDecoder.class, encoder = XMLEncoder.class)
public interface ClientInterface {
}  

Расширяя возможности кодирования и декодирования Feign, он может не только поддерживать традиционный интерфейс JSON/XML, но также взаимодействовать с пользовательскими кодеками для достижения интеграции интерфейса в любом формате, становясь единым входом планирования для подключения различных сервисов.

Добавленная информация в заголовке Feign

Feignможет пройти Добавить информацию заголовка запроса следующими способами:

  1. Аннотация @Header к методу:
Язык кода:javascript
копировать
@FeignClient("serviceName")
public interface Client {        
   @RequestMapping(method = RequestMethod.GET, "/hello")
   @Header("token: 1234")   //Добавляем информацию заголовка
   String hello();
}
  1. Добавьте атрибут defaultHeaders в FeignClient:
Язык кода:javascript
копировать
@FeignClient(name = "clientName", defaultHeaders = {
   "token: 1234"              
})
public interface Client {  
   //...
}
  1. Разместите feign.client.headers:
Язык кода:javascript
копировать
feign:
  client:
    headers: 
      token: 1234   
  1. Добавьте HeaderInterceptor в метод:
Язык кода:javascript
копировать
@FeignClient(name = "clientName")
public interface Client {
   @RequestMapping(method = RequestMethod.GET, "/hello")
   String hello(); 
}

//Header Interceptor
public class HeaderInterceptor implements RequestInterceptor {
   @Override
   public void apply(RequestTemplate template) {
       template.header("token", "1234"); 
   }
}

//Добавляем перехватчик в интерфейс клиента 
@FeignClient(name = "clientName",interceptors = HeaderInterceptor.class )
public interface Client {  
   // ...
}

Feign предоставляет несколько способов добавления заголовков запросов для аутентификации службы, передачи контекста и других функций. Однако метод настройки относительно разбросан, а обслуживание немного неудобно.

Вот и все об этой статье,Мы много рассказываем об опыте использования притворства и оптимизации.,Я считаю, что это может помочь каждому правильно использовать его в реальных производственных проектах.

boy illustration
Node.js
boy illustration
Анализ исходного кода, связанный с запланированными задачами версии ruoyi-vue (7), то есть анализ модуля ruoyi-quartz.
boy illustration
Вход в систему с помощью скан-кода WeChat (1) — объяснение процесса входа в систему со скан-кодом, получение авторизованного QR-кода для входа.
boy illustration
HikariPool-1 — обнаружено отсутствие потока или скачок тактовой частоты, а также конфигурация источника данных Hikari.
boy illustration
Сравнение высокопроизводительной библиотеки JSON Go
boy illustration
Простое руководство по извлечению аудио с помощью FFmpeg
boy illustration
Подсчитайте количество строк кода в проекте
boy illustration
Spring Boot элегантно реализует многопользовательскую архитектуру: концепции и практика
boy illustration
Как интегрировать функцию оповещения корпоративного WeChat в систему планирования xxl-job
boy illustration
SpringBoot интегрирует отправку сообщений через веб-сокет в режиме реального времени
boy illustration
Краткий анализ основных библиотек журналов в Go: узнайте, как интегрировать функции вращения и резки бревен на уровне проектирования.
boy illustration
Реализация API-шлюза с нуля-Golang
boy illustration
[Разговорный сайт] Как Springboot получает значения свойств из файлов конфигурации yml или свойств
boy illustration
Spring Boot — синхронные события приложения против асинхронных событий публикации и подписки. Практический бой
boy illustration
Spring Boot использует Swagger3 для создания документов интерфейса API.
boy illustration
[1269] Использование Gunicorn для развертывания проектов flask.
boy illustration
Краткое изложение 10 способов регистрации bean-компонентов в SpringBoot
boy illustration
Flask Learning-9. 2 способа включения режима отладки (debug mode).
boy illustration
Руководство по настройке самостоятельного сервера для Eudemons Parlu
boy illustration
40 вопросов для собеседований по SpringBoot, которые необходимо задавать на собеседованиях! При необходимости ответьте на вопросы для собеседования SpringBoot [предлагаемый сборник] [легко понять]
boy illustration
Через два года JVM может быть заменен GraalVM.
boy illustration
Разрешение циклических зависимостей Spring Bean: существует ли неразрешимая циклическая ссылка?
boy illustration
Разница между промежуточным программным обеспечением ASP.NET Core и фильтрами
boy illustration
[Серия Foolish Old Man] Ноябрь 2023 г. Специальная тема Winform Control Элемент управления DataGridView Подробное объяснение
boy illustration
.NET Как загрузить файлы через HttpWebRequest
boy illustration
[Веселый проект Docker] Обновленная версия 2023 года! Создайте эксклюзивный инструмент управления паролями за 10 минут — Vaultwarden
boy illustration
Высокопроизводительная библиотека бревен Golang zap + компонент для резки бревен лесоруба подробное объяснение
boy illustration
Концепция и использование Springboot ConstraintValidator
boy illustration
Новые функции Go 1.23: точная настройка основных библиотек, таких как срезы и синхронизация, значительно улучшающая процесс разработки.
boy illustration
[Весна] Введение и базовое использование AOP в Spring, SpringBoot использует AOP.