openFeign实现

使用

  1. 接口上加上FeignClient注解
  2. 启动类加上EnableFeignClients注解。

实现过程

  1. 注解EnableFeignClients导入了FeignClientsRegistrar,在这个类中对FeignClients的定义进行组装。实际是一个FeignClientFactoryBean对象。在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  2. FeignClientFactoryBean实现了FactoryBean接口所以在spring在进行依赖注入时得到的是一个getObject返回的对象。
  3. 继续跟代码,看一下gatObject方法。builder是SentinelFeign的builder因为我启用了Sentinel。在这里插入图片描述
  4. 跟踪loadBalance方法。LoadBalancerFeignClient在DefaultFeignLoadBalancedConfiguration类自动装配,HystrixTargeter在FeignAutoConfiguration类中自动装配。在这里插入图片描述
  5. 跟踪target方法。返回的是ReflectiveFeign,同时设置了一个InvocationHandlerFactory。SentinelTargeterAspect.getFeignClientFactoryBean获取的是通过切面得到的步骤4target方法的第一个 参数。在这里插入图片描述在这里插入图片描述
  6. InvocationHandlerFactory的create返回的InvocationHandler就是FeignClient标注的接口的实现,这里返回的是SentinelInvocationHandler。
  7. 再看一下步骤5中的newInstance方法。在这个方法中完成了对接口方法的映射和对类的代理。factory是步骤5中设置的InvocationHandlerFactory,methodToHandler保存的是FeignClient接口中的方法与实现的映射。在这里插入图片描述
  8. 当我们调用接口方法时实际是使用SentinelInvocationHandler在处理。在这里插入图片描述
  9. 真正处理逻辑在MethodHandler中。在步骤7中提到的newInstance方法第一句就创建了MethodHandler。factory是在步骤5创建ReflectiveFeign时传入的SynchronousMethodHandler.Factory。在这里插入图片描述
  10. SynchronousMethodHandler.Factory的create返回SynchronousMethodHandler。下面是SynchronousMethodHandler的invoke方法,在executeAndDecode方法中调用的Client是LoadBalancerFeignClient,下面就是负载,组装请求路径。在这里插入图片描述
    在这里插入图片描述
    总的来说就是对接口进代理,对每个方法生成一个实现,在实现中组装请求路径,使用配置的服务名与负载均衡选择一个服务地址,将请求路径中的服务名替换为服务地址发送请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值