java版springcloud B2B2C o2o多用戶商城 springcloud架構-理解Feign之源碼解析

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電子商務平臺源碼請加企鵝求求:三五三六二四七二五九

發佈了101 篇原創文章 · 獲贊 118 · 訪問量 7519
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章