ribbon

发布时间 2023-03-26 13:46:07作者: shigp1

Ribbon是Netflix开发的客户端负载均衡器,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡策略算法,自动地帮助服务消费者去请求 提供者。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。我们也可以实现自定义负载均衡算法。

Ribbon作为Spring Cloud的负载均衡机制的实现,

  1. Ribbon可以单独使用,作为一个独立的负载均衡组件。只是需要我们手动配置 服务地址列表。
  2. Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表(DiscoveryClient),并基于负载均衡算法,请求其中一个服务提供者实例。
  3. Ribbon与OpenFeign和RestTemplate进行无缝对接,让二者具有负载均衡的能力。OpenFeign默认集成了ribbon。

Ribbon组成

官网首页:https://github.com/Netflix/ribbon

ribbon-core: 核心的通用性代码。api一些配置。

ribbon-eureka:基于eureka封装的模块,能快速集成eureka。

ribbon-examples:学习示例。

ribbon-httpclient:基于apache httpClient封装的rest客户端,集成了负载均衡模块,可以直接在项目中使用。

ribbon-loadbalancer:负载均衡模块。

ribbon-transport:基于netty实现多协议的支持。比如http,tcp,udp等。

 
 
SpringCloud从2020版本后就被移除了,最新版的Eureka Client依赖不在支持ribbon。移除RibbonEurekaAutoConfiguration配置类,RibbonEurekaAutoConfiguration配置类又导入了EurekaRibbonClientConfiguration配置类,EurekaRibbonClientConfiguration类中有DiscoveryEnabledNIWSServerList的ServerList用于从Eureka Service中拉取服务列表。要使用ribbon的负载均衡,SpringCloud版本选择Hoxton.SR9或较低版本,SpringBoot版本是2.3.2.RELEASE。

 
 
配置idea使得Producer模块可以多线程启动,先启动端口为8000的服务,修改端口为8002,启动。访问http://localhost:8761/,
 

 
producer启动了两个服务。

 
 
新建ConsumerByRibbon模块,SpringCloud版本选择Hoxton.SR9,SpringBoot版本选择2.3.2.RELEASE,选择spring-cloud-starter-netflix-eureka-client和web依赖。

 

测试代码:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@LoadBalanced开启了调用使用服务名的支持。

@RequestMapping("/hello")
public String hello() {
    return restTemplate.getForObject("http://producer/hello", String.class);
}

producer是服务提供方的服务名。

访问http://localhost:8003/hello,多点几次,可以看到输出结果中端口的变化。证明已成功应用了负载均衡。

ribbon负载均衡算法

默认实现:

ZoneAvoidanceRule(区域权衡策略):复合判断Server所在区域的性能和Server的可用性,轮询选择服务器。

其他规则:

BestAvailableRule(最低并发策略):会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。逐个找服务,如果断路器打开,则忽略。

RoundRobinRule(轮询策略):以简单轮询选择一个服务器。按顺序循环选择一个server。

RandomRule(随机策略):随机选择一个服务器。

AvailabilityFilteringRule(可用过滤策略):会先过滤掉多次访问故障而处于断路器跳闸状态的服务和过滤并发的连接数量超过阀值得服务,然后对剩余的服务列表安装轮询策略进行访问。

WeightedResponseTimeRule(响应时间加权策略):据平均响应时间计算所有的服务的权重,响应时间越快服务权重越大,容易被选中的概率就越高。刚启动时,如果统计信息不中,则使用RoundRobinRule(轮询)策略,等统计的信息足够了会自动的切换到WeightedResponseTimeRule。响应时间长,权重低,被选择的概率低。反之,同样道理。此策略综合了各种因素(网络,磁盘,IO等),这些因素直接影响响应时间。

RetryRule(重试策略):先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败则在指定的时间会进行重试,进行获取可用的服务。如多次获取某个服务失败,就不会再次获取该服务。主要是在一个时间段内,如果选择一个服务不成功,就继续找可用的服务,直到超时。