文章目录
1. Ribbon
- Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。
- Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
2.负载均衡原理
- 将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。
- 常见的负载均衡方式有两种:服务端负载均衡、客户端负载均衡
1.服务端负载均衡
- 当客户端发送请求时,该请求发送到负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。
- 服务端负载均衡的特点:
- 需要建立一个独立的负载均衡服务器。
- 负载均衡是在客户端发送请求后进行的,客户端并不知道是哪个服务端提供的服务。
- 可用服务端清单存储在负载均衡服务器上。
2.客户端负载均衡
- 客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上。客户端通过服务注册中心获取到一份服务端提供的可用服务清单。负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;
- 客户端负载均衡的特点:
- 负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器。
- 负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务。
- 客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的。
3.负载均衡流程
4.负载均衡策略
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在"短路"状态服务器(2)并发数过高的服务器。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。而后再对Zone内的多个服务做轮询,默认的实现就是ZoneAvoidanceRule,是一种轮询方案 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器 |
RandomRule | 随机选择一个可用的服务器 |
RetryRule | 重试机制的选择逻辑 |
5.自定义负载均衡策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:代码方式、配置文件方式
1.代码方式
- 在order-service中的OrderApplication类中,定义一个新的IRule
java
/**
* 创建 RestTemplate 并注入 Spring 容器
* @return
*/
@Bean
@LoadBalanced
public IRule restTemplate(){
return new RandomRule();
}
2.配置文件方式
- 在order-service的application.yml文件中,添加新的配置也可以修改规则
yml
user-service: # 给某个微服务配置负载均衡规则
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
一般用默认的负载均衡规则,不做修改
6.饥饿加载
-
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时
-
在order-service的application.yml文件中,添加新的配置也可以修改规则,开启饥饿加载
yml
ribbon:
eager-load:
enabled: true
clients: user-service