[学习微服务-第7天] ServiceComb+SpringCloud Ribbon源码解读

倖福魔咒の 提交于 2019-11-26 22:57:44

在上一篇 《ServiceComb + SpringCloud Ribbon使用篇》中介绍了负载均衡的概念和ServiceComb协同SpringCloud Ribbon的使用, 本篇将从源码角度介绍ServiceComb是如何实现与SpringCloud Ribbon协同工作的。

 

一. ServiceComb对接 Spring Cloud Ribbon思路

在Ribbon的wiki介绍页(https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers)可以发现这样的描述:

ServerList - this can be static or dynamic. If it is dynamic (as used by DynamicServerListLoadBalancer), a background thread will refresh and filter the list at certain interval

这段介绍了ServerList接口,该接口既可以是静态获取服务实例列表也可以是动态获取的。

如果是动态获取服务列表(被DynamicServerListLoadBalancer使用),会有一个后台线程在特定得时间间隔负责刷新和过滤服务列表。

 

也就是说,我们只要实现了ServerList接口,加上相应的配置让Ribbon获取到,就能向Ribbon提供ServiceComb自己的服务发现逻辑。

 

如下图↓↓↓

ServiceComb 在如下的org.apache.servicecomb:spring-boot-starter-discovery项目中实现了ServerList接口和相应的配置。

<dependency>
   <groupId>org.apache.servicecomb</groupId>
   <artifactId>spring-boot-starter-discovery</artifactId>
   <version>1.1.0</version></dependency>

 

二. 源码分析

项目结构

如下图,红色方框内为接入SpringCloud Ribbon组件的相关类。

 

下面我们分别来看看这几个类

↓↓↓

ScbRibbonConfiguration

Configuration 表示这是一个spring的配置类

EnableConfigurationProperties 使@ConfigurationProperties注解生效

ConditionalOnBean 只有特定名称或者类型的Bean存在于BeanFactory时才创建某个Bean

AutoConfigureAfter 只有在指定类的配置类配置完后才会生效

RibbonClients 允许在一个类中声明多个RibbonClient注解

注意Ribbon是懒加载的,而该类在RibbonAutoConfiguration初始化配置之后才会执行配置,所以该类也是懒加载

 

ScbRibbonClientConfiguration

在ScbRibbonConfiguration类中的RibbonClients注解指定了ScbRibbonClientConfiguration来实例化RibbonClient。 如下,该类实例化了一个ServerList对象,实际类型为ServiceCombServerList,该对象会替换DynamicServerListLoadBalancer类里的ServerList对象。

ServiceCombServerList

在Ribbon体系中,ServerList接口负责获取服务实例列表。ServiceComb使用ServiceCombServerList实现了该接口。该类使用了ServiceComb内置的服务发现能力。

ServiceCombServerList构造器里使用discoveryTree添加了一个过滤器ScbRibbonEndpointDiscoveryFilter。

•DiscoveryTree是ServiceComb Registry包的类。ServiceComb Registry包提供了服务注册,服务发现与过滤器等能力。

•ScbRibbonEndpointDiscoveryFilter继承了AbstractEndpointDiscoveryFilter,而AbstractEndpointDiscoveryFilter实现了DiscoveryFilter。DiscoveryFilter接口主要管理实例进行分组、缓存

getInitialListOfServers方法获取初始的servers;getUpdatedListOfServers方法获取更新的servers

 

ScbRibbonEndpointDiscoveryFilter

ScbRibbonEndpointDiscoveryFilter继承于AbstractEndpointDiscoveryFilter类,观察AbstractEndpointDiscoveryFilter代码可发现有一个discovery方法,这个方法会被DiscoveryTree使用以获取服务列表。此时已进入ServiceComb Registry包内部,具体的细节不展开分析。

关于filter类,实际上查看DiscoveryTree的源码可发现一些信息,如下是DiscoveryTree的doDiscovery方法,该方法属于ServiceCombServerList获取服务实例列表的调用链上,而该方法会将这个获取信息的任务交给DiscoveryFilter类去处理。

 

本文向社区读者从源码角度阐述了ServiceComb是如何与SpringCloud Ribbon协同工作的。 

[单纯使用的用户实际上不必关心这些细节]  

非常欢迎爱好者们向社区提问和贡献代码:)

 

下篇将介绍ServiceComb内置的负载均衡的能力,内置的能力可支持定制化重试策略。

 

如在阅读代码时有任何疑问想交流,欢迎扫码加入进微信群。

期待志同道合的朋友们加入

ServiceComb的大门为你们敞开~

用心做开源,不忘初衷

 

前期阅读 

[学习微服务-第6天] 

负载均衡之ServiceComb + SpringCloud Ribbon

[学习微服务-第5天]

ServiceComb+Zipkin源码解读

[学习微服务-第4天]

ServiceComb+Zipkin

[学习微服务-第3天] 

ServiceComb内置高性能网关服务

[每天学习微服务-源码解读] 

ServiceComb+SpringCloud Zuul

[每天学习微服务-网关]

ServiceComb+SpringCloud Zuul

-----------------------------------------------

了解更多信息请访问: 

官方网站http://servicecomb.apache.org/ 

Github代码仓库https://github.com/apache?q=ServiceComb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!