OpenFeign 使用細節

CyrusHuang發表於2024-09-05

@EnableFeignClients 註解配置項

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients {
    // 和 basePackages 互為別名
    String[] value() default {};

    // 指定基礎包(掃描這個包及子包下標註了 FeignClient 註解的介面,將會為其生成代理類注入到 spring 容器)
    String[] basePackages() default {};

    // 指定一個或多個類(介面),這些類所在的包作為基礎包(相當於不直接指定 basePackages,推斷出 basePackages)
    Class<?>[] basePackageClasses() default {};

    // 指定 Feign 的全域性配置類,如果不指定就是預設的,可以設定請求攔截、超時時間等
    Class<?>[] defaultConfiguration() default {};

    // 掃描指定的類,這些類如果標註了 FeignClient 註解,將會為其生成代理類注入到 spring 容器
    Class<?>[] clients() default {};
}
  1. basePackages 示例

    @Configuration
    @EnableFeignClients(basePackages = {
            "com.dtyunxi.yundt.cube.center.scheduler.api",
            "com.yunxi.dg.base.center.expense.api",
            "com.yunxi.dg.base.commons.rpc.*",
            "com.yunxi.dg.base.center.report.api",
            "com.yunxi.dg.base.center.rule.api",
            "com.yunxi.dg.base.center.shop.api",
            "com.yunxi.dg.base.center.rebate.api",
            "com.yunxi.dg.base.center.customer.api"
    })
    public class FeignClientConfig {
    }
    
  2. basePackageClasses 示例

    // basePackages 將會是 com.yunxi.dg.base.center.expense.api.biz
    @EnableFeignClients(basePackageClasses = {com.yunxi.dg.base.center.expense.api.biz.IAccountAugmentOrderApi.class})
    
  3. defaultConfiguration 示例

    // 指定一個配置類
    @Configuration
    @EnableFeignClients(basePackageClasses = {com.yunxi.dg.base.center.expense.api.biz.IAccountAugmentOrderApi.class},
                       defaultConfiguration = MyFeignConfiguration.class)
    public class FeignClientConfig {
    }
    
    // 配置類程式碼
    @Configuration
    public class MyFeignConfiguration {
    
        @Bean
        public Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL; // 設定 Feign 的日誌級別為 FULL
        }
    
        @Bean
        public Request.Options requestOptions() {
            return new Request.Options(5000, 10000); // 設定 Feign 的連線超時和讀取超時
        }
    
        // 其他定製化配置,比如請求攔截器、錯誤解碼器等
    }
    
  4. clients 示例

    @EnableFeignClients(clients = {MyFeignClient1.class, MyFeignClient2.class})
    

@FeignClient 註解配置項

public @interface FeignClient {
    
    // 和 value 互為別名,標示要呼叫哪個服務,要和 nacos 上面的服務名一致
    @AliasFor("name")
    String value() default "";

    // 當服務提供者的介面太多了,呼叫方想分為多個 FeignClient,就要指定不同的 contextId,一般不配置
    String contextId() default "";

    @AliasFor("value")
    String name() default "";

    String[] qualifiers() default {};

    // 表示要呼叫的地址,優先順序高於 name,一般用於除錯,寫死一個地址(ip+埠)
    String url() default "";

    // 如果呼叫的介面 404,true:瀏覽器也響應 404;false:瀏覽器響應 500(看程式日誌才會知道是 404)
    boolean dismiss404() default false;

    // Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract
    Class<?>[] configuration() default {};

    // 定義容錯的處理類,當呼叫遠端介面失敗或超時時,會呼叫對應介面的容錯邏輯,fallback指定的類必須實現@FeignClient標記的介面
    Class<?> fallback() default void.class;

    // 工廠類,用於生成 fallback 類示例,透過這個屬性我們可以實現每個介面通用的容錯邏輯,減少重複的程式碼
    Class<?> fallbackFactory() default void.class;

    // 定義當前 FeignClient 訪問介面時的統一字首
    // 最終的全路徑必須和服務提供方的 url 完全一致,如果這裡加了 path,服務提供方沒有這個,就會報 404
    String path() default "";

    boolean primary() default true;
}

超時配置

這個太複雜了,不同的場景配置不一樣

feign、openfeign、httpclient、httpclient5、ok-http、ribbon、hystrix

連線超時、讀取超時

只能看自己用的什麼版本,什麼元件

HttpClinet5

相關文章