
OpenFeign的简单理解
OpenFeign的简单理解
Feign的执行原理
- SpringCloud为每一个FeignClient生成一个代理对象
- 代理对象会分析类与方法上的注解,就可判断出服务名与请求方法名的路由
- 从注册中心获取指定服务名的所有真实地址
- 利用负载均衡策略选择一个最佳地址,利用RestTemplate进行调用
- 等待接收返回
常见问题
-
对于服务的地址,每次请求都需要去注册中心获取吗?
答:
不是每次都需要从注册中心获取地址。Feign 维护了一个服务与地址的关系清单List<>当我们使用了Nacos,注册中心这个服务的地址有变化。nacos将数据实时推送给SpringCloud;我们就会将List里面的数据进行更换。我们每次服务调用这个清单都是最新的。
-
如果选择的最佳地址由于某种原因无法使用该如何处理?
答:
SpringCloud Feign会进行重试。全部可以配置。重试次数不包含本次;如下图
-
如何解决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");
-
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维护频繁。