14.OpenFeign 源码分析(springcloud)

5.1 OpenFeign 的原理是什么?
根据上面的案例,我们知道 feign 是接口调用,接口如果想做事,必须要有实现类
可是我们并没有写实现类,只是加了一个 @FeignClient(value= xxx-service ) 的注解
所以我们猜测 feign 帮我们创建了代理对象,然后完成真实的调用。
动态代理 1jdk
invoke 2cglib 子类继承的
1. 给接口创建代理对象(启动扫描)
2. 代理对象执行进入 invoke 方法
3. invoke 方法里面做远程调用
具体我们这次的流程:
A. 扫描注解得到要调用的服务名称和 url
14.OpenFeign 源码分析(springcloud)_第1张图片
B. 拿到 provider-order-service/doOrder ,通过 ribbon 的负载均衡拿到一个服务, provider-order-service/doOrder--- http://ip:port/doOrder
C. 发起请求,远程调用
5.2 看看 OpenFeign 的内部是如何实现这些的
5.2.1 如何扫描注解 @FeignClient
查看启动类的 @EnableFeignClients
14.OpenFeign 源码分析(springcloud)_第2张图片

进入 FeignClientsRegistrar 这个类 去查看里面的东西

14.OpenFeign 源码分析(springcloud)_第3张图片 

14.OpenFeign 源码分析(springcloud)_第4张图片 

真正的扫描拿到注解和服务名称

14.OpenFeign 源码分析(springcloud)_第5张图片 

5.2.2 如何创建代理对象去执行调用?
当我们启动时,在 ReflectiveFeign 类的 newInstance 方法,给接口创建了代理对象
14.OpenFeign 源码分析(springcloud)_第6张图片

当我们执行调用的时候,打个断点去查看

14.OpenFeign 源码分析(springcloud)_第7张图片 

ReflectiveFeign 类中的 invoke 方法帮我们完成调用

14.OpenFeign 源码分析(springcloud)_第8张图片 

SynchronousMethodHandler invoke 中给每一个请求创建了一个 requestTemplate 象,去执行请求
14.OpenFeign 源码分析(springcloud)_第9张图片

executeAndDecode

14.OpenFeign 源码分析(springcloud)_第10张图片 

我们去看 LoadBalancerFeignClient execute 方法

14.OpenFeign 源码分析(springcloud)_第11张图片 

executeWithLoadBalancer 继续往下看

14.OpenFeign 源码分析(springcloud)_第12张图片 

14.OpenFeign 源码分析(springcloud)_第13张图片 

14.OpenFeign 源码分析(springcloud)_第14张图片 

只要是 feign 调用出了问题
feign 包下面的 Client 接口下面的 108
200 成功
400 请求参数错误
401 没有权限
403 权限不够
404 路径不匹配
405 方法不允许
500 提供者报错了
302 资源重定向

 

你可能感兴趣的:(SpringCloud,spring,cloud,java,spring,boot)