java B2B2C Springcloud電子商務平臺原始碼 -Feign之原始碼解析

springcloud885發表於2019-04-19

什麼是Feign

Feign是受到Retrofit,JAXRS-2.0和WebSocket的影響,它是一個jav的到http客戶端繫結的開源專案。 Feign的主要目標是將Java Http 客戶端變得簡單。需要JAVA Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼 一零三八七七四六二六

寫一個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 多租戶電子商城系統

相關文章