Feign是受到Retrofit,JAXRS-2.0和WebSocket的影響,它是一個jav的到http客戶端綁定的開源項目。 Feign的主要目標是將Java Http 客戶端變得簡單。
現在來簡單的實現一個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次。
歡迎大家和我一起學習spring cloud構建微服務雲架構,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,大家來一起探討spring cloud架構的搭建過程及如何運用於企業項目。
Spring Cloud大型企業分佈式微服務雲構建的B2B2C電子商務平臺源碼請加企鵝求求:三五三六二四七二五九