文章目录
- 什么是负载均衡
- 为什么要负载均衡
- 实现负载均衡
- 配置负载均衡策略
- 自定义的策略算法
- 使用 @LoadBalancerClient 指定策略
什么是负载均衡
负载均衡(Load Balancing)是一种将流量分配到多个服务器的技术,旨在提高系统的可用性、性能和可靠性。它的核心目标是确保所有服务器负载均匀,避免某个服务器过载而影响系统运行。
为什么要负载均衡
1.某个服务器压力过大,容易宕机,假设所有请求都发送到 同一台服务器,如果请求量太大,这台服务器可能会崩溃。
2.资源利用不均,一些服务器可能空闲,而其他服务器却超载,导致整体效率低下。
3.单点故障,如果只有一个服务器,一旦故障,整个系统就不可用。
扩展性差,不能随着业务增长动态增加服务器,系统性能受限。
实现负载均衡
配置负载均衡策略
导包,注意spring cloud在2020+版本之后就舍弃了ribbon,全部都使用了loadBalancer负载均衡。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
在我们的yaml文件中配置上我们调用的服务,以及需要的负载均衡策略算法,轮询。
spring:cloud:loadbalancer:clients:my-service: # 这里的 "my-service" 是你的服务名称hint: round_robin
负载均衡测策略算法,根绝我们的业务场景选择不同的策略算法。
round_robin 轮询(默认策略,每次请求按顺序选择不同实例)
random 随机(每次请求随机选择一个实例)
weighted 权重(基于实例权重分配请求,需要额外配置)
response_time 响应时间(选择响应时间较短的实例)
自定义的策略算法
创建我们自定义的ReactorLoadBalancer,自定义一个类,继承ReactorServiceInstanceLoadBalancer,自定义的实现choose方法
public class MyCustomLoadBalancer extends ReactorServiceInstanceLoadBalancer {private final LoadBalancerClientFactory clientFactory;private final String serviceId;public MyCustomLoadBalancer(LoadBalancerClientFactory clientFactory, String serviceId) {this.clientFactory = clientFactory;this.serviceId = serviceId;}//如何选择我们的实例@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {List<ServiceInstance> instances = clientFactory.getInstances(serviceId);if (instances.isEmpty()) {return Mono.empty();}// 选择第一个实例(自定义逻辑)return Mono.just(new DefaultResponse(instances.get(0)));}
}
配置 ReactorLoadBalancer Bean
@Configuration
public class LoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> customLoadBalancer(LoadBalancerClientFactory clientFactory) {return new MyCustomLoadBalancer(clientFactory, "my-service");//这里应该指定我们所调用服务的服务名称}
}
这样,Spring Cloud LoadBalancer 在调用 “my-service” 时,就会使用你的 MyCustomLoadBalancer 逻辑。
使用 @LoadBalancerClient 指定策略
@LoadBalancerClient(name = "order-service", configuration = CustomLoadBalancerConfig.class)
public class OrderServiceClient {
}
其中 CustomLoadBalancerConfig.class 定义了 负载均衡策略:
@Configuration
public class CustomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> roundRobinLoadBalancer(LoadBalancerClientFactory clientFactory) {return new RoundRobinLoadBalancer(clientFactory, "order-service");}
}
loadBalance的加载流程

