Skip to content

第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。

4.2.1 编写服务

4.2.2 编写请求客户端

4.2.3 Ribbon的配置

4.3 Ribbon的负载均衡机制

4.3.1 负载均衡器

4.3.2 自定义负载规则

4.3.3 Ribbon自带的负载规则

4.3.4 Ping机制

4.3.5 自定义Ping

4.3.6 其他配置

4.4 在Spring Cloud中使用Ribbon

4.4.1 准备工作

4.4.2 使用代码配置Ribbon

4.4.3 使用配置文件设置Ribbon

4.4.4 Spring使用Ribbon的API

4.5 RestTemplate负载均衡

4.5.1 @LoadBalanced注解概述

4.5.2 编写自定义注解以及拦截器

4.5.3 使用自定义拦截器以及注解

4.5.4 在控制器中使用RestTemplate

4.6 本章小结