什麼是Feign
Feign是受到Retrofit,JAXRS-2.0和WebSocket的影響,它是一個jav的到http用戶端綁定的開源項目。 Feign的主要目标是将Java Http 用戶端變得簡單。
寫一個Feign
現在來簡單的實作一個Feign用戶端,首先通過@FeignClient,用戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置檔案,代碼如下:
@FeignClient(value = "service-hi",configuration = FeignConfig.class)
public interface SchedualServiceHi {
@GetMapping(value = "/hi")
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
其自定義配置檔案如下,當然也可以不寫配置檔案,用預設的即可:
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 5);
}
}
檢視FeignClient注解的源碼,其代碼如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
@AliasFor("value")
String name() default "";
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
}
String path() default "";
boolean primary() default true;
FeignClient注解被@Target(ElementType.TYPE)修飾,表示FeignClient注解的作用目标在接口上;
@Retention(RetentionPolicy.RUNTIME),注解會在class位元組碼檔案中存在,在運作時可以通過反射擷取到;@Documented表示該注解将被包含在javadoc中。
feign 用于聲明具有該接口的REST用戶端的接口的注釋應該是建立(例如用于自動連接配接到另一個元件。 如果功能區可用,那将是
用于負載平衡後端請求,并且可以配置負載平衡器
使用與僞裝用戶端相同名稱(即值)@RibbonClient 。
其中value()和name()一樣,是被調用的 service的名稱。
url(),直接填寫寫死的url,decode404()即404是否被解碼,還是抛異常;configuration(),标明FeignClient的配置類,預設的配置類為FeignClientsConfiguration類,可以覆寫Decoder、Encoder和Contract等資訊,進行自定義配置。fallback(),填寫熔斷器的資訊類。
FeignClient的配置
預設的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入預設的配置。
Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
Encoder feignEncoder: SpringEncoder
Logger feignLogger: Slf4jLogger
Contract feignContract: SpringMvcContract
Feign.Builder feignBuilder: HystrixFeign.Builder
代碼如下:
@Configuration
public class FeignClientsConfiguration {
...//省略代碼
@Bean
@ConditionalOnMissingBean
public Decoder feignDecoder() {
return new ResponseEntityDecoder(new SpringDecoder(this.messageConverters));
}
@Bean
@ConditionalOnMissingBean
public Encoder feignEncoder() {
return new SpringEncoder(this.messageConverters);
}
@Bean
@ConditionalOnMissingBean
public Contract feignContract(ConversionService feignConversionService) {
return new SpringMvcContract(this.parameterProcessors, feignConversionService);
}
...//省略代碼
}
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,進而達到自定義配置的目的,比如FeignClientsConfiguration的預設重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,寫個配置檔案,注入feignRetryer的bean,代碼如下:
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 5);
}
}
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
java B2B2C 多租戶電子商城系統