Spring Cloud Ribbon 负载均衡器 — 实现服务消费以及负载均衡

一、简介

 Ribbon是一个基于Netflix Ribbon实现的客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制。它不像服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个微服务的基础设施中。理解Ribbon对于我们使用Spring Cloud来讲非常的重要,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。真正的服务消费者选择合适节点来调用服务生产者提供的数据是通过Spring Cloud Ribbon来实现的。

1.当一个服务实例启动,会将它的IP地址等信息注册到Eureka服务注册中心;
2.当客户端调用其它服务时,会先通过Ribbon检查本地缓存中是否有目标服务实例信息,再选取列表中某个实例进行访问(负载均衡发生在客户端),否则会从服务发现代理获取。
3.Ribbon会定期从Eureka刷新本地缓存。当服务调用失败,客户端会让本地缓存失效,然后重新从服务发现代理获取新的服务注册信息。

它主要包括六个组件:

  • ServerList:负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当 Ribbon 与 Eureka 结合使用时,ServerList 的实现类就是 DiscoveryEnabledNIWSServerList,它会保存 Eureka Server 中注册的服务实例表。
  • ServerListFilter:服务器列表过滤器。这是一个接口,主要用于对 Service Consumer 获取到的服务器列表进行预过滤,过滤的结果也是 ServerList。Ribbon 提供了多种过滤器的实现。
  • IPing:探测服务实例是否存活的策略。
  • IRule:负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等,其类结构如下图所示。
  • ILoadBalancer:负载均衡器。这也是一个接口,Ribbon 为其提供了多个实现,比如 ZoneAwareLoadBalancer。而上层代码通过调用其 API 进行服务调用的负载均衡选择。一般 ILoadBalancer 的实现类中会引用一个 IRule。
  • RestClient:服务调用器。顾名思义,这就是负载均衡后,Ribbon 向 Service Provider 发起 REST 请求的工具。

我们也可以自己定义负载均衡策略,比如我们就利用自己实现的策略,实现了服务的版本控制和直连配置。实现好之后,将实现类重新注入到 Ribbon 中即可。

Ribbon 工作时会做四件事情:

  1.  优先选择在同一个 Zone 且负载较少的 Eureka Server;
  2.  定期从 Eureka 更新并过滤服务实例列表;
  3.  根据用户指定的策略,在从 Server 取到的服务注册列表中选择一个实例的地址;
  4.  通过 RestClient 进行服务调用。

pom.xml引入ribbon插件:

spring-cloud-starter-netflix-eureka-client已集成ribbon,所以无需再额外引入spring-cloud-starter-netflix-ribbon。

我们采用了声明式的方式来实现负载均衡。实际上,内部调用维护了一个RestTemplate对象,该对象会使用Ribbon的自动化配置(LoadBalancerAutoConfiguration),同时通过@LoadBalanced开启客户端负载均衡。RestTemplate是Spring用于客户端HTTP同步访问的主要类,用于发起 REST请求。

@LoadBalanced源码追溯,该注解用来给RestTemplate做标记,以使用负载均衡的客户端(LoadBalancerClient)来配置RestTemplate。

choose() 方法根据传入的serviceId服务Id,从负载均衡器选择一个一个对应的服务实例。

execute() 方法根据serviceId服务ID和请求request来执行请求内容。

reconstructURI() 方法构建出一个合适的Host:Port的URI。而 RibbonLoadBalancerClient就是LoadBalancerClient的具体实现。

LoadBalancerAutoConfiguration类是Ribbon的自动化配置类。

LoadBalancerInterceptor类用于实现对客户端发起请求时进行拦截,以实现客户端的负载均衡。

当于Spring Cloud应用引入Ribbon和Eureka的时候,会触发Eureka中实现的Ribbon的自动化配置。

三、配置

由于Spring Cloud应用引入Ribbon和Eureka的时候,会触发Eureka中实现的Ribbon的自动化配置。

serverList 的维护机制是由 DiscoveryEnabledNIWSServerList的实例维护,该类会将服务清单列表交给Eureka的服务治理机制来维护。

IPing的实现由 NIWSDiscoveryPing 的实例维护,该类也将服务检查交给Eureka的服务治理机制来维护。

默认情况下,用于获取实例请求的ServiceList接口实现是采用Spring Cloud Eureka中封装的DomainExtractingServerList.

由于Spring Cloud Ribbon默认实现了区域亲和策略,所以我们可以通过Eureka实例的元数据配置来实现区域化的实例配置方案。

比如 eureka.instance.metadataMap.zone=hangzhou. 通过zone参数来指定自己所在的区域。

在Spring Cloud Ribbon 与 Spring Cloud Eureka结合工程中,我们可以通过参数配置方式来禁用Eureka对Ribbon服务实例的维护实现。

ribbon.eureka.enabled=false


四、除了传统负载均衡的能力之外,它还能解决以下问题:

  1.当监控到集群内有服务器发生故障,Ribbon 可以临时将故障的服务器从负载均衡中剔除,直到这三台机器恢复正常的响应。
  2.可以对响应最快的服务器进行加权,将更多的流量带到响应最快的节点。
  3.支持将多种负载均衡的策略同时启用,将负载均衡的效果调试到最好。
  4.自定义设置重试机制。

猜你喜欢

转载自www.cnblogs.com/java-1230/p/10267330.html