Feign调用注册中心外的服务
参考博客:
https://blog.csdn.net/weixin_43612925/article/details/122923759
https://blog.csdn.net/weixin_42825651/article/details/125996165
1、@FeignClient()注解的使用
1. 服务的启动类要有@EnableFeignClients 注解才能启用feign客户端
2. FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上
2、@FeignClient标签的常用属性
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀
实操
@FeignClient(value = "test-service", url = "${url}",fallback = ServiceHystrix.class,configuration = FeignConfig.class)
public interface OrderFeign {
@RequestLine("POST/test/list")
BaseResponse<List<OrderInfoVo>> getList(QueryDto queryDto);
}
public class ServiceHystrix implements OrderFeign {
@Override
public BaseResponse<List<OrderInfoVo>> getList(QueryDto queryDto) {
return BaseResponse.success(new ArrayList<>());
}
}
@Configuration
public class FeignConfig implements RequestInterceptor {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Contract feignContract() {
// feign 契约 @RequestLine
return new Contract.Default();
// springMVC契约 @GetMapping @PostMapping 等
// return new SpringMvcContract();
}
// 记录请求和响应的头文件,正文和元数据的日志,需要在配置文件指出需要打印日志的类
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
// 连接超时时间说明:连接超时时间,单位分钟,读取超时时间,单位秒,重定向为是
// @Bean
// public Options options() {
// return new Options(10, TimeUnit.MINUTES, 60, TimeUnit.SECONDS, true);
// }
// 编码方式
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Override
public void apply(RequestTemplate requestTemplate) {
}
}
异常
当一个类上同时使用@RequestMapping 和 @FeignClient 注解时,会抛出此异常信息:
java.lang.IllegalArgumentException: @RequestMapping annotation not allowed on @FeignClient interfaces
解决方案
方案一
将类上的@RequestMapping注解删掉,将路径更改到每个方法的路径上即可,然后使用@FeignClient自己的path属性指定路径