Feign — декларативный клиент веб-службы. Это упрощает вызовы между микросервисами. Feign имеет подключаемую поддержку аннотаций, включая аннотации Feign и аннотации JAX-RS. Feign также поддерживает подключаемые кодеры и декодеры. В Spring Cloud добавлена поддержка аннотаций Spring MVC, а также поддерживается Spring WebFlux.
Feign можно комбинировать с Eureka и Ribbon для поддержки балансировки нагрузки.
Основное содержание этой статьи включает в себя:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
@FeignClient
аннотация//определить Притвориться интерфейс
@FeignClient("эврика-клиент")
общедоступный интерфейс ComputeClient {
@GetMapping("/добавить")
int add(@RequestParam(value = "a") int a, @RequestParam(value = "b") int b);
}
@FeignClient("eureka-client")
Указан для звонка Служитьимя,Здесь называется эврика-клиент Служить, зарегистрированный в Эврике.
@FeignClient
серединаизинтерфейсиспользоватьSpring Аннотации MVC для объявления Web Запрос на обслуживание
@EnableFeignClients
аннотациявключать Притворяться Функция
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@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-адресом в аннотации. Как это работает:
@FeignClient
изvalueнайдено значение Служить,Если настроен центр регистрации «Служить»,Список экземпляров Служить также получается на основе имени Служить.Feign предоставляет различные методы настройки:
feign:
client:
config:
default:
loggerLevel: FULL
Если установлено значение «ВСЕ», будут отображены полные сведения журнала запросов и ответов.
@Component
public class CustomEncoder implements Encoder {
//...
}
@Bean
public Encoder feignEncoder() {
return new CustomEncoder();
}
RequestInterceptor
и ResponseInterceptor
интерфейс Приходитьсделанный на заказперехватить запросиответ。@Bean
public RequestInterceptor requestInterceptor() {
return template -> {
//Пользовательская логика...
template.header("Content-Type", "application/json");
};
}
@FeignClient("some-service")
public interface SomeServiceClient extends SomeService {
@Override
@GetMapping("/{path}")
String doSomething(@PathVariable("path") String path);
}
Вы также столкнетесь с некоторыми проблемами при использовании Feign в реальных проектах. Вот несколько практических советов по эксплуатации и обслуживанию:
feign:
client:
config:
default:
httpClient:
enabled: true
connectionTimeout: 5000
followRedirects: true
loggerLevel: full
okhttp:
enabled: true # Включите Ок Хттп
connectTimeout
:Тайм-аут соединения,По умолчанию — 10 секунд.readTimeout
:Тайм-аут чтения,По умолчанию — 60 секунд.Мы можем установить его в соответствии с трудоемкими вызовами службы, чтобы избежать тайм-аутов.
оfeignПараметры конфигурации по умолчанию можно найти вFeignClientConfiguration
Класс исходного кодаиз Полесвойство。
fallback
Укажите понижение версиивыполнитьдобрый。@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 будет вызван как возврат к более ранней версии.
feign:
client:
retry:
enabled: true # Включить повторную попытку
maxAttempts: 5 # Максимальное количество повторов
period: 5000 # Интервал повтора
См. класс исходного кода:feign.Retryer.Default
。
ribbon:
ConnectTimeout: 1000 # Тайм-аут соединения
ReadTimeout: 3000 # Тайм-аут чтения
OkToRetryOnAllOperations: true # Повторять ли все методы запроса
MaxAutoRetriesNextServer: 1 # После переключения экземпляровиз Максимальное количество повторов
Обычно это вызвано неправильным URL-адресом, указанным Feign. Мы можем:
@FeignClient
серединаизvalueЗначение правильное,Соответствует названию Служить в регистрационном центре Служить.Обычно для этого есть две причины:
readTimeout
。Для этого есть две основные причины:
@FeignClient
Не указанfallback
свойство,Понижение классов реализации не происходит. В этом случае необходимо добавить класс понижения.@Component
аннотация,или увеличить@FeignClient
изfallbackFactory
Укажите фабричный класс для создания экземпляров пониженной версии класса.。Это связано с тем, что существует два способа установить уровень журнала Feign с разными приоритетами:
logging.level.xx=DEBUG
настраивать Притворяться Уровень журнала,Высокий приоритет.feign.Client.config.loggerLevel=FULL
настраивать,Низкий приоритет.Итак, если оба метода установлены одновременно,logging.level.xx=DEBUG
изнастраиватьпокроетfeign.Client.config.loggerLevel=FULL
。нам просто нужнонастраивать Только один путь,и приоритетное использованиеlogging.level.xx=DEBUG
настраиватьFeignУровень журнала。
Может. Клиент Feign по умолчанию поддерживает HTTPS. Вам нужно только указать протокол https и конфигурацию, связанную с сертификатом, в URL-адресе @FeignClient. Вы также можете использовать ApacheHttpClient для замены клиента по умолчанию и реализации более сложной схемы вызовов HTTPS.
поддерживать. Feign может передавать значение формы формы через аннотацию @RequestParam SpringMVC, а также поддерживает тип запроса application/x-www-form-urlencoded. В притворстве Используйте @RequestMapping(метод в методе Client = RequestMethod.POST)и@RequestParamВот и всеFormпредставлять на рассмотрение。
Это несколько распространенных проблем и решений при использовании Feign. Понимая принципы Feign и имея опыт выявления ошибок, вы сможете лучше использовать и поддерживать Feign, а также сделать его приложение более стабильным.
Производительность Feign как компонента вызова сервисов также является тем, что нам необходимо учитывать. Вот несколько советов по оптимизации производительности Feign:
Feign использует пул потоков JDK по умолчанию, который мы можем настроить:
@Bean
public ExecutorService feignExecutorService(){
// Установите количество основных потоков, максимальное количество потоков, размер очереди и время задержки при освобождении ресурсов.
return new ThreadPoolExecutor(xx, yy, zz, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(zzz),
new NamedThreadFactory("feign"));
}
Хотя журналы Feign можно использовать для отладки, слишком подробные уровни журналов будут влиять на производительность, поэтому вы можете установить разные уровни журналов в зависимости от среды:
Feign поддерживает сжатие запросов и ответов GZIP для повышения производительности передачи по сети. Мы можем включить:
feign:
compression:
request:
enabled: true # Включить сжатие запроса GZIP
response:
enabled: true # Включить адаптивное сжатие GZIP
Вышеупомянутые решения по оптимизации могут значительно улучшить производительность Feign и сделать его более подходящим для производственных сред. Однако оптимизация всегда требует затрат, и ее необходимо взвешивать и настраивать с учетом реальных условий, таких как пропускная способность системы и каналы связи.
Также важно протестировать производительность и надежность клиента Feign. Вот несколько рекомендаций по тестированию:
Мы можем написать модульные тесты для интерфейса Feign, вызвать интерфейс и проверить результаты ответа, чтобы убедиться в правильности логики интерфейса.
@RunWith(SpringRunner.class)
@SpringBootTest
public class ComputeClientTest {
@Autowired
private ComputeClient computeClient;
@Test
public void testAdd() {
int result = computeClient.add(1, 2);
assertEquals(3, result);
}
}
Запустите все службы, а затем вызовите клиент Feign для сквозного тестирования, чтобы проверить правильность всего процесса и результатов.
Используйте такие инструменты, как JMeter, для выполнения больших одновременных вызовов к клиенту Feign и проверки соответствия производительности Feign стандарту при высокой нагрузке. Основное внимание:
Эти тесты могут эффективно проверить надежность клиента Feign и гарантировать его стабильную работу в сложных средах. Мы также можем разработать различные показатели производительности и показатели доступности, исходя из важности системы и масштаба трафика, а также провести строгую оценку SLA на Feign.
Примените некоторые популярные фреймворки, такие как:
Это может лучше обеспечить высокую доступность Feign. Таким образом, тестирование и защита от перегрузки являются важной частью обеспечения стабильности Feign. Мы надеемся, что благодаря этим методам тестирования и приложениям платформы Feign сможет работать более надежно в сложных средах.
Для микросервисной системы вызов службы является очень важным звеном. Как важный компонент вызова, высокая доступность Feign напрямую влияет на высокую доступность всей системы. Вот несколько решений для повышения высокой доступности Feign:
Feign часто используется совместно с центрами регистрации служб, такими как Eureka и Consul. Эти центры регистрации служб также поддерживают развертывание кластеров, что может повысить высокую доступность вызовов службы Feign.
С помощью встроенного компонента Feign Ribbon мы можем настроить несколько экземпляров службы и выбрать подходящую стратегию балансировки нагрузки, чтобы избежать единых точек отказа.
Hystrix может защитить Feign с помощью изоляции потоков, автоматического выключателя и других стратегий, позволяющих избежать перегрузки сервисов при высоком уровне параллелизма. Механизм автоматического выключателя может быстро выйти из строя, чтобы избежать блокировки операций.
Использование пулов соединений, таких как HTTP-клиент Apache, OKHttp и т. д., позволяет повторно использовать соединения и избегать установления новых соединений для каждого вызова. Сами эти клиенты также поддерживают настройку высокой доступности, например установку нескольких URL-адресов.
Правильная настройка тайм-аута соединения и тайм-аута чтения Feign позволяет быстро обнаружить проблемы со службами и быстро выйти из строя, избегая слишком длительного использования ресурсов. Взаимодействуйте с механизмом повторных попыток, чтобы быстро вернуться после определенного количества раз, чтобы не допустить, чтобы долгосрочные недоступные службы приводили к недоступности системы.
Помимо Hystrix, компоненты с открытым исходным кодом, такие как Resilience4J, можно использовать для более комплексных и мощных автоматических выключателей, ограничения тока и повторных попыток. Ограничение тока может предотвратить внезапный высокий трафик, вызывающий недоступность системы.
Используйте такие компоненты, как Zipkin, для отслеживания ссылок на вызовы служб. При возникновении высокой задержки или недоступности служб вы можете быстро обнаружить проблему.
Укажите резервную стратегию и соответствующие стратегии перехода на более раннюю версию для интерфейса Feign, чтобы предоставить альтернативы, когда служба недоступна, чтобы избежать недоступности служб, вызывающих полную недоступность зависимых служб.
Правильно настройте уровень журнала Feign и отслеживайте его с помощью инструментов сбора журналов, таких как ELK. При возникновении отклонений в работе службы проблема может быть быстро обнаружена и локализована.
Таким образом, высокая доступность Feign требует многогранных гарантий, а также эксплуатации и обслуживания. Для совместного улучшения производительности Feign необходимо сотрудничать с центром регистрации услуг, компонентами автоматического выключателя и ограничения тока, компонентами отслеживания ссылок, компонентами журнала мониторинга и т. д. и вся система микросервисов, которая на этом основана. Высокая доступность.
Понимание исходного кода Feign поможет нам глубже понять принцип его работы, чтобы мы могли разумно использовать и настраивать Feign. Вот краткий анализ исходного кода Feign:
Это основные компоненты Feign. Feign эффективен и гибок именно потому, что эти компоненты используют дизайн интерфейса, что позволяет нам гибко выбирать и заменять их. Понимание функций и взаимоотношений этих компонентов поможет нам использовать исходный код Feign для индивидуальной разработки.
Feign и OpenFeign — это декларативные HTTP-клиенты Netflix с открытым исходным кодом, но есть определенные различия:
Feign возник из Netflix, позже был передан в дар Spring Cloud и стал частью Spring Cloud Netflix. OpenFeign — это усовершенствованная версия Feign в Spring Cloud, которая становится неотъемлемой частью Spring Cloud. Цель состоит в том, чтобы предоставить новые функции, такие как поддержка аннотаций Spring MVC и механизмов ошибочного прослушивания.
Feign поддерживает только аннотации JAX-RS и не поддерживает аннотации Spring MVC. OpenFeign поддерживает аннотации Spring MVC, которые ближе к опыту разработки Spring и поддерживают согласование, проверку и другие механизмы содержимого.
Feign поддерживает только три кодека: QueryStringEncoder, FormEncoder и JsonEncoder. OpenFeign имеет встроенные SpringEncoder и StringDecoder, которые поддерживают кодирование и декодирование более сложных объектов и HTTP-запросов, таких как коллекции, карты и т. д.
Feign поддерживает только сопоставление между сигнатурами методов интерфейса и URL-адресами, а детали запроса нельзя настроить. OpenFeign поддерживает SpringMvcContract, который может настраивать методы запроса, привязку параметров и другие детали.
Feign не поддерживает перехватчики запросов и ответов. OpenFeign поддерживает ClientRequestInterceptor и ClientResponseInterceptor, позволяя перехватывать и настраивать запросы и ответы Feign.
Feign не поддерживает мониторинг индикаторов и событий. OpenFeign поддерживает индикаторы мониторинга, такие как размер пула соединений, количество запросов, время обработки и такие события, как успешное и неудачное соединение. Удобно отслеживать рабочее состояние Feign.
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 — широко используемые HTTP-клиенты, но они имеют следующие основные различия:
Использование RestTemplate ближе к традиционному HTTP API, который требует ручного создания URL-адресов, параметров сращивания и т. д.:
RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/users?name={name}";
String result = restTemplate.getForObject(url, String.class, "Jack");
Использование притворства декларативным способом.,Просто определите интерфейс и аннотируйте его,Более ориентированный на интерфейс:
@FeignClient("example.com")
public interface UserClient {
@GetMapping("/users")
String getUser(@RequestParam("name") String name);
}
Интерфейс Feign более абстрактный, скрывает детали реализации и облегчает последующее обслуживание и замену. Вызывающий метод RestTemplate слишком специфичен и не способствует изменениям.
Feign имеет более широкие возможности расширения, такие как поддержка нескольких кодеков, перехватчиков, клиентов и т. д. Расширение RestTemplate сложнее.
Feign имеет встроенные механизмы балансировки нагрузки, повторных попыток, мониторинга и другие механизмы. Для завершения RestTemplate необходимо использовать вместе с другими компонентами, такими как Ribbon и т. д.
Feign является частью Spring Cloud и глубоко интегрирован со средой Spring. RestTemplate необходимо отдельно интегрировать с Spring.
Понимание этого содержания может дать нам более полное представление о Feign и других компонентах микросервисов, а также узнать взаимосвязи и различия между ними, что поможет нам сделать лучший выбор и комбинации при разработке решений для микросервисов. Хотя Feign очень мощный инструмент, он обычно не существует изолированно, а используется в сочетании с другими компонентами для повышения ценности.
Feign по своей сути поддерживает наследование интерфейсов, а подинтерфейсы автоматически наследуют методы и аннотации родительского интерфейса. Это позволяет нам разработать четко иерархический интерфейс Feign, например:
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()
два метода。
Иногда в нашем методе Feign присутствует большое количество повторяющихся аннотаций и параметров. В этом случае для их извлечения можно использовать шаблон запроса Feign. нравиться:
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor basicAuthRequestInterceptor() {
return template -> {
template.header("Authorization", "Basic YWRtaW46YWRtaW4=");
template.query("limit", 100);
};
}
}
затем в@FeignClient
указано вэтот Перехватчик:
@FeignClient(name = "example", configuration = FeignConfig.class)
public interface ExampleFeignClient {
//Этот метод автоматически унаследует параметры шаблона в BasicAuthRequestInterceptor
@GetMapping("/users")
List<User> getUsers();
}
такgetUsers()
Нет необходимости добавлять методыlimit
параметриAuthorization
заголовок.
Методы Feign Maps для запроса шаблонов через соглашение о контракте, включая привязку запроса, правила сопоставления URL-адресов и т. д. Контракты, предоставленные Feign, включают:
Мы можем пройтиfeign.client.contract
указатьContract,Или унаследуйте Контракт для настройки. Контракт позволяет нам изменить соглашение о вызовах Притворяться.,Адаптируйте его к различным стилям.
Здесь мы познакомим вас с поддержкой наследования, шаблонами запросов, договорными соглашениями и т. д. в Feign. Понимание этого содержимого позволяет нам иметь более широкий выбор и возможности при разработке интерфейсов Feign и вызовов методов. Хотя Feign прост и удобен в использовании, его механизм на самом деле достаточно гибок и богат, чтобы удовлетворить наши потребности в настройке.
Feign поддерживает использование перехватчиков для перехвата своих запросов. Мы можем реализовать следующие перехватчики:
может пройти feign.client.config.defaultInterceptors
Добавить перехватчик,нравиться:
feign:
client:
config:
defaultInterceptors:
- feign.auth.BasicAuthRequestInterceptor #Добавляем перехватчик BasicAuth
- com.example.logging.LoggingInterceptor #Добавляем перехватчик журналов
Вы также можете добавить перехватчики для указанного FeignClient:
@FeignClient(name="example", configuration = ExampleFeignConfig.class)
public interface ExampleFeignClient {
}
@Configuration
class ExampleFeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return new BasicAuthRequestInterceptor("username", "password");
}
}
Перехватчики позволяют более гибко настраивать поведение Feign и реализовывать сложную логику обработки запросов.
FeignИспользуется по умолчаниюResponseEntityDecoder
对ответруководитьдекодирование,расшифровать это какResponseEntity<T>
объект。мы можемвыполнить Собственныйиздекодирование器,нравиться:
public class ExampleDecoder implements Decoder {
@Override
public Object decode(Response response, Type type) {
if (type == Example.class) {
//Настраиваемое декодирование ответа
return ... ;
}
}
}
Затемпроходитьfeign.client.config.decoder
Укажите этот декодер,нравиться:
feign:
client:
config:
example: #Указанное имя FeignClient
decoder: com.example.ExampleDecoder
Настраиваемый декодер позволяет нам преобразовывать и настраивать ответ Feign в соответствии с форматом ответа службы.
Feign также поддерживает валидатор Validator.,Когда полученный ответ не может быть правильно декодирован,Можетиспользоватьвалидаторруководить Вторая проверкаииметь дело с。мы должнывыполнитьValidator
интерфейс,И назначен для использования FeignClient.
Перехватчики, декодеры и валидаторы Feign позволяют нам гибко настраивать процесс обработки запросов/ответов Feign, что также является отражением высокой масштабируемости Feign. Используя эти механизмы, мы можем легко позволить Feign поддерживать индивидуальные форматы протоколов и сложные процессы запросов/ответов. Это делает Feign не только простым HTTP-клиентом, но и многофункциональным универсальным решением для вызова служб.
По мере развития бизнеса,ПритворятьсяAPI будет становиться все больше и больше,这会带Приходить一定из Сложность обслуживания。Мы можем пройти Следующий способоптимизация ПритворятьсяAPI:
Эти меры по оптимизации могут сделать наш Feign API более понятным и простым в обслуживании. Хотя Feign прост, по мере роста бизнеса его может стать сложно поддерживать, если не управлять им, поэтому оптимизация API становится более важной темой.
Feign по умолчанию использует аннотации JAXRS для сопоставления методов с HTTP-запросами, но аннотации JAXRS не поддерживают необязательные параметры. Для поддержки необязательных параметров мы можем:
@GetMapping("/users")
List<User> getUsers(@RequestParam(value="age", required=false) Integer age);
@Nullable
аннотация标记可选параметр:@GetMapping("/users")
List<User> getUsers(@Nullable @RequestParam Integer age);
java.util.Optional<T>
добрый型изпараметр:@GetMapping("/users")
List<User> getUsers(Optional<@RequestParam Integer> age);
@GetMapping("/users")
List<User> getUsers(UserSearchCriteria criteria);
UserSearchCriteria criteria = UserSearchCriteria.builder()
.age(30)
.build();
Эти методы могут заставить наш интерфейс Feign поддерживать дополнительные параметры и стать более гибким.
По умолчанию Feign не поддерживает загрузку файлов напрямую. У нас есть следующие способы реализовать это:
feign.codec.Encodedecode.MultiPartFormContent
кодер:@PostMapping("/upload")
void uploadFile(@Part("file") RequestBody file);
Затем добавьте в FeignClient:
@FeignClient(configuration=MultipartSupportConfig.class)
public interface FileUploadClient {
}
@Configuration
public class MultipartSupportConfig {
@Bean
public Encoder feignEncoder() {
return new MultipartFormContent();
}
}
@PostMapping("/upload")
void uploadFile();
public void uploadFile() {
Client client = ...; //получать ПритворятьсяClient Request request = ... //Создаем запрос на загрузку файла
client.execute(request);
}
@PostMapping("/upload")
void uploadFile();
public void uploadFile() {
File file = ...; //Получаем файл для загрузки
String uploadUrl = ...; //Получить URL-адрес загрузки
//Вручную создаем многочастный запрос
MultiPartRequest request = new MultiPartRequest(uploadUrl);
request.addFile("file", file);
... ...
}
Эти методы позволяют нашему интерфейсу Feign поддерживать функцию загрузки файлов и подключаться к сервисам, требующим загрузки файлов.
Feign прост и удобен в использовании.,Но мы также можем использовать различные способы расширения,Реализация более сложных требований к вызову.
Feign не поддерживает OAuth2 по умолчанию.,Мы можем проход реализуется следующими способами:
Feign обеспечивает интегрированную поддержку Hystrix по умолчанию, и мы можем легко включить Hystrix для интерфейса Feign. Основные методы следующие:
feign:
hystrix:
enabled: true
@FeignClient(name = "user", fallback = UserClientFallback.class)
public interface UserClient {
}
@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 {
}
feign:
client:
config:
user: #FeignClientName
hystrix:
command: #HystrixCommandConfiguration
default:
execution.isolation.thread.timeoutInMilliseconds: 1000
@Configuration
public class FeignHystrixConcurrencyStrategy {
@Bean
public HystrixConcurrencyStrategy feignHystrixConcurrencyStrategy() {
return hystrixConfig -> {
// сделанный на заказ Hystrix Стратегия пула потоков
HystrixThreadPoolProperties.Setter()...
// сделанный на заказ Hystrix Стратегия изоляции семафора HystrixSemaphoreProperties.Setter()...
};
}
}
Поддержка Hystrix от Feign позволяет нам легко применять меры по объединению и отказоустойчивости к интерфейсу Feign для повышения стабильности микросервисов.
Вот лучший пример Feign:
@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());
//Осуществляем процесс покупки
//...
}
}
Это простой бизнес-сценарий закупок, который в основном включает в себя:
Это типичный пример передовой практики Feign. Feign используется для реализации вызовов между микросервисами, что одновременно просто и элегантно.
Feign по умолчанию использует модель потоков SimpleClient, и ее основные функции заключаются в следующем:
Эта простая модель потоков может эффективно снизить затраты на переключение потоков и управление ими, а также повысить производительность. Но есть и несколько проблем:
Для этой цели Feign также предлагает другие модели резьбонарезания:
может пройтинастраиватьfeign.client.config.default
Элемент конфигурации для выбора модели резьбы.
Выбор подходящей модели потоков может значительно оптимизировать производительность Feign, улучшить использование ресурсов и отказоустойчивость. Но есть и компромисс со сложностью соответствующей конфигурации.
Feign также по умолчанию использует пул соединений, и его основные функции заключаются в следующем:
Мы можем пройтиfeign.client.configКонфигурацияпул соединенийпараметр,нравиться:
feign:
client:
config:
default:
pool:
maxTotal: 500 #Максимальное количество подключений
maxPerRoute: 50 #Максимальное количество соединений на маршруте
validateAfterInactivity: 1s #Проверка времени простоя соединения
Конфигурация и оптимизация пула соединений также являются важной частью повышения производительности и стабильности Feign.
Управление HTTP-соединениями Feign в основном включает в себя:
Эти механизмы управления соединениями могут позволить Feign полностью повторно использовать соединения, разумно распределять ресурсы соединений и достигать эффективного сетевого ввода-вывода. Однако конфигурации также необходимо взвешивать на основе реальных сценариев:
Таким образом, конфигурация параметров управления соединениями Feign должна быть настроена с всесторонним учетом показателей стабильности системы, одновременного выполнения и задержки.
Feign обеспечивает поддержку кодирования и декодирования JSON по умолчанию, а также мы расширяем возможности кодирования и декодирования «Притворяться» с помощью интерфейсов «может пройтиEncoder» и «Decoder». Общие кодеки включают:
Расширение кодека Feign может поддерживать больше форматов ответов и запросов, таких как XML, Protobuf, CBOR и т. д., для достижения диверсифицированной интеграции сервисов. Мы можем проход распространяется двумя способами:
Например, чтобы настроить кодек XML:
feign:
client:
config:
default:
decoder: feign.codec.xml.XMLDecoder
encoder: feign.codec.xml.XMLEncoder
Настройте клиента:
@FeignClient(name="clientName", decoder = XMLDecoder.class, encoder = XMLEncoder.class)
public interface ClientInterface {
}
Расширяя возможности кодирования и декодирования Feign, он может не только поддерживать традиционный интерфейс JSON/XML, но также взаимодействовать с пользовательскими кодеками для достижения интеграции интерфейса в любом формате, становясь единым входом планирования для подключения различных сервисов.
Feignможет пройти Добавить информацию заголовка запроса следующими способами:
@FeignClient("serviceName")
public interface Client {
@RequestMapping(method = RequestMethod.GET, "/hello")
@Header("token: 1234") //Добавляем информацию заголовка
String hello();
}
@FeignClient(name = "clientName", defaultHeaders = {
"token: 1234"
})
public interface Client {
//...
}
feign:
client:
headers:
token: 1234
@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 предоставляет несколько способов добавления заголовков запросов для аутентификации службы, передачи контекста и других функций. Однако метод настройки относительно разбросан, а обслуживание немного неудобно.
Вот и все об этой статье,Мы много рассказываем об опыте использования притворства и оптимизации.,Я считаю, что это может помочь каждому правильно использовать его в реальных производственных проектах.