『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用


🚀『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】

📣读完这篇文章里你能收获到
- 🎯 掌握APISIX中多种负载均衡策略的原理及其适用场景。
- 📈 学习如何通过APISIX的Admin API和Dashboard进行负载均衡配置和管理。
- 🚀 了解APISIX在云原生环境中与服务发现系统的集成方式。
- 🛠️ 探索APISIX的性能优化技巧和故障检测与转移机制,提高系统的稳定性和可靠性。

文章目录
- 一、APISIX负载均衡基础
- 二、负载均衡策略详解
- 2.1 带权轮询(Weighted Round Robin, WRR)
- 2.2 最少连接数(Least Connections)
- 2.3 一致性哈希(Consistent Hashing)
- 2.4 指数加权移动平均(Exponential Moving Average, EMA)
- 三、动态负载均衡实战
- 3.1 带权轮询算法演示
- 3.2 配置示例
- 3.2.1 Admin API应用
- 3.2.2 Dashboard可视化操作
- 3.3 云原生服务发现的集成
- 四、负载均衡性能优化与故障转移
- 4.1 性能优化
- 4.1.1 缓存机制
- 4.1.2 连接复用
- 4.1.3 健康检查参数调整
- 4.1.4 批量请求处理
- 4.2 故障检测与快速故障转移
- 4.2.1 主动健康检查
- 4.2.2 被动健康检查
- 4.2.3 快速故障转移
- 4.2.4 优雅回退
一、APISIX负载均衡基础
Apache APISIX基于高性能的Nginx和OpenResty平台构建,通过Lua脚本实现灵活的业务逻辑。在负载均衡方面,APISIX通过定义Upstream来集中管理一组后端服务实例,然后在路由配置中引用对应的Upstream,实现请求的均衡分发。
每个Upstream内部可以设置多种负载均衡策略,且可以动态更新服务实例列表,无需重启服务就能实现配置变更的实时生效,这极大地提升了运维效率和系统的响应速度。

二、负载均衡策略详解
2.1 带权轮询(Weighted Round Robin, WRR)
- 原理: 在传统的轮询算法基础上,带权轮询增加了权重的概念。每个上游服务器可以根据其处理能力或其他因素被赋予一个权重值。在调度请求时,不仅按照顺序分配,还考虑到服务器的权重比例,权重高的服务器会更频繁地接收请求。例如,如果服务器A的权重是2,而服务器B的权重是1,则在两次循环中,服务器A将会收到两次请求,而服务器B只会收到一次。
- 应用场景: 当后端服务器性能差异较大,需要按照各自处理能力动态调整接收到的请求量时,带权轮询是一个理想的选择。
2.2 最少连接数(Least Connections)
- 原理: 最少连接数算法会选择当前已建立连接数最少的上游服务器发送新的请求。这意味着每次调度都会检查所有服务器的活跃连接数,并将新的请求分配给活跃连接数最少的服务器,这样可以有效地均衡各服务器间的负载。
- 应用场景: 对于长连接服务或者处理请求所需时间差异较大的服务来说,该算法有助于避免某些服务器因处理慢速请求而堆积过多连接,保持整体系统的均衡。
2.3 一致性哈希(Consistent Hashing)
- 原理: 一致性哈希算法通过对客户端请求的特征(如请求URL、源IP地址或其他可定制的键值)进行哈希运算,将请求映射到一个虚拟环上,并根据上游服务器的位置选择最近的服务器响应请求。每个服务器也会在环上有一个或多个对应的哈希槽,这样在增加或移除服务器时,仅影响一小部分请求的分布,从而减少缓存失效和重新分布请求的成本。
- 应用场景: 在分布式缓存系统或存储集群中,一致性哈希特别有用,因为它能较好地保持数据和服务实例之间的关联性,尤其是在集群规模发生变化时。
2.4 指数加权移动平均(Exponential Moving Average, EMA)
- 原理: EMA算法基于过去一段时间内服务器响应时间和吞吐量的表现来进行动态负载均衡。它会给每个服务器分配一个基于历史性能指标计算得出的权重,并随着时间推移给予最近数据更高的权重。这样,近期表现更好的服务器将更有可能获得更多的新请求。
- 应用场景: 在实时监测服务器性能并据此做出智能决策的环境中,EMA能够实现动态优化资源分配,尤其适合那些性能波动较大的服务,确保整体系统效能最优。

三、动态负载均衡实战
配置Apache APISIX实现不同负载均衡策略:可以通过修改APISIX的Upstream配置,选择合适的负载均衡算法。可以通过API接口或Apache APISIX Dashboard设置负载均衡策略类型和相关参数。
3.1 带权轮询算法演示
接下来以带权轮询算法讲解,传入的流量按照预定顺序轮流分配给一组服务器的其中一个。
- 目标:创建一个具有两个上游服务的路由,并且启用负载均衡来测试在两个服务之间的切换情况。访问 /headers 将被转发到 httpbin.org 和 mock.api7.ai 这两个上游服务,并且会返回请求头。
3.2 配置示例
3.2.1 Admin API应用
- 创建一个upstream指向 httpbin.org及mock.api7.ai
curl http://127.0.0.1:9180/apisix/admin/upstreams \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"id": "upstream-load-balance-id","name": "upstream-load-balance", "type":"roundrobin", "pass_host": "node","scheme": "https","nodes": [ {"host": "httpbin.org","port": 443,"weight": 1}, {"host": "mock.api7.ai","port": 443,"weight": 1}]
}'

- 创建一个路由routes,绑定以上创建的upstream
curl -i "http://127.0.0.1:9180/apisix/admin/routes" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"id": "routes-load-balance-id","name": "routes-load-balance", "uri": "/headers","upstream_id": "upstream-load-balance-id"
}'

- 负载均衡请求验证,访问:http://127.0.0.1:9080/headers


3.2.2 Dashboard可视化操作
- 创建一个upstream指向 httpbin.org及mock.api7.ai
- 点击上游->创建->填写节点(注意此次验证端口需填443),协议选择HTTPs->下一步->提交


- 创建一个路由routes,绑定以上创建的upstream
- 点击路由->创建->填写匹配路径->填写HTTP匹配方法->下一步->选择上游服务->下一步->提交



- 负载均衡请求验证,访问:http://127.0.0.1:9080/headers


3.3 云原生服务发现的集成
Apache APISIX完美兼容云原生环境,能够与Kubernetes、Consul等服务发现系统集成。当服务实例在Kubernetes集群中创建或销毁时,APISIX能够自动发现并同步最新的服务实例列表,进而调整负载均衡策略,确保服务的高可用性和可扩展性。
参考官方:https://apisix.apache.org/zh/docs/apisix/discovery/

四、负载均衡性能优化与故障转移
4.1 性能优化
Apache APISIX在设计时充分考虑了性能优化,其中的一些关键措施包括:
4.1.1 缓存机制
APISIX支持对一些静态资源或者常用API的缓存,减少对后端服务的频繁调用,降低网络延迟,提高整体性能。要开启对某个路径的静态资源缓存,可以通过路由级别配置缓存插件proxy-cache实现
curl http://localhost:9080/apisix/admin/routes/routes-cache-id \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"uri": "/anything/*","plugins": {"proxy-cache": {"cache_zone": "static_cache","ttl": 3600,"cache_key": "$request_uri"}},"upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}}
}'
4.1.2 连接复用
APISIX利用Nginx的长连接特性,保持与后端服务的连接池,减少建立TCP连接的开销,提升高并发场景下的性能。
4.1.3 健康检查参数调整
通过合理设置健康检查间隔、超时时间、失败阈值等参数,既能确保及时发现和剔除故障节点,又能避免过度检查造成的性能损耗。
4.1.4 批量请求处理
APISIX支持批量处理请求,特别是在一致性哈希场景下,可以一次性完成多个请求的路由选择,降低CPU和内存的使用率。
4.2 故障检测与快速故障转移
4.2.1 主动健康检查
APISIX内置了主动健康检查机制,周期性地向后端服务发送探测请求,根据响应结果确定服务实例的健康状态。
4.2.2 被动健康检查
除了主动检查外,APISIX还能根据后端服务的实际响应情况来判定服务实例是否健康。例如,如果一段时间内请求失败次数超过阈值,则认为该实例异常。
4.2.3 快速故障转移
一旦发现后端服务实例出现故障,APISIX会立即停止向该实例发送请求,并根据负载均衡策略将流量迅速转移至其他健康的实例,保证服务的连续性。
4.2.4 优雅回退
在故障节点恢复后,APISIX还可根据配置策略,逐步将流量返回至该节点,实现负载均衡的平滑过渡和风险控制。


相关文章:
『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用
🚀『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 📣读完这篇文章里你能收获到 🎯 掌握APISIX中多种负载均衡策略的原理及其适用场景。📈 学习如何通过APISIX的Admin API和Dashboard进行负…...
【开发篇】十一、GC调优的分析工具
文章目录 1、调优的主要指标2、工具一:jstat3、工具二:Visual VM的插件4、工具三:Prometheus Grafana5、生成GC日志6、工具四:GC Viewer7、工具五:GCeasy GC调优,是为了避免因垃圾回收引起程序性能下降&am…...
SpringCloudConfig 使用git搭建配置中心
一 SpringCloudConfig 配置搭建步骤 1.引入 依赖pom文件 引入 spring-cloud-config-server 是因为已经配置了注册中心 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</…...
c#基础-引用类型和值类型的区别
在C#中,数据类型分为两类:值类型和引用类型。 值类型:直接存储数据,分配在栈(Stack)上。常见的值类型包括基本数据类型(int, float, double等),结构体(struct),枚举(enum)等。 引用类型:存储数据的引用和对象,分配在托管堆(Heap)上。常见的引用类型包括类(cla…...
面试题-3.20
1、__FILE__表示什么意思? __FILE__:当前文件的完整路径和文件名 __LINE__:当前行 __DIR__:当前文件所在的目录 2、如何获取客户端的IP地址? 通过超全局数组$_SERVER:echo $_SERVER[REMOTE_PORT]; 3、写…...
glibc内存管理ptmalloc - 多线程内存管理
上图 此图着重描述的是子线程,一个heap(由heap_info结构体描述)用完,需要另一个的情况。 子线程内存特点 1. 第一个heap物理内存上从低地址到高地址依次是:heap_infomalloc_state(arena)chunks /* arena.c #0 new_…...
区块链食品溯源案例实现(一)
引言: 食品安全问题一直是社会关注的热点,而食品溯源作为解决食品安全问题的重要手段,其重要性不言而喻。传统的食品溯源系统往往存在数据易被篡改、信息不透明等问题,而区块链技术的引入,为食品溯源带来了革命性的变革…...
4S店车辆管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 管…...
SpringBoot+Prometheus+Grafana实现应用监控和报警
一、背景 SpringBoot的应用监控方案比较多,SpringBootPrometheusGrafana是目前比较常用的方案之一。它们三者之间的关系大概如下图: 关系图 二、开发SpringBoot应用 首先,创建一个SpringBoot项目,pom文件如下: <…...
10 - Debian如何让特定用户切换root身份
作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何让特定用户切换root身份 《傅老师Debian小知识库系列之10》——原创 前言 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能…...
HPT发布HyperGAI 多模态大模型:性能领先GPT-4V,全面胜过Gemini Pro
前言 HyperGAI研究团队自豪地宣布推出HPT——新一代领先的多模态大型语言模型(Multimodal Large Language Model, Multimodal LLM)。作为人工通用智能(Artificial General Intelligence, AGI)构建的基石,HPT跨入多模态…...
汇春科技之MDT10F684
目录 第一、时钟 第二,定时器Timer0 第三,pwm 汇春官网:汇春科技 (yspringtech.com) 汇春是麦肯的原厂,以下是两个论坛,其中都有关于麦肯单片机的学习论坛,可以参考学习,第一个叫英锐恩&…...
【Vue3笔记01】如何使用Vue3和Vite搭建前端项目的基础开发环境
这篇文章,主要介绍如何使用Vue3和Vite搭建前端项目的基础开发环境【知识星球】。 目录 一、搭建项目环境 1.1、前提条件 1.2、开始搭建 1.3、下载依赖...
软考高级架构师:信息安全概念和例题
一、AI 讲解 信息安全是保障信息资产免受各种威胁的一系列措施和活动的总称,其目的是保护信息的机密性、完整性、可用性、可控性和可审查性,确保信息系统的正常运行。信息安全的范围涵盖了设备安全、数据安全、内容安全和行为安全。网络安全漏洞和网络安…...
Lilishop商城(windows)本地部署【docker版】
Lilishop商城(windows)本地部署【docker版】 部署官方文档:LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…...
# 14 React 自定义Hook详解
自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他 Hook。自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他 Hook。下面是几个自定义 Hook 的例子以及需要注意的知识: 1. 使用状…...
HTML静态网页成品作业(HTML+CSS+JS)——中华美食八大菜系介绍(1个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现图片轮播切换,共有1个页面。 二、…...
PostgreSQL11 | Windows系统安装PostgreSQL
本教程选取与参考书籍《PostgreSql11 从入门到精通》(清华大学出版社)的11大版本最新小版本11.22的安装作为教程案例 下载 下载PostgreSQL installer 下载到本地 安装 运行安装引导器 中国地区语言选项(暂时) Chinese(Simplifie…...
uniapp保留两位小数,整数后面加.00
直接把方法粘贴进去就能用 <text class"bold">总收入¥{{formater(priceNumer)}}</text>export default {data() {priceNumer: 199.999, // 总收入},methods: {// 保留两位小数formater(data) {if(!data) return 0.00data parseFloat(data).…...
R: 网状Meta分析进行模型构建及图形绘制
网状meta分析的制作步骤主要包括: 1. 绘制网状证据图 2. 普通Meta分析(两两之间的直接比较) 3. 网状Meta分析(整合直接比较和间接比较的结果,绘制相关图形) 4. 绘制累积概率排序图 5. 三个假设的检验…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
