OpenFeign原理
feign调用就是用来简化远程调用代码的,使得远程调用就像本地调用一样简单.
openfeign核心流程
-
spring项目启动中,服务A的openfeign框架会发起一个主动扫包的过程.
-
从指定目录下加载所有被@FeignClient修饰的接口,将这些接口转换为Bean,交给spring来管理.
-
这些接口会经过MVC constract解析, 将方法上的注解解析出来放到MethodMetadata中.
-
每一个FeignClient接口会生成一个动态代理对象,指向包含方法的MethodHandler的HashMap.
-
服务A发起远程调用
-
从动态代理proxy中找到一个MethodHandler的实例, 生成request,包含请求的url.
-
经过负载均衡算法找到一个服务的IP地址,拼接请求的URL.
-
服务B处理服务A发起的远程调用,执行逻辑后,返回响应给A.
openfeign扫包原理
@EnableFeignClients注解会查找所有带有@FeignClient注解的类和接口. 然后只保留带有@FeignClient的接口.
注册FeignClient到Spring原理
*解析@FeignClient定义的属性’
*将注解@FeignClient的属性和接口的信息构造成一个beanDefination
*将beanDefination转换成一个holder,这个holder就包括beandefination, alias, beanName信息.
*最后将这个holder注册到 Sprng容器中.
openfeign 动态代理
- 解析FeignClient接口上各个方法的注解,比如url, 接口类型,参数等.
- 将解析好的数据封装成元数据, 为每一个方法生成一个MethodHandler类的代理,相当于把服务请求地址,接口类型都封装好了,这些MethodHandler会放到一个HashMap中.
- 生成一个InvacationHandler来管理这些hashmap,其中Dispath指向这个HashMap.
- 使用JDK动态代理实现了FeignClient接口的动态代理对象proxy,将这个proxy添加到Spring容器中
- 调用方法时, 就会调用动态代理Proxy对象的methodHandler来发送请求.
总结
- OpenFeign会扫描带有@FeignClient接口的注解,为其生成一个动态代理对象.
- 动态代理里包含接口方法的MethodHandler, MethodHandler里又包括经过MVC Constract解析注解后的元数据
- 发起请求时MeathodHandler会生成一个Request
- 负载均衡Ribbon会从服务列表中选取一个Server, 拿到对应的IP地址后拼接URL, 就可以发起远程调用了.
on会从服务列表中选取一个Server, 拿到对应的IP地址后拼接URL, 就可以发起远程调用了.