云中间层服务 - 区域感知负载负载均衡器 Ribbon

Ribbon 简介
        Ribbon 是 Netflix 发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法,将 Netflix 的中间层服务连接在一起。
        Why Ribbon?
        Ribbon 的区域感知负载均衡器的功能久经考验。区域感知负载均衡器内置电路跳闸逻辑,可被配置基于区域同源关系(Zone Affinity,也就是更倾向于选择发出调用的服务所在的托管区域内,这样可用降低延迟,节省成本)选择目标服务实例。它监控每个区域中运行的实例的运维行为,而且能够实时快速丢弃一整个区域。在面对整个区域的故障时,这帮我们提升了弹性。简单的来说,在配置文件中列出LB后面所有的机器,ribbon 会自动帮你去连这些机器(基于某种规则,如随机连接、轮流连接,基于响应时间等等)。我们很方便地使用 Ribbon 实现自定义负载均衡算法。
        Ribbon 的其他一些特性

  1. 发现服务,比如需要增加一些机器,可以实现 Ribbon 的一个接口将这个机器加到列表里(请参考《Ribbon 和 wowza 的集成开发》的动态修改负载节点案例);
  2. 对 Cloud 平台的支持:比如对 AWS 来说,有参数支持只返回同一个 zone 的服务器地址,这样避免跨 zone 调用所引起的网络延时;
  3. 故障恢复能力:可以将一些不可用的服务器剔除。

Ribbon 架构图

        Ribbon 时序图

        如何使用 Ribbon?
        Ribbon 提供了框架来支持通用的 LB 机制,同时也提供了对 Netflix eureka 框架的支持。接下来我们来看一下如何在 Java 项目里使用 Ribbon。
        配置文件(sample-client.properties)

# Max number of retries on the same server (excluding the first try)
sample-client.ribbon.MaxAutoRetries=1

# Max number of next servers to retry (excluding the first server)
sample-client.ribbon.MaxAutoRetriesNextServer=1

# Whether all operations can be retried for this client
sample-client.ribbon.OkToRetryOnAllOperations=true

# Interval to refresh the server list from the source
sample-client.ribbon.ServerListRefreshInterval=2000

# Connect timeout used by Apache HttpClient
sample-client.ribbon.ConnectTimeout=3000

# Read timeout used by Apache HttpClient
sample-client.ribbon.ReadTimeout=3000

# Initial list of servers, can be changed via Archaius dynamic property at runtime
sample-client.ribbon.listOfServers=www.microsoft.com:80,www.yahoo.com:80,www.google.com:80

每个条目的格式是为
<clientName>.<nameSpace>.<propertyName>=<value>
        clientName 将被接下来的工厂用于创建客户端。nameSpace 是可配置的,默认是 "ribbon"。常用属性名可以从 CommonClientConfigKey 获取。
        这些属性也可以被定义作系统属性进行获取,也可以以 Archaius 加载的任何属性资源进行获取。
        Java 代码测试

public static void main(String[] args) throws Exception {
      ConfigurationManager.loadPropertiesFromResources("sample-client.properties");  // 1
      System.out.println(ConfigurationManager.getConfigInstance().getProperty("sample-client.ribbon.listOfServers"));
      RestClient client = (RestClient) ClientFactory.getNamedClient("sample-client");  // 2
      HttpClientRequest request = HttpClientRequest.newBuilder().setUri(new URI("/")).build(); // 3
      for (int i = 0; i < 20; i++)  {
      	HttpClientResponse response = client.executeWithLoadBalancer(request); // 4
      	System.out.println("Status code for " + response.getRequestedURI() + "  :" + response.getStatus());
      }
      ZoneAwareLoadBalancer lb = (ZoneAwareLoadBalancer) client.getLoadBalancer();
      System.out.println(lb.getLoadBalancerStats());
      ConfigurationManager.getConfigInstance().setProperty(
      		"sample-client.ribbon.listOfServers", "www.linkedin.com:80,www.google.com:80"); // 5
      System.out.println("changing servers ...");
      Thread.sleep(3000); // 6
      for (int i = 0; i < 20; i++)  {
      	HttpClientResponse response = client.executeWithLoadBalancer(request);
      	System.out.println("Status code for " + response.getRequestedURI() + "  : " + response.getStatus());
      	response.releaseResources();
      }
      System.out.println(lb.getLoadBalancerStats()); // 7
}

代码解释:

  1. 使用 Archaius ConfigurationManager 加载属性;
  2. 使用 ClientFactory 创建客户端和负载均衡器;
  3. 使用 builder 构建 http 请求。注意我们只支持 URI 的 "/" 部分的路径,一旦服务器被负载均衡器选中,会由客户端计算出完整的 URI;
  4. 调用 API client.executeWithLoadBalancer(),不是 exeucte() API;
  5. 动态修正配置中的服务器池;
  6. 等待服务器列表刷新(配置文件中定义的刷新间隔是为 2 秒钟);
  7. 打印出负载均衡器记录的服务器统计信息。

负载均衡器统计包含了很多用于监控的信息,可以用于负载均衡算法的输入。
        关于 Ribbon 客户端使用的小 demo(包括 LB 调用、动态调整负载均衡节点)请参考博客《Ribbon 和 wowza 的集成开发》。
        参考资料

云中间层服务 - 区域感知负载负载均衡器 Ribbon

时间: 2024-08-25 23:20:47

云中间层服务 - 区域感知负载负载均衡器 Ribbon的相关文章

【微服务架构】SpringCloud之Ribbon(四)

一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器.我们也很容易使用Ribbon实现自定义的负载均衡算法. 二:LB方案分类 目前主流的LB方案可分成两类:一种是集中式LB,

客户端负载均衡Ribbon之二:Loadbalance的几种算法以及在ribbon中的使用

Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等,很多地方都使用到了负载均衡. 使用负载均衡带来的好处很明显: 当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用 使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致系统cpu急剧上升 负载均衡有好几种实现策略,常见的有: 随机 (Rando

客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

Netflix:['netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     LB方案分类 目前主流的LB方案可分成两类: 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方: 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址

【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可以进行分发业务量的解决方案.在SpringCloud 体系当中,加入了Netflix公司的很多优秀产品,其中一个就是针对于服务端进行负载均衡的Ribbon. 本系列博文目录 [微服务]之三:轻松搞定SpringCloud微服务目录 本系列为连载文章,阅读本文之前强烈建议您先阅读前面几篇. 相关简介

kubernetes云平台管理实战: 服务发现和负载均衡(五)

一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT READY AGE myweb 3 3 3 3m [root@k8s-master ~]# kubectl get rc NAME DESIRED CURRENT READY AGE myweb 3 3 3 5m 2.删除rc [root@k8s-master ~]# kubectl delete

【微服务架构】SpringCloud之Ribbon

一:Ribbon是什么? Ribbon是Netfix发布的开源项目,主要负责客户端的软件负载均衡算法,将Netfix的中间层连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说.就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器.我们也很容易使用Riben实现自定义负载均衡算法: 二:LB方案分类 目前主流的LB方案可以分成两类,一类是集中式LB,即在服务的消费方

客户端负载均衡Ribbon之源码解析

什么是负载均衡器? 假设有一个分布式系统,该系统由在不同计算机上运行的许多服务组成.但是,当用户数量很大时,通常会为服务创建多个副本.每个副本都在另一台计算机上运行.此时,出现 "Load Balancer(负载均衡器)".它有助于在服务器之间平均分配传入流量. 服务器端负载均衡器 传统上,Load Balancers(例如Nginx.F5)是放置在服务器端的组件.当请求来自 客户端 时,它们将转到负载均衡器,负载均衡器将为请求指定 服务器.负载均衡器使用的最简单的算法是随机指定.在这

Spring Cloud 客服端负载均衡 Ribbon

一.简介   Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎存在于每个微服务的基础设施中.包括前面的提供的声明式服务调用也是基于该Ribbon实现的.理解Ribbon对于我们使用Spring Cloud来讲非常的重要,因为负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.在上节的例子中,我们采用了声明式的方式来实现负载均衡.实际

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具