天天看點

java B2B2C Springcloud電子商務平台源碼 -Feign之源碼解析

什麼是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 多租戶電子商城系統