Appearance
第4章 负载均衡
本章要点
- 认识 Ribbon
- 第一个Ribbon 程序
- Ribbon 的负载均衡机制
- 在 Spring Cloud 中使用 Ribbon
- RestTemplate 的负载均衡机制
负载均衡是分布式架构的重点,负载均衡机制决定着整个服务集群的性能与稳定。根据前面章节的介绍可知, Eureka 服务实例可以进行集群部署,每个实例都均衡处理服务请求,那么这些请求是如何被分摊到各个服务实例中的呢?本章将讲解 Netflix 的负载均衡项目 Ribbon 。
4.1 Ribbon介绍
4.1.1 Ribbon简介
Ribbon 是 Netflix 下的负载均衡项目,它在集群中为各个客户端的通信提供了支持,它主要实现中间层应用程序的负载均衡。 Ribbon 提供以下特性:
- 负载均衡器,可支持插拔式的负载均衡规则 。
- 对多种协议提供支持,例如 HTTP、TCP、UDP。
- 集成了负载均衡功能的客户端 。
同为 Netflix 项目, Ribbon 可以与 Eureka 整合使用, Ribbon 同样被集成到 Spring Cloud 中,作为 spring-cloud-netflix 项目中的子模块 。 Spring Cloud 将 Ribbon 的 API 进行了封装,使用者可以使用封装后的 API 来实现负载均衡,也可以直接使用 Ribbon 的原生 API 。
4.1.2 Ribbon子模块
Ribbon 主要有以下三大子模块:
- ribbon-core:该模块为 Ribbon 项目的核心,主要包括负载均衡器接口定义、 客户端接口定义、内置的负载均衡实现等 API 。
- ribbon-eureka:为 Eureka 客户端提供的负载均衡实现类。
- ribbon-httpclient:对 Apache 的 HttpClient 进行封装,该模块提供了含有负载均衡功能的 REST 客户端 。
4.1.3 负载均衡器组件
Ribbon 的负载均衡器主要与集群中的各个服务器进行通信,负载均衡器需要提供以下基础功能 :
- 维护服务器的 IP 、 DNS 名称等信息 。
- 根据特定的逻辑在服务器列表中循环。
为了实现负载均衡的基础功能,Ribbon的负载均衡器有以下三大子模块:
- Rule:一个逻辑组件,这些逻辑将会决定从服务器列表中返回哪个服务器实例。
- Ping:该组件主要使用定时器来确保服务器网络可以连接。
- ServerList:服务器列表,可以通过静态的配置确定负载的服务器,也可以动态指定服务器列表。如果动态指定服务器列表,则会有后台的线程来刷新该列表。
本章关于Ribbon的知识,主要围绕负载均衡器组件进行。接下来,我们先编写一个Ribbon程序,让大家对Ribbon有一个初步的认识。
4.2 个Ribbon程序
本章的 4.2 节和 4.3 节,单独使用 Ribbon 框架,关于整合 Spring Cloud 的内容,将在4.4 节讲述 。本节将以一个简单的 Hello World 程序来展示 RibbonAPI 的使用。本例的程序结构如图 4-1 所示。
本书所使用的 Spring Cloud 默认集成的 Ribbon 版本为 2.2.2 , 因此本书也使用该版本的 Ribbon。