OpenFeign 使用细节

@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

posted @ 2024-08-15 17:23  CyrusHuang  阅读(1)  评论(0编辑  收藏  举报