5.1
OpenFeign
的原理是什么?
根据上面的案例,我们知道
feign
是接口调用,接口如果想做事,必须要有实现类
可是我们并没有写实现类,只是加了一个
@FeignClient(value=
”
xxx-service
”
)
的注解
所以我们猜测
feign
帮我们创建了代理对象,然后完成真实的调用。
动态代理
1jdk
(
invoke
)
2cglib
子类继承的
1.
给接口创建代理对象(启动扫描)
2.
代理对象执行进入
invoke
方法
3.
在
invoke
方法里面做远程调用
具体我们这次的流程:
A.
扫描注解得到要调用的服务名称和
url
B.
拿到
provider-order-service/doOrder
,通过
ribbon
的负载均衡拿到一个服务,
provider-order-service/doOrder---
》
http://ip:port/doOrder
C.
发起请求,远程调用
5.2
看看
OpenFeign
的内部是如何实现这些的
5.2.1
如何扫描注解
@FeignClient
查看启动类的
@EnableFeignClients
进入 FeignClientsRegistrar 这个类 去查看里面的东西
真正的扫描拿到注解和服务名称
5.2.2
如何创建代理对象去执行调用?
当我们启动时,在
ReflectiveFeign
类的
newInstance
方法,给接口创建了代理对象
当我们执行调用的时候,打个断点去查看
ReflectiveFeign 类中的 invoke 方法帮我们完成调用
SynchronousMethodHandler
的
invoke
中给每一个请求创建了一个
requestTemplate
对
象,去执行请求
executeAndDecode
我们去看 LoadBalancerFeignClient 的 execute 方法
executeWithLoadBalancer 继续往下看
只要是
feign
调用出了问题
看
feign
包下面的
Client
接口下面的
108
行
200
成功
400
请求参数错误
401
没有权限
403
权限不够
404
路径不匹配
405
方法不允许
500
提供者报错了
302
资源重定向