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 {};
}
-
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 { }
-
basePackageClasses 示例
// basePackages 将会是 com.yunxi.dg.base.center.expense.api.biz @EnableFeignClients(basePackageClasses = {com.yunxi.dg.base.center.expense.api.biz.IAccountAugmentOrderApi.class})
-
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 的连接超时和读取超时 } // 其他定制化配置,比如请求拦截器、错误解码器等 }
-
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
连接超时、读取超时
只能看自己用的什么版本,什么组件