SpringCloud总结:Feign&Ribbon

基于SpringCloud的分布式微服务系统中各个服务之间的调用时通过http协议来完成的,提到http协议,最先想到的就是ip+端口+资源路径的调用方式,但是这种调用方式并不符合微服务架构下的服务治理的要求,微服务架构中的服务治理是以注册中心为中心的,这种调用方式明显脱离了注册中心,此时Ribbon和Feigin就诞生了。

首先说Ribbon,Ribbon的主要作用有两个,一个是将http调用与eureka相关联,通过服务名称获取服务对应的调用地址,二是提供不同的负载均衡策略,这一点与dubbo中的ClusterInvoker功能类似,但此时仍然是基于RestTemplate+url的方式来调用服务,在使用上不仅麻烦而且不利于管理,这时就诞生了Feign,Feign说白了就是对RestTemplate的一个封装,将对http协议的url的调用转换成对java 接口的调用,这更加符合面向对象的设计原则,此外,feign还提供了一些额外的功能,比如超时时间的设置、数据压缩供等,可以说,Ribbon和Feign是相互完善和补充的关系。

对于Ribbon和Feign的使用这里就不做介绍了,网上有很多的资料,同时也可以参考官方网站,下面主要来看一下Ribbon和Feigin的源码,看看具体的实现原理,这样可以做到知己知彼,使用的时候更加的得心应手。

因为Ribbon是基础,所以首先来看看Ribbon的源码。

按照SpringBoot的风格首先会有一个RibbonAutoConfiguration,到对应的依赖包中能够找到这个类
在这里插入图片描述
在这里插入图片描述
找到了入口,下面到这个类中看看ribbon的负载均衡和面向服务名称的调用时如何做到的。

在这里插入图片描述
进来一首,第一眼看见的是EurekaClientAutoConfiguration,这也进一步验证了Ribbon的面向服务名称的调用的底层是基于Eureka注册中心完成的,再往下看,我们会看到一个与LoadBalance相关的Bean
在这里插入图片描述
这个类对象时Ribbon的一个核心,后面会看到,另外在RibbonAutoConfiguration的类定义中有一个与LoadBalance相关的AutoConfiguration
在这里插入图片描述
这个类是一个初始化类,最主要的作用是初始了一个用于实现LoadBalance的拦截器
在这里插入图片描述
这里的LoadBalancerInterceptor是作用就是对客户端在RestTemplate的调用进行拦截,
在这里插入图片描述
从上面的截图中我们可以很清楚的看到,把对RestTemplate的调用转交给了LoadBalanceClient,这个LoadBalanderClient就是在RibbonAutoConfiguration中初始化的,具体的实例类型是RibbonLoadBalancerClient,怎么样,是不是很spring boot style。下面我们在深入这个Client中看看它到底做了什么。

在这里插入图片描述
这里面主要做了两件事,第一件事是根据服务名称得到一个LoadBalancer实例,为什么呢,因为在使用ribbon的时候我们可以为每个服务配置不同的负载均衡策略,拿到的ILoadBalancer实例中就包含了我们配置的负载均衡规则,然后再调用getServer()得到一个具体的server实例,这里就不深入看了,主要的逻辑就是从注册中心eureka的本地缓存总获取到所有的服务提供者信息,然后根据用户自定义的负载均衡策略来选择一个provider,也就是上图中的Server,然后再对这个Server发起http调用。

到这里,ribbon的逻辑也就基本清楚了,下面在看看Feign,按照同样的思路,我们先来找对应的@EnableFeignClient注解
在这里插入图片描述
可以看到在这个类中有一个Rigistrar,按照spring boot惯例,这个类应该很重要,点进来一看,不禁眼前一黑
在这里插入图片描述
ImportBeanDefinitionRegistrar这个接口是Spring IoC容器提供的一个向容器中注册BeanDefinition的钩子方法,由于在使用@EnableFeiginClient是我们需要指定一个包路径,所以,我们很容易想到,这个类会对包下的接口进行扫描,并将对应的BeanDefinition注册到IoC容器中,按照这个思路,我们找一找相关的代码。
在这里插入图片描述
在这里插入图片描述
看吧,将接口的BeanDefinition和一个叫做FeignClientFactoryBean的类关联了起来,熟悉dubbo的同学可能会知道,dubbo中的ReferenceBean就实现了FactoryBean接口,作用是当spring进行依赖注入的时候调用它的getObject()方法来获取实例对象,所以这里也是一样,当我们注入一个FeiginClient的接口时,spring就会调用FeiginClientFactoryBean的getObject方法来获取对象实例,那么现在一切都明朗了,我们看看这个FactoryBean给IoC容器返回了什么东西。

在这里插入图片描述
经过了层层调用,最终来到了一个叫做Taget的东西里,这个Target是什么我们并不用太在意,直接点进去
在这里插入图片描述
看到了一个invocationHandlerFactory,是不是弥漫了一种熟悉的气息,如果没有,那几再点进去看
在这里插入图片描述
看到没有,JDK动态代理!!到这里其实就不用在看下去了,Feigin的基本原理就是为接口创建动态代理,将调用转到Ribbon。

另外一条线是AutoConfiguration,按照spring boot的逻辑一定还有一个FeiginAutoConfiguration
在这里插入图片描述
在这里插入图片描述
最终,我们找到了这个FeiginAutoConfiguration,这个类中其实没有和具体的处理逻辑相关的代码,知识初始化了一些与Http请求相关的Bean,以及前文中提到的Target.
在这里插入图片描述
到此,Feigin和Ribbon的基本原理就清楚了,至于细节,等需要的时候在看吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章