OpenFeign的简单理解

Feign的执行原理

  1. SpringCloud为每一个FeignClient生成一个代理对象
  2. 代理对象会分析类与方法上的注解,就可判断出服务名与请求方法名的路由
  3. 从注册中心获取指定服务名的所有真实地址
  4. 利用负载均衡策略选择一个最佳地址,利用RestTemplate进行调用
  5. 等待接收返回

常见问题

  1. 对于服务的地址,每次请求都需要去注册中心获取吗?

    答:

    不是每次都需要从注册中心获取地址。Feign 维护了一个服务与地址的关系清单List<>当我们使用了Nacos,注册中心这个服务的地址有变化。nacos将数据实时推送给SpringCloud;我们就会将List里面的数据进行更换。我们每次服务调用这个清单都是最新的。

  2. 如果选择的最佳地址由于某种原因无法使用该如何处理?

    答:

    SpringCloud Feign会进行重试。全部可以配置。重试次数不包含本次;如下图

    image-20230517092517703

  3. 如何解决feign远程调用请求头丢失问题

    答:

    原因:消费方通过feign调用生产方接口的时候,feign会发起一个与消费方不同的一个新的请求,导致新的请求头中信息与消费方发起的请求头信息不一致

    利用tomcat请求与线程绑定机制 即 spring提供的RequestContextHolder 解决

    每次RequestContextHolder,getRequestAttributes获取的都是当前执行的请求线程的requestAttributes,也就获取了当前请求的request而requestAttributes具备ThreadLocal属性,属于线程内变量,各个线程之间互不干扰

    private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal<>("Request attributes")
    private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal<>("Request context");
    
  4. Feign与openFeign的区别

    答:

    他们底层都是内置了Ribbon,去调用注册中心的服务。

    Feign是Netflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端。

    OpenFeign是SpringCloud自己研发的,在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。是SpringCloud中的第二代负载均衡客户端。

    Feign本身不支持Spring MVC的注解,使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

    OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

    feign已不在维护,openfeign维护频繁。