Feign调用注册中心外的服务

发布时间 2023-07-11 16:53:56作者: 我隔壁是老王

参考博客:
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属性指定路径