1 什么是负载均衡
负载均衡(Load Balancing)是一种分发网络流量的技术,它可以将传入的请求分发到多个服务器或者计算资源上,以提高系统的性能、可靠性和可伸缩性。在负载均衡的环境下,多个服务器共同处理来自客户端的请求,而不是单个服务器处理所有请求。
负载均衡器通常位于客户端和服务器之间,它可以根据预定的算法(例如轮询、加权轮询、最小连接数等)将请求转发到多个服务器上,以确保这些服务器的负载相对均衡。这样做可以避免单个服务器过载,提高整个系统的性能和可用性。
2 Ribbon负载均衡
Ribbon 是一个负载均衡客户端库,它可以与其他负载均衡解决方案(如 Eureka、Consul、Zookeeper 等)结合使用,提供了在客户端实现负载均衡的功能。Ribbon 主要用于微服务架构中,能够将请求分发到多个服务实例上,以提高系统的性能、可靠性和可伸缩性。
下面是 Ribbon 负载均衡的一些关键特性:
客户端负载均衡:Ribbon 在客户端实现负载均衡,即每个服务消费者都包含一个 Ribbon 实例,用于决定向哪个服务实例发送请求。
多种负载均衡算法:Ribbon 提供了多种负载均衡算法,如轮询、加权轮询、随机等,可以根据实际需求选择合适的算法。
服务实例的健康检查:Ribbon 可以定期检查服务实例的健康状态,如果某个服务实例不可用,它将不再接收请求,直到恢复正常。
容错和重试机制:Ribbon 具有容错和重试机制,可以处理因网络故障或服务实例不可用导致的请求失败问题。
自定义配置:Ribbon 提供了丰富的配置选项,可以根据实际情况进行定制,包括超时设置、重试策略、连接池配置等。
与 Spring Cloud 整合:Ribbon 是 Spring Cloud 中的一部分,可以与其他组件(如 Eureka、Zookeeper、Consul 等)无缝集成,实现微服务架构中的负载均衡功能。
总的来说,Ribbon 是一个功能强大、灵活易用的负载均衡解决方案,适用于构建基于微服务架构的分布式系统。
3 Ribbon 负载均衡策略
RoundRobinRule(轮询策略):默认的负载均衡策略,按顺序轮询访问可用的服务实例。
RandomRule(随机策略):随机选择一个可用的服务实例进行访问。
RetryRule(重试策略):在一定次数内进行重试,如果请求失败,则会尝试重新选择另一个服务实例。
BestAvailableRule(最佳可用策略):选择最低并发的服务实例,排除故障的实例。
AvailabilityFilteringRule(可用过滤策略):过滤掉一直连接失败的服务实例,并选择其中并发量较小的实例。
WeightedResponseTimeRule(加权响应时间策略):根据历史响应时间和权重,动态计算权重,选择响应时间较快的服务实例。
ZoneAvoidanceRule(区域感知策略):根据服务所在的区域进行负载均衡,避免跨区域访问,提高访问效率。
CustomRule(自定义策略):允许开发人员自定义负载均衡策略,根据实际需求进行定制。
4.Ribbon负载均衡策略设置
4.1 全局设置
在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。
java
@Bean
public RandomRule randomRule() {
return new RandomRule();
}
4.2局部设置
修改配置文件指定服务的负载均衡策略。
java
# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
5.Ribbon 点对点直连
点对点直连是指绕过注册中心,直接连接服务提供者获取服务,一般在测试阶 段使用比较多。
5.1 添加依赖
在调用方 pom 文件中引入 ribbon 依赖,需要注意的是如果 pom 中有 Eureka 的依赖,则需要去除 Eureka 的依赖。
java
<!-- netflix ribbon 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
5.2 配置文件
配置文件中关闭 Eureka,添加直连的服务地址。如果不设置负载均衡策略默认 使用轮询策略。
java
# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 点对点直连模式,指定具体的 Provider 服务列表,多个用逗号隔开
listOfServers: http://localhost:7070,http://localhost:7071
# 关闭 Eureka 实现 Ribbon 点对点直连
ribbon:
eureka:
enabled: false # false:关闭,true:开启
5.3 访问
关闭 Eureka 注册中心,服务提供者由于无法连接至注册中心所以会报连接异 常。但是服务是可以正常可消费的,所以目前使用的是点对点的方式来进行调用的。