Самый быстрый путь в мире — быть приземленным, эта статья включена【Колонка архитектурных технологий】Подпишитесь на это место, которым вы хотели бы поделиться.
Finchley.SR2
1. Что такое притворство
feign — это декларативный веб-клиент, который может использовать свои аннотации для создания интерфейсов, а также поддерживает пользовательские кодеки. Spring Cloud интегрирует Ribbon и Eureka для обеспечения стратегий балансировки нагрузки для клиентов. Feing имеет две основные аннотации: (@EnableFeignClients используется для включения функции имитации, а @FeignClient используется для определения интерфейса имитации).
2. Знакомство с притворством
1. Увеличьте количество зависимостей
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. Пример весеннего загрузочного приложения
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
StoreClient.java
@FeignClient("stores")
public interface StoreClient {
@RequestMapping(method = RequestMethod.GET, value = "/stores")
List<Store> getStores();
@RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
Store update(@PathVariable("storeId") Long storeId, Store store);
}
В аннотации @FeignClient параметр («stores») — это уникальное имя (на самом деле, обычно это имя службы), которое используется для создания балансировщика нагрузки Ribbon. Вы также можете использовать параметр url в его аннотации (найти параметр — это абсолютный путь, напримерwww.xxx.com)..лента) Клиент Ribbon найдет физический адрес по ("магазинам"), если используется Eureka, то найдет сервис в своем реестре, если нет, то также может настроить внешний список.
3. Переопределить свойства Feign по умолчанию
Пока компонент feign объявлен @FeignClient, он является клиентом.Мы можем создавать собственные элементы конфигурации с помощью FeignClientsConfiguration, напримерfeign.Decoder
, a feign.Encoder
, and a feign.Contract.
Example
@FeignClient(name = "stores", configuration = FooConfiguration.class)
public interface StoreClient {
//..
}
В этой демонстрации клиент состоит из FeignClientsConfiguration и FooConfiguration (последняя конфигурация перезапишет первую)
Классы FooConfiguration не нуждаются в аннотации @Configuration. Если вы добавите это, вам также необходимо исключить его при сканировании с помощью @ComponentScan. Иначе эта вещь станетfeign.Decoder
, feign.Encoder
, feign.Contract 的默认配置了。
@FeignClient 中 serviceId 属性已经废弃了,请注意。
在以前@FeignClient 中使用url时不需要配置name属性,现在这版本必须配置。
Заполнители можно использовать в свойствах URL и имени @FeignClient.
@FeignClient(name = "${feign.name}", url = "${feign.url}")
public interface StoreClient {
//..
}
Spring Cloud предоставляет несколько классов по умолчанию для ведения
-
Decoder
feignDecoder:ResponseEntityDecoder
(which wraps aSpringDecoder
) -
Encoder
feignEncoder:SpringEncoder
-
Logger
feignLogger:Slf4jLogger
-
Contract
feignContract:SpringMvcContract
-
Feign.Builder
feignBuilder:HystrixFeign.Builder
-
Client
FeignClient: если лента включена, этоLoadBalancerFeignClient
, если не включено, будет использоваться значение по умолчанию.
Следующие классы по умолчанию не предусмотрены, но они тоже будут искать загрузку при создании клиента, если есть, используйте
Logger.Level
Retryer
ErrorDecoder
Request.Options
Collection<RequestInterceptor>
SetterFactory
Как и в приведенной выше демонстрации, создайте класс и используйте @FeignClient для настройки его конфигурации (например, FooConfiguration), Пример
@Configuration
public class FooConfiguration {
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("user", "password");
}
}
Приведенная выше конфигурация заменяет SpringMvcContract на feign.Contract.Default и добавляет перехватчик. Конечно, вы также можете использовать файл конфигурации для настройки @FeignClient следующим образом:
application.yml
eign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false
encoder: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract
Конечно, этот класс конфигурации также можно поместить в атрибут @EnableFeignClients, но если он настроен таким образом, все клиенты будут действовать. Если вы хотите настроить все @FeignClient , вы можете использовать значение по умолчанию в качестве псевдонима, например:
application.yml
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
Если мы создадим и файл конфигурации, и класс конфигурации, файл конфигурации будет иметь наивысший приоритет и переопределит свойства класса конфигурации. Это свойство можно изменить с помощью feign.client.default-to-properties=false.
Если вам нужно использовать параметры привязки ThreadLocal, вам нужно установить для изоляции Hystrix значение SEMAPHORE.
# To disable Hystrix in Feign
feign:
hystrix:
enabled: false
# To set thread isolation to SEMAPHORE
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
4. Вручную создайте клиент Feign
В некоторых случаях приведенная выше конфигурация не может удовлетворить вашего клиента, тогда вам нужно использоватьFeign Builder APIПерейдите к созданию клиента вручную. При их создании могут использоваться разные перехватчики.
@Import(FeignClientsConfiguration.class)
class FooController {
private FooClient fooClient;
private FooClient adminClient;
@Autowired
public FooController(Decoder decoder, Encoder encoder, Client client, Contract contract) {
this.fooClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
.requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
.target(FooClient.class, "http://PROD-SVC");
this.adminClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
.requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
.target(FooClient.class, "http://PROD-SVC");
}
}
FeignClientsConfiguration — это класс конфигурации облака по умолчанию, а PROD-SVC — это имя службы. Контракт использует инъекцию по умолчанию.
5. Feign Hystrix Fallbacks (понижение)
Концепция перехода на более раннюю версию: при сбое выполнения кода или включении стратегии перехода на более раннюю версию можно установить резервный атрибут в @FeignClient для реализации стратегии понижения.
@FeignClient(name = "hello", fallback = HystrixClientFallback.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value = "/hello")
Hello iFailSometimes();
}
static class HystrixClientFallback implements HystrixClient {
@Override
public Hello iFailSometimes() {
return new Hello("fallback");
}
}
Если вы хотите узнать причину перехода на более раннюю версию, настройте свойство fallbackFactory в @FeignClient.
FeignClient(name = "hello", fallbackFactory = HystrixClientFallbackFactory.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value = "/hello")
Hello iFailSometimes();
}
@Component
static class HystrixClientFallbackFactory implements FallbackFactory<HystrixClient> {
@Override
public HystrixClient create(Throwable cause) {
return new HystrixClient() {
@Override
public Hello iFailSometimes() {
return new Hello("fallback; reason was: " + cause.getMessage());
}
};
}
}
В приведенной выше демонстрации кратко объясняется, как перейти на более раннюю версию. Но текущая стратегия перехода на более раннюю версию не поддерживает возврат метода.com.netflix.hystrix.HystrixCommand
and rx.Observable 的情况。
6. Притворись и @Primary
При использовании стратегии перехода на более раннюю версию в Feign Hystrix, если тот же тип экземпляра в ApplicationContext. При использовании инъекции @Autowired будет сообщено об ошибке, и необходимо использовать аннотацию @Primary. Для нормальной работы Spring Cloud помечает все экземпляры Feign аннотацией @Primary. Но в некоторых случаях это будет проблемой, все предоставляют закрытый метод, вы можете установить первичный атрибут @FeignClient в false.
FeignClient(name = "hello", primary = false)
public interface HelloClient {
// methods here
}
7. Имитация сжатия запроса/ответа
Вы можете включить функцию сжатия запроса/ответа GZIP, просто настройте свойства feign.compression.request.enabled=true feign.compression.response.enabled=true
Также есть несколько конфигураций веб-сервера feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=2048
Восемь, Притворитесь, что ведете журнал
Регистратор может быть создан с полным именем класса Feing Client, уровень регистратора DEBUG. logging.level.project.user.UserClient: DEBUG Logger.Level можно настроить, чтобы указать, как печатать журналы.
НЕТ, не печатать (ПО УМОЛЧАНИЮ). BASIC, записывает только метод запроса и URL-адрес, а также код состояния ответа и время выполнения. HEADERS, записывает основную информацию, а также заголовки запросов и ответов. FULL, журнал запросов и заголовков ответов, тело и метаданные
@Configuration
public class FooConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}