欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深度:一文搞懂Ribbon使用及内核原理剖析

程序员文章站 2022-07-09 18:34:15
1.什么是RibbonSpring Cloud Ribbon是 基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer( LB )获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。1.1 什么是客户端的负载均衡进程内的LB,他是一个类库集成到消费端,通过消费端进行获取提供者的地址。生活中: 类似与你去火车站...

1.什么是Ribbon

Spring Cloud Ribbon是 基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon
客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer( LB )获取到服
务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。
Ribbon也可以实现我们自己的负载均衡算法。

1.1 什么是客户端的负载均衡

进程内的LB,他是一个类库集成到消费端,通过消费端进行获取提供者的地址。
生活中: 类似与你去火车站排队进站(有三条通道),只要是正常人,都会排队到人少的队
伍中去。
程序中: 我们消费端 能获取到服务提供者地址列表,然后根据某种策略去获取一个地址进行
调用。
深度:一文搞懂Ribbon使用及内核原理剖析

1.2 什么是服务端的负载均衡

生活中:类似与你去火车站排队进站的时候,有一个火车站的引导员告诉你说三号通道人
少,你去三号通道排队。

程序中:就是你消费者调用的是ng的地址,由ng来选择 请求的转发(轮询 权重,ip_hash等)
深度:一文搞懂Ribbon使用及内核原理剖析

2. 快速整合Ribbon

引入依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐eureka‐client</artifactId>
 </dependency>
 <!‐‐添加ribbon的依赖, eureka client启动器已经依赖了ribbon,可以不配‐‐>
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐ribbon</artifactId>
 </dependency>

添加@LoadBalanced注解

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

3. Ribbon内核原理

3.1 Ribbon调用流程

深度:一文搞懂Ribbon使用及内核原理剖析

3.2 Ribbon负载均衡策略

深度:一文搞懂Ribbon使用及内核原理剖析

  1. RandomRule: 随机选择一个Server。

  2. RetryRule: 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择
    Server不成功,则一直尝试使用subRule的方式选择一个可用的server。

  3. RoundRobinRule: 轮询选择, 轮询index,选择index对应位置的Server。

  4. AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的
    后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate
    来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。

  5. BestAvailableRule: 选择一个最小的并发请求的Server,逐个考察Server,如
    果Server被tripped了,则跳过。

  6. WeightedResponseTimeRule: 根据响应时间加权,响应时间越长,权重越
    小,被选中的可能性越低。

  7. ZoneAvoidanceRule: 复合判断Server所在区域的性能和Server的可用性选择
    Server。

3.2.1 修改默认负载均衡策略

 @Configuration
 public class AppConfig {

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

3.2.2 自定义负载均衡策略

1)自定义负载算法

public class MyRandomRule extends AbstractLoadBalancerRule {

  /** 总共被调用的次数,目前要求每台被调用5次 */
  private int total = 0;
  /** 当前提供服务的机器号 */
  private int currentIndex = 0;

  public Server choose(ILoadBalancer lb, Object key) {
  if (lb == null) {
  return null;
  }
  Server server = null;

  while (server == null) {
  if (Thread.interrupted()) {
  return null;
  }
  //激活可用的服务
  List<Server> upList = lb.getReachableServers();
  //所有的服务
  List<Server> allList = lb.getAllServers();

  int serverCount = allList.size();
  if (serverCount == 0) {
  return null;
  }

  if (total < 5) {
  server = upList.get(currentIndex);
  total++;
  } else {
  total = 0;
  currentIndex++;
  if (currentIndex >= upList.size()) {
  currentIndex = 0;
    }
  }
  if (server == null) {
  Thread.yield();
  continue;
  }

  if (server.isAlive()) {
  return (server);
  }

  // Shouldn't actually happen.. but must be transient or a bug.
  server = null;
  Thread.yield();
  }
  return server;
  }

  @Override
  public Server choose(Object key) {
  return choose(getLoadBalancer(), key);
  }

  @Override
  public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
 }

2)在SpringBoot主程序扫描的包外定义配置类

 @Configuration
 public class MySelfRule {
 @Bean
  public IRule myRule(){
  return new MyRandomRule();
  }
 }

注意:自定义的负载均衡策略不能写在@SpringbootApplication注解的@CompentScan
扫描得到的地方,否则自定义的配置类就会被所有的 RibbonClients共享。
深度:一文搞懂Ribbon使用及内核原理剖析
3)使用@RibbonClient指定负载均衡策略,在SpringBoot主程序添加 @RibbonClient 引
入配置类

 @SpringBootApplication
 @RibbonClient(name = "service‐order",configuration = MySelfRule.class)
 public class ServiceMemberApplication {}

3.3 Ribbon相关接口
参考: org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。

IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区
域环境下选出最佳区域的实例进行访问。

IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的
实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是
可用的。

ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。

ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该
策略能够优先过滤出与请求方处于同区域的服务实例。

ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域
感知的能力
修改配置:

 # 使用<clientName>.ribbon.<key>=<value>的形式进行配置
 # 参考org.springframework.cloud.netflix.ribbon.PropertiesFactory
 # PingUrl: Get http://192.168.3.1:8010/
 # 指定IPing
 service‐order.ribbon.NFLoadBalancerPingClassName=\
  com.netflix.loadbalancer.PingUrl
 # 指定IRule
 service‐order.ribbon.NFLoadBalancerRuleClassName=\
  com.netflix.loadbalancer.RandomRule

4 Ribbon源码分析

深度:一文搞懂Ribbon使用及内核原理剖析
(需要原图的朋友可以关注我的微信公众号:输入:Ribbon)

最后整理了一些资料!分享给需要面试刷题的朋友,也祝愿大家顺利拿到自己想要的offer,这份资料主要包含了Java基础,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题,有需要完整版的朋友可以点一点链接跳转领取,链接:戳这里免费下载,获取码:csdn

深度:一文搞懂Ribbon使用及内核原理剖析

本文地址:https://blog.csdn.net/qq_41770757/article/details/110552363