LoadBalancer负载均衡:集群高可用调用优化
LoadBalancer负载均衡集群高可用调用优化一个服务三个节点请求来了该打给谁你总不能闭着眼睛随机点一个吧——那叫非洲大草原式负载均衡。今天聊聊 SpringCloud 官方的 LoadBalancer让你的请求分配得明明白白。一、负载均衡到底在均衡什么假设你的product-service部署了 3 个节点每天被调用 10 万次。如果没有负载均衡所有请求可能全打到节点 A 上——节点 A CPU 飙到 99%节点 B 和 C 闲得发慌。这就是典型的流量分配不均。负载均衡解决三个问题分摊压力请求分散到多个节点避免单点过热提高可用性某个节点挂了自动切换到健康的节点横向扩展流量涨了就加节点负载均衡自动把新节点纳入调度1.1 客户端 vs 服务端负载均衡服务端负载均衡 (Nginx) 客户端负载均衡 (LoadBalancer) Client → Nginx ┬→ Server A Client ─── 拉取实例列表 ──→ 注册中心 ├→ Server B │ └→ Server C ├─ 选节点A → 直连 ├─ 选节点B → 直连 └─ 选节点C → 直连 请求先到Nginx 请求直接打到后端省去一层转发 Nginx负责分发 客户端自己做负载决策特性服务端 (Nginx)客户端 (LoadBalancer)流量路径请求→Nginx→实例请求→实例直连性能开销多一跳无额外跳转配置管理集中配置分散在客户端典型场景网关入口微服务内部调用实例发现手动配置 upstream自动从注册中心拉取微服务架构里服务端负载均衡常放在最外层网关入口内部服务间调用用客户端负载均衡——两者不是替代关系而是互补。二、LoadBalancer 替代 RibbonRibbon 曾是 SpringCloud 标配的客户端负载均衡组件但 Netflix 在 2018 年宣布其进入维护模式不再加新功能。SpringCloud 官方推出了 Spring Cloud LoadBalancer 作为替代。为什么要换Ribbon 已停更Bug 不会再修Ribbon 基于阻塞式 HTTP 客户端不适配 WebFlux 响应式场景LoadBalancer 原生支持 Spring Reactor响应式友好2.1 依赖引入dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency无需额外注解LoadBalancer 会自动配置。如果你同时引入了 Feign 或 SpringCloud GatewayLoadBalancer 会自动整合。2.2 LoadBalancer 整合 Nacos┌──────────────────────────────────────────────┐ │ Nacos 注册中心 │ │ product-service: [192.168.1.10, .11, .12] │ └──────────────────────────────────────────────┘ ↑ 注册 ↓ 定时拉取30s间隔 ┌─────────────────┐ ┌─────────────────────┐ │ product-service │ │ order-service │ │ (3个实例) │ │ ┌─────────────────┐ │ │ │←───│ │ LoadBalancer │ │ │ │ 调用│ │ ↓ 选一个实例 │ │ └─────────────────┘ │ │ 直连调用 │ │ │ └─────────────────┘ │ └─────────────────────┘关键点LoadBalancer 从 Nacos 获取的是服务实例列表的快照缓存默认每 30 秒刷新一次。这意味着新实例上线最多 30 秒后才能被调用方感知——如果你的服务扩缩容很频繁需要调小刷新间隔。三、负载均衡策略3.1 内置策略LoadBalancer 默认提供两种策略策略实现类说明轮询 (RoundRobin)RoundRobinLoadBalancer依次轮转默认策略随机 (Random)RandomLoadBalancer随机选一个实例默认就是轮询如果你就是想要随机的加个配置即可ConfigurationpublicclassLoadBalancerConfig{BeanpublicReactorLoadBalancerServiceInstancerandomLoadBalancer(Environmentenvironment,LoadBalancerClientFactoryloadBalancerClientFactory){Stringnameenvironment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);returnnewRandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class),name);}}3.2 自定义策略基于权重的负载均衡生产环境中很可能不是所有节点配置相同——8 核 16G 的机器和 4 核 8G 的机器分配的流量应该不一样。我们来写一个权重负载均衡Slf4jpublicclassWeightedLoadBalancerimplementsReactorServiceInstanceLoadBalancer{privatefinalObjectProviderServiceInstanceListSupplierserviceInstanceListSupplierProvider;privatefinalStringserviceId;publicWeightedLoadBalancer(ObjectProviderServiceInstanceListSuppliersupplierProvider,StringserviceId){this.serviceInstanceListSupplierProvidersupplierProvider;this.serviceIdserviceId;}OverridepublicMonoResponseServiceInstancechoose(Requestrequest){ServiceInstanceListSuppliersupplierserviceInstanceListSupplierProvider.getIfAvailable();returnsupplier.get(request).next().map(instances-{ServiceInstancechosenchooseByWeight(instances);if(chosennull){returnnewEmptyResponse();}log.debug(权重策略选中: {}:{},chosen.getHost(),chosen.getPort());returnnewDefaultResponse(chosen);});}privateServiceInstancechooseByWeight(ListServiceInstanceinstances){if(instances.isEmpty())returnnull;// 从 Nacos 元数据中读取权重默认 1inttotalWeightinstances.stream().mapToInt(i-Integer.parseInt(i.getMetadata().getOrDefault(weight,1))).sum();if(totalWeight0){// 没有权重配置时回退到轮询returninstances.get(ThreadLocalRandom.current().nextInt(instances.size()));}// 按权重随机intoffsetThreadLocalRandom.current().nextInt(totalWeight);for(ServiceInstanceinstance:instances){intweightInteger.parseInt(instance.getMetadata().getOrDefault(weight,1));offset-weight;if(offset0){returninstance;}}returninstances.get(0);}}配置这个自定义策略ConfigurationpublicclassWeightedLoadBalancerConfig{BeanpublicReactorLoadBalancerServiceInstanceweightedLoadBalancer(Environmentenvironment,LoadBalancerClientFactoryfactory){Stringnameenvironment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);returnnewWeightedLoadBalancer(factory.getLazyProvider(name,ServiceInstanceListSupplier.class),name);}}然后在 Nacos 配置实例元数据weight3权重越高被选中的概率越大。这下你那台 16 核机器的weight设成 34 核机器设成 1流量自然分配得更合理。四、健康检查与缓存机制LoadBalancer 依赖 Nacos 的健康检查。Nacos 客户端会定时默认 5 秒向服务实例发送心跳如果超时没收到就标记该实例不健康下一轮 LoadBalancer 拉取时就不会包含它。spring:cloud:loadbalancer:cache:enabled:truettl:30s# 缓存过期时间即多久刷新一次实例列表capacity:1000# 缓存容量nacos:discovery:heartbeat-interval:5s# 心跳间隔注意cache.ttl不宜设得太小否则频繁从 Nacos 拉取会增加注册中心压力太大则服务上下线感知慢。30 秒是个合理的默认值。五、与 Feign 的关系大多数开发者不需要直接操作 LoadBalancer因为 Feign 已经帮你集成了——引入spring-cloud-starter-loadbalancer后Feign 会自动走 LoadBalancer 选节点。你在代码里只用关心 Feign 接口怎么写负载均衡全程在幕后工作。User Code ↓ 调用 FeignClient 代理 ↓ 拦截请求 LoadBalancer.choose(serviceName) ↓ 选出一个实例 HttpURL → http://192.168.1.10:8081/api/product/1 ↓ 发起请求 product-service 实例六、负载均衡策略对比策略原理优点缺点适用场景轮询依次分配实现简单、各节点尽可能平均不考虑节点性能差异节点配置相同随机随机选取简单可能不均匀对均衡性要求不高权重按比例分配适配异构集群需维护权重信息节点配置不同最少连接选当前连接最少的动态均衡需维护连接计数长连接场景一致性哈希同参数请求到同一节点缓存友好节点变化时受影响需要会话保持总结LoadBalancer 是微服务内部调用的流量调度器它从 Nacos 感知服务拓扑按策略选择目标实例。日常开发中你甚至感觉不到它的存在——Feign 帮你挡掉了所有复杂性。但当你的服务出现流量倾斜、某些节点负载过高时就该优化负载均衡策略了。

相关新闻

Grok 4.5两周主力实测:代码、检索、推理与Agent场景能否替代GPT-5.6

Grok 4.5两周主力实测:代码、检索、推理与Agent场景能否替代GPT-5.6

GPT-5.6好用但贵,Grok 4.5免费但质量差一些——这是大部分人的印象。但到底差多少?哪些场景能替代、哪些不能?我把Grok 4.5当主力用了两周,从代码辅助到知识检索到逻辑推理到Agent,逐个场景跟GPT-5.6做了对比。结论是&…

2026/10/9 6:22:47 阅读更多 →
UiPath Community Register

UiPath Community Register

https://cloud.uipath.com/portal_/register打开链接 → 注册账号(QQ/163 等个人邮箱均可,无需企业邮箱) 注册类型选择 Community(社区版免费方案) 邮箱验证完成,进入云端控制台 左侧菜单【资源中心 Resour…

2026/9/27 10:21:06 阅读更多 →
PUTTY.EXE  PSCP.EXE

PUTTY.EXE PSCP.EXE

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>d:D:\> D:\> D:\>cd D:\puttyD:\putty> D:\putty>Linux → WindowsD:\putty>pscp admin192.168.1.110:/home/oceanbase-4.3.5.5-1050…

2026/9/27 12:05:10 阅读更多 →

最新新闻

旅游景点数据分析实战:从评论表到客流预测的完整复现路径

旅游景点数据分析实战:从评论表到客流预测的完整复现路径

简介:这份资源面向具备一定Python基础、希望入门数据分析实战的开发者与旅游行业从业者,围绕去哪儿网国庆期间景点数据展开完整分析流程。包内共7个文件,以5个html可视化页面、1个xlsx数据源和1个py分析脚本为主,压缩包约79KB&…

2026/10/10 21:21:08 阅读更多 →
Python @dataclass 从入门到进阶:核心原理、组合用法与避坑指南

Python @dataclass 从入门到进阶:核心原理、组合用法与避坑指南

如果你用 Python 写数据相关的业务代码,dataclass 大概率是你日常最常见的装饰器之一。但我接触过不少开发者,对它的理解只停留在“省得写__init__”这一层,一旦碰到默认值、继承、可变字段这些场景就各种翻车。这篇文章把我这几年的实际使用…

2026/10/10 21:21:08 阅读更多 →
基于YOLO的轨道矿车与人员检测:小数据集训练与部署实战

基于YOLO的轨道矿车与人员检测:小数据集训练与部署实战

简介:这份资源是面向矿业智能化与计算机视觉方向的YOLO格式目标检测数据集,聚焦轨道场景下矿车与人员的识别任务,适合从事工业安全监测、深度学习目标检测的开发者与研究人员使用。压缩包共2000个文件,包含1045张jpg图像、954个tx…

2026/10/10 21:21:08 阅读更多 →
9.5k stars 与日榜 18:YuE2 系列的技术底座和社区入口设计拆解

9.5k stars 与日榜 18:YuE2 系列的技术底座和社区入口设计拆解

9.5k stars 与日榜 18:YuE2 系列的技术底座和社区入口设计拆解 【免费下载链接】YuE YuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing. 项目地址: https://gitcode.com/GitHub_Trending/yue/YuE 2026…

2026/10/10 21:21:08 阅读更多 →
EmotionVGGnet情绪识别Python源码实战:从骨干搭建到训练排错

EmotionVGGnet情绪识别Python源码实战:从骨干搭建到训练排错

简介:这份资源是面向深度学习初学者与情感识别方向开发者的Python实战源码包,围绕VGGNet卷积神经网络实现情绪识别任务,适合想理解CNN在情感分析中落地流程、需要可复用代码框架的读者。压缩包共11个文件,约12.38MB,以…

2026/10/10 21:21:08 阅读更多 →
Jev设计哲学实践:类型安全、概率校准与代码掌舵

Jev设计哲学实践:类型安全、概率校准与代码掌舵

1. 从一个“反直觉”的设计选择说起第一次接触 Jev 这套设计思路的时候,我其实是有点抗拒的。原因很简单——它把“概率”这件事摆到了台面上,而且要求开发者主动去“校准”它。这跟我们过去十几年写业务代码的习惯完全相反。以前我们写代码,…

2026/10/10 21:20:07 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →