今天分析Fegin 组件源码及原理,首先,Fegin是对Hystrix和Rebbon的封装:开始,fegin只有接口没有实现类,实现原理类似Mybatis,运行时生成了代理类,相当于实现类。
1、从启动类入口:
2、点击 FeignClientsRegistrar 里面有创建beanDefinition对象,
点击 registerFeignClients 方法:扫描FeignClient 注解,并遍历相关的包和类,封装成对象
对应的业务代码注解和
注册对象方法:
3、点击 FeignClientFactoryBean 找到getObject方法,生成代理类
4、进入HystrixTargeter 类
5、生成JDK类型的代理类:
点击create方法:
6、点击 发现是JDK的动态代理:
6、启动时断点看:
最终会生成有@FeignClient 注解的接口的代理 所以 Controller 中获取到代理实例后,则会掉到 HystrixInvocationHandler 的 invoke 方法,后面会详细介绍此代理类:
调用接口时证明是代理类:
然后会调用到这:
7、进入代理类 HystrixInvocationHandler implements InvocationHandler 类:
还是走的 hystrix 那一套,最后会走到上面的 run 钩子方法中
8、来到了相似的地方,上篇分析Hystrix是出现过
9、到了集成Rebbon的地方:
10、进入LoadBalancerFeignClient
点击lbClient
11、 rebbon源码中有这部分
12、拿到服务列表ip 和 重试次数等重要参数:
13、返回调用 executeWithLoadBalancer
14、发送http请求:
到这里流程结束,大家参考这个思路读取Fegin源码,多读多思考,下篇我们分析zuul源码,敬请期待!