Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经默认使用了Ribbon( 参考文章 )

一、先来看看ribbon的几个核心类

1、 IClientConfig 默认实现类 DefaultClientConfigImpl ,主要用来配置ribbon客户端的相关属性配置

2、 ServerListUpdater 默认实现类 PollingServerListUpdater ,主要负责动态更新服务器列表

  • start方法调用后会启动一个定时任务,延时1s开始执行,以每30s的时间间隔周期执行

    • 周期时间间隔可以通过 ribbon.ServerListRefreshInterval=1000 或者 ribbonClientName.ribbon.ServerListRefreshInterval=1000 来设置
  • start方法的启动由 DynamicServerListLoadBalancer 初始化的时候执行调用

3、 ServerList 获取服务器列表

  • 默认实现类 ConfigurationBasedServerList ,默认是从配置文件取服务器列表,这样配置 [ribbonClinetName].ribbon.listOfServers=xxx,xxx
  • ConsulServerList 引入consul作服务发现的实现类,主要负责获取注册中心的服务器列表

    备注:可以通过配置来扩展自己的 ServerList 实现,像这样: [ribbonClient].ribbon.NIWSServerListClassName=类名

4、 ServerListFilter 服务器列表过滤器

  • 默认实现类 ZonePreferenceServerListFilter 主要根据分区来过滤服务器列表
  • HealthServiceServerListFilter 引入consul服务发现的实现类,主要负责过滤consul健康检查通过的服务器列表(在ConsulServerList中会获取所有的服务器列表,包括健康检查没有通过的服务器)

    备注:可以通过配置来扩展自己的 ServerList 实现,像这样 [ribbonClient].ribbon.NIWSServerListFilterClassName=类名

5、 IPing 检查服务器是否或者

  • 默认实现 DummyPing ,这是一个假的检测着,永远返回是true
  • ConsulPing ,引入consul服务发现的实现类,主要根据consul返回的checks参数来判断服务器是否活着,跟 HealthServiceServerListFilter 的过滤判断一样

    备注:可以通过配置来扩展自己的 ServerList 实现,像这样: [ribbonClient].ribbon.NFLoadBalancerPingClassName=类名

6、 IRule 负载均衡选择器

  • 默认实现 ZoneAvoidanceRule ,复合判断server所在区域的性能和server的可用性选择server
  • RandomRule :随机选择一个server
  • RoundRobinRule :roundRobin方式轮询选择server
  • RetryRule :对选定的负载均衡策略机上重试机制。
  • WeightedResponseTimeRule :根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
  • AvailabilityFilteringRule :过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
  • BestAvailableRule :选择一个最小的并发请求的server

7、 ILoadBalancer 负载均衡总控制器,默认实现类 ZoneAwareLoadBalancer ,其启动了整个负载均衡客户端

  • 可以通过配置来扩展自己的 ServerList 实现,像这样: [ribbonClient].ribbon.NFLoadBalancerClassName=类名

    负载均衡器启动时序图:

  • 初始化时首先会初始化一个定时任务,每隔30s执行一次,缓存里面会保存所有从注册中心获取实例列表allServerList和经过ping成功的实例列表upServerList,但是负载均衡的时候拿到的列表是allServerList而非upServerList,不明白这个ping的意义在哪里
  • 启动一个定时任务,定时从注册中心拉取服务列表,每个30s执行一次
  • 初始化获取服务列表,拉取到的服务列表经过ServiceFilter过滤后保存在缓存里面

当客户端发起调用的时候会调用ILoadBalancer的chooseServer方法,根据IRule的负载均衡算法选择一个实例返回给调用者.

Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经默认使用了Ribbon(参考文章)一、先来看看ribbon的几个核心类1、IClientConfig 默认实现类DefaultClientConfigImpl,主要用来配置ribbon客户端的相关属性配置2、ServerListUpdater默认实现类PollingServerListUpd...
consul 使用 ribbon 的三种方式及 ribbon 的负载均衡策略 1、 consul 如何使用 ribbon (这里只使用常用的方式) 1)建一个用户服务和一个商品服务的module 2)加入 springcloud 版本管理,我使用的Hoxton.SR6版本 <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR6</spring-cloud.ve
Ribbon 是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经默认使用了 Ribbon (参考文章) 一、先来看看 ribbon 的几个核心类 1、IClientConfig 默认实现类DefaultClientConfigImpl,主要用来配置 ribbon 客户端的相关属性配置 2、ServerListUpdat...
ribbon 有个参数可以用来调整刷新server list的时间间隔参数。 ServerListRefreshInterval ribbon -core-2.2.0-sources.jar!/com/netflix/client/config/CommonClientConfigKey.java public static fi...
"spring-cloud-starter-netflix-eureka-client" 是一个 Spring Cloud 框架中用于连接 Netflix Eureka 服务注册中心的客户端 Starter 包。 通过添加该 Starter 包的依赖,可以方便地在 Spring Boot 应用程序中使用 Eureka 客户端来进行服务发现、注册和负载均衡。这个 Starter 包提供了一些自动配置类和相关的依赖,使得使用 Eureka 客户端变得更加容易。 需要注意的是,Netflix 已经停止对 Eureka 的维护和更新,因此建议使用其他的服务注册中心,比如 Consul 、ZooKeeper、etcd 等。Spring Cloud 也提供了对这些服务注册中心的支持,可以选择适合自己的注册中心。