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

在上一篇 《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自己的服务发现逻辑。

 

如下图↓↓↓

03ba389b328329fcf923ad482ac796e8840.jpg

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组件的相关类。

26187da2ed8eeedc5ce8628367494937d6e.jpg

 

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

↓↓↓

ScbRibbonConfiguration

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

EnableConfigurationProperties 使@ConfigurationProperties注解生效

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

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

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

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

2272f89ba577cd4613f8af7860f2d1591ae.jpg

 

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

50abd6492bcef7caaac418e8eb3093eafb2.jpg

 

ScbRibbonEndpointDiscoveryFilter

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

d0144d023cb585e25a0700c8f8976e18343.jpg

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

eefd771bce1d219df9e6b2d5414b0fd55c9.jpg

 

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

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

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

 

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

 

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

0bde898fe7196062aabc1f09cbe0535583b.jpg

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

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

转载于:https://my.oschina.net/u/3823482/blog/3009345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值