Spring cloud loadBalancer 负载均衡
常见的负载均衡策略
在分布式系统和网络架构中,负载均衡是实现高效资源分配、保障服务稳定性的核心技术,常见的负载均衡策略主要包括以下几种:
- 轮询策略:以轮流分配的方式,将客户端请求依次均匀分发至各个后端服务器。这种策略简单直观,无需考虑服务器的性能差异,适用于后端服务器性能相近的场景,能够快速实现请求的初步分流,确保每台服务器都能获得相对均衡的处理机会 。
- IP哈希策略:基于客户端的IP地址进行哈希计算,通过特定的算法将相同IP地址的请求定向到固定的后端服务器。这一策略能够保证同一用户的多次请求始终被分配到同一台服务器上,有效解决了会话保持问题,适合对用户会话连续性要求较高的业务场景,如电商购物车、用户登录状态维持等。
- 权重策略:根据后端服务器的性能指标(如CPU处理能力、内存大小、网络带宽等)为每台服务器赋予相应的权重值,性能越好的服务器权重越高,被分配到请求的概率也就越大。该策略充分考虑了服务器的实际处理能力差异,能够动态、合理地分配负载,实现资源的高效利用,适用于服务器性能参差不齐的复杂系统环境。
- 最小连接数:将请求分配到当前连接数最少的服务器上。这种策略基于服务器的实际负载情况进行分配,能更有效地利用服务器资源,避免服务器因连接数过多而过载,适用于不同请求处理时间差异较大的场景。
- 最快响应时间:根据服务器处理请求的响应时间来分配请求,总是将请求发送给响应最快的服务器。这能确保用户获得较快的响应速度,提升用户体验,尤其适用于对响应时间要求较高的应用。
- 加权最小连接数:结合了权重和最小连接数的特点。为每个服务器设置权重,同时考虑服务器当前的连接数,按照权重比例分配请求到连接数相对较少的服务器上,综合了两种策略的优势,能更灵活地应对不同服务器性能和负载情况。
- 基于地理位置:根据客户端和服务器的地理位置信息来分配请求,将请求路由到距离客户端较近的服务器,以减少网络延迟。适用于有全球用户群体或对网络延迟敏感的应用,如在线游戏、视频直播等。
- 随机:随机选择服务器来处理请求。这种方式简单直接,在服务器性能相近且负载均衡要求不高的情况下可以使用,但可能导致服务器负载不均衡,一般较少单独使用,常与其他策略结合使用。
1. pom
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.cloud.alibaba.version>2023.0.1.0</spring.cloud.alibaba.version><spring.boot.version>3.2.4</spring.boot.version><spring.cloud.version>2023.0.1</spring.cloud.version></properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 引入loadBalanced --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
2. RestTemplate使用@LoadBalanced注解
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
3. Controller中发送请求
LoadBalanced 原理:类似 请求拦截器;RestTemplate
使用了@LoadBalanced
注解,发送的请求路径会执行类似请求拦截器的代码,将serviceId
替换成服务名称中的url和port部分
@RestController
public class LoadBalancedController {@Autowiredprivate RestTemplate restTemplate;// serviceId 是 服务名称@GetMapping("lb")public String hello(@RequestParam(value = "serviceId") String serviceId) {return restTemplate.getForObject("http://"+serviceId+"/hello?name=张三", String.class);}
}
4. 负载均衡模式
- 默认是轮询策略
- 要使用权重策略则需要修改yml配置
spring:...discovery:weight: 1.0
- 随机策略
对某服务使用随机策略
@Configuration
@LoadBalancerClient(name = "service-name", configuration = RandomLoadBalancerConfig.class)
public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}