02-负载均衡详解

张开发
2026/4/17 15:29:24 15 分钟阅读

分享文章

02-负载均衡详解
Spring Cloud 负载均衡详解一、知识概述负载均衡是微服务架构中的关键技术,它将请求分发到多个服务实例上,提高系统的吞吐量和可用性。Spring Cloud 提供了多种负载均衡解决方案,包括 Ribbon(已维护模式)和 Spring Cloud LoadBalancer。负载均衡的核心功能:请求分发:将请求分发到多个实例实例选择:根据策略选择合适的实例健康检查:剔除不健康的实例重试机制:失败后重试其他实例理解负载均衡的原理和配置,是构建高可用微服务系统的重要技能。二、知识点详细讲解2.1 负载均衡分类服务端负载均衡客户端 → 负载均衡器(Nginx/F5) → 服务实例1 → 服务实例2 → 服务实例3特点:集中管理需要独立部署有单点故障风险客户端负载均衡客户端(内置负载均衡)→ 服务实例1 → 服务实例2 → 服务实例3特点:去中心化无需独立部署客户端逻辑复杂2.2 负载均衡算法算法说明适用场景轮询依次访问每个实例实例性能相近随机随机选择实例实例性能相近加权轮询按权重轮询实例性能不同加权随机按权重随机实例性能不同最少连接选择连接数最少的长连接场景一致性哈希相同请求路由到相同实例缓存场景响应时间加权响应时间短权重高性能敏感场景2.3 Spring Cloud LoadBalancerSpring Cloud LoadBalancer 是 Spring Cloud 官方推荐的负载均衡器,用于替代 Ribbon。核心组件ServiceInstanceListSupplier:服务实例列表提供者ReactorServiceInstanceLoadBalancer:负载均衡器LoadBalancerClient:负载均衡客户端LoadBalancerClientFactory:负载均衡客户端工厂2.4 Ribbon 核心组件虽然 Ribbon 已进入维护模式,但很多项目仍在使用:ServerList:服务器列表IRule:负载均衡规则IPing:健康检查ServerListFilter:服务器过滤2.5 负载均衡配置spring:cloud:loadbalancer:ribbon:enabled:false# 禁用 Ribboncache:enabled:truettl:35shealth-check:initial-delay:0interval:25s三、代码示例3.1 RestTemplate + 负载均衡importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.client.RestTemplate;@SpringBootApplication@RestControllerpublicclassLoadBalancerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(LoadBalancerApplication.class,args);}@Bean@LoadBalanced// 启用负载均衡publicRestTemplaterestTemplate(){returnnewRestTemplate();}@AutowiredprivateRestTemplaterestTemplate;@GetMapping("/call")publicStringcallService(){// 使用服务名调用,自动负载均衡returnrestTemplate.getForObject("http://user-service/api/users/1",String.class);}}3.2 WebClient + 负载均衡importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.reactive.function.client.WebClient;@SpringBootApplication@RestControllerpublicclassReactiveLoadBalancerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ReactiveLoadBalancerApplication.class,args);}@Bean@LoadBalancedpublicWebClient.BuilderwebClientBuilder(){returnWebClient.builder();}@AutowiredprivateWebClient.BuilderwebClientBuilder;@GetMapping("/reactive")publicMonoStringreactiveCall(){returnwebClientBuilder.build().get().uri("http://user-service/api/users/1").retrieve().bodyToMono(String.class);}}3.3 自定义负载均衡策略importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.loadbalancer.core.*;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importreactor.core.publisher.Mono;importjava.util.*;importjava.util.concurrent.atomic.AtomicInteger;@ConfigurationpublicclassCustomLoadBalancerConfig{// 自定义轮询负载均衡器@BeanReactorServiceInstanceLoadBalancercustomLoadBalancer(ServiceInstanceListSupplierserviceInstanceListSupplier){returnnewCustomRoundRobinLoadBalancer(serviceInstanceListSupplier);}}classCustomRoundRobinLoadBalancerimplementsReactorServiceInstanceLoadBalancer{privatefinalServiceInstanceListSupplierserviceInstanceListSupplier;privatefinalAtomicIntegerposition=newAtomicInteger(0);publicCustomRoundRobinLoadBalancer(ServiceInstanceListSupplierserviceInstanceListSupplier){this.serviceInstanceListSupplier=serviceInstanceListSupplier;}@OverridepublicMonoResponseServiceInstancechoose(Requestrequest){returnserviceInstanceListSupplier.get().next().map(instances-{if(instances.isEmpty()){returnnewEmptyResponse();}intpos=Math.abs(position.incrementAndGet()%instances.size());ServiceInstanceinstance=instances.get(pos);returnnewDefaultResponse(instance);})

更多文章