当前位置: 首页 > article >正文

iisARR负均衡

IIS + ARR负载均衡详细配置指南

🎯 什么是ARR(Application Request Routing)

ARR是IIS的一个扩展模块,它可以:

  • 负载均衡:将请求分发到多个服务器
  • 反向代理:隐藏后端服务器架构
  • 健康检查:自动检测服务器状态
  • 故障转移:自动切换到健康的服务器

🏗️ 架构原理图

客户端请求流程:
[用户浏览器] → [IIS主站点 + ARR] → [后端API实例们]详细流程:
用户请求: http://api.company.com/api/users↓
[IIS主站点:80端口]
[ARR模块负载均衡]↓ (轮询分发)┌─────────┼─────────┐↓         ↓         ↓
[API实例1]  [API实例2]  [API实例3]
[端口5001]  [端口5002]  [端口5003]

工作原理

  1. 接收请求:用户访问主站点(80端口)
  2. ARR处理:ARR模块根据负载均衡算法选择后端服务器
  3. 转发请求:将请求转发到选中的后端API实例
  4. 返回响应:后端处理完成后,通过ARR返回给用户
  5. 用户无感知:用户完全不知道后端有多个实例

📋 手动配置步骤

第一步:安装ARR模块

1.1 下载ARR
  • 访问 IIS官网
  • 下载 Application Request Routing 3.0
  • 或使用Web Platform Installer搜索"ARR"
1.2 安装ARR
双击安装包 → 按默认选项安装 → 重启IIS管理器
1.3 验证安装

打开IIS管理器,应该能看到:

  • 服务器级别:Application Request Routing Cache
  • 服务器级别:Server Farms(服务器场)

第二步:创建后端API实例

2.1 创建应用程序池
IIS管理器 → 应用程序池 → 右键"添加应用程序池"创建三个应用程序池:
- 名称:API-Instance-1,.NET CLR版本:无托管代码
- 名称:API-Instance-2,.NET CLR版本:无托管代码
- 名称:API-Instance-3,.NET CLR版本:无托管代码
2.2 创建网站
IIS管理器 → 网站 → 右键"添加网站"创建三个网站:
网站1:
- 网站名称:API-Instance-1
- 应用程序池:API-Instance-1
- 物理路径:C:\inetpub\wwwroot\api1
- 端口:5001网站2:
- 网站名称:API-Instance-2
- 应用程序池:API-Instance-2
- 物理路径:C:\inetpub\wwwroot\api2
- 端口:5002网站3:
- 网站名称:API-Instance-3
- 应用程序池:API-Instance-3
- 物理路径:C:\inetpub\wwwroot\api3
- 端口:5003
2.3 复制API文件到各实例
将编译好的API文件复制到:
- C:\inetpub\wwwroot\api1\
- C:\inetpub\wwwroot\api2\
- C:\inetpub\wwwroot\api3\确保每个目录都包含完整的API文件
2.4 测试各实例
测试访问:
- http://localhost:5001/api/health
- http://localhost:5002/api/health
- http://localhost:5003/api/health确保每个实例都能正常响应

第三步:配置服务器场(Server Farm)

3.1 创建服务器场
IIS管理器 → 选择服务器节点 → 双击"Server Farms"
→ 右键空白区域 → "Create Server Farm"服务器场设置:
- Server farm name: API-Farm
- 点击"Next"
3.2 添加服务器
在"Add Server"对话框中逐一添加:服务器1:
- Server address: 127.0.0.1
- HTTP port: 5001
- Weight: 100 (权重,相等表示平均分配)服务器2:
- Server address: 127.0.0.1
- HTTP port: 5002
- Weight: 100服务器3:
- Server address: 127.0.0.1
- HTTP port: 5003
- Weight: 100点击"Finish"完成
3.3 配置负载均衡算法
IIS管理器 → Server Farms → API-Farm → 双击"Load Balance"负载均衡算法选择:
○ Weighted round robin (加权轮询) - 推荐
○ Weighted total traffic (加权总流量)
○ Least current request (最少当前请求)
○ Least response time (最少响应时间)选择"Weighted round robin",点击"Apply"
3.4 配置健康检查
IIS管理器 → Server Farms → API-Farm → 双击"Health Test"健康检查设置:
- URL test: /api/health
- Interval (seconds): 30
- Timeout (seconds): 10
- Acceptable status code: 200
- Match expected response body: 可选填入"healthy"点击"Apply"
3.5 配置监控和日志
IIS管理器 → Server Farms → API-Farm → 双击"Monitoring and Management"设置:
- Enable logging: ✓ 勾选
- Log file directory: C:\inetpub\logs\LogFiles\ARR
- Enable data collection: ✓ 勾选点击"Apply"

第四步:配置URL重写规则

4.1 创建负载均衡主站点
IIS管理器 → 网站 → 右键"添加网站"主站点设置:
- 网站名称:API-LoadBalancer
- 应用程序池:DefaultAppPool
- 物理路径:C:\inetpub\wwwroot\api-lb
- 端口:80 (或其他主要端口)
4.2 在主站点创建web.config
在 C:\inetpub\wwwroot\api-lb\ 目录下创建 web.config 文件:<?xml version="1.0" encoding="utf-8"?>
<configuration><system.webServer><rewrite><rules><!-- API请求负载均衡规则 --><rule name="API Load Balance" stopProcessing="true"><match url="^api/(.*)" /><action type="Rewrite" url="http://api-farm/api/{R:1}" /></rule><!-- 健康检查规则 --><rule name="Health Check" stopProcessing="true"><match url="^health$" /><action type="Rewrite" url="http://api-farm/api/health" /></rule><!-- 默认规则 - 可选 --><rule name="Default" stopProcessing="false"><match url="(.*)" /><action type="Rewrite" url="http://api-farm/{R:1}" /></rule></rules></rewrite><!-- ARR设置 --><proxy enabled="true" /></system.webServer>
</configuration>
4.3 启用代理功能
IIS管理器 → 选择服务器节点 → 双击"Application Request Routing Cache"
→ 点击右侧"Server Proxy Settings"
→ 勾选 "Enable proxy" 
→ 点击"Apply"

第五步:测试负载均衡

5.1 基础功能测试
访问主站点:
http://localhost/api/health应该能够正常返回健康检查结果
每次刷新可能会命中不同的后端实例
5.2 负载分发测试

在每个API实例中添加标识代码:

// 在API的健康检查端点中添加实例标识
[HttpGet("health")]
public IActionResult Health()
{var instanceName = Environment.GetEnvironmentVariable("INSTANCE_NAME") ?? "unknown";var response = new{status = "healthy",instance = instanceName,timestamp = DateTime.UtcNow,server = Environment.MachineName};return Ok(response);
}
5.3 故障转移测试
1. 停止其中一个API实例的应用程序池
2. 访问 http://localhost/api/health
3. 确认请求被自动转发到其他健康实例
4. 重启停止的实例,确认重新加入负载均衡

🔧 零停机部署手动操作

场景:更新API代码

步骤1:准备新版本
1. 编译新版本API到临时目录
2. 确保新版本在开发环境测试通过
步骤2:逐一更新实例
更新实例1:
1. IIS管理器 → Server Farms → API-Farm → Servers
2. 右键 127.0.0.1:5001 → "Take Offline"
3. 等待30秒,让ARR停止向该实例发送请求
4. 停止应用程序池 "API-Instance-1"
5. 备份 C:\inetpub\wwwroot\api1 到 api1-backup-时间戳
6. 复制新版本文件到 C:\inetpub\wwwroot\api1
7. 启动应用程序池 "API-Instance-1"
8. 访问 http://localhost:5001/api/health 确认正常
9. 右键 127.0.0.1:5001 → "Bring Online"
10. 等待2分钟观察重复以上步骤更新实例2和实例3
步骤3:验证更新
1. 访问主站点确认新功能正常
2. 检查ARR日志确认负载分发正常
3. 监控一段时间确保稳定

📊 监控和管理

查看服务器场状态

IIS管理器 → Server Farms → API-Farm → Servers状态含义:
- Available: 服务器健康,正在接收请求
- Unavailable: 服务器不健康,ARR不会向其发送请求
- Offline: 手动设置为离线状态
- Draining: 正在排空现有连接,不接收新请求

查看实时统计

IIS管理器 → Server Farms → API-Farm → 双击"Monitoring and Management"可以看到:
- 当前活跃连接数
- 总请求数
- 失败请求数
- 平均响应时间
- 每个服务器的负载情况

查看日志

ARR日志位置:
C:\inetpub\logs\LogFiles\ARR\日志内容包含:
- 请求时间
- 客户端IP
- 转发到的后端服务器
- 响应状态码
- 响应时间

⚠️ 常见问题和解决方案

问题1:404错误

现象:访问主站点返回404解决方案:
1. 检查web.config中的重写规则是否正确
2. 确认Server Farm名称与重写规则中的名称一致
3. 检查是否启用了代理功能

问题2:502 Bad Gateway

现象:访问返回502错误解决方案:
1. 检查后端API实例是否正常运行
2. 查看ARR日志确认转发地址是否正确
3. 检查防火墙是否阻止了内部端口访问

问题3:负载不均衡

现象:请求总是转发到同一个实例解决方案:
1. 检查负载均衡算法设置
2. 确认各服务器权重设置是否相等
3. 检查是否启用了会话保持(Session Affinity)

问题4:健康检查失败

现象:实例显示为Unavailable解决方案:
1. 手动访问健康检查URL确认API正常
2. 检查健康检查配置的URL路径是否正确
3. 确认预期的响应内容设置

🎯 实际部署建议

生产环境配置

1. 使用独立的负载均衡服务器
2. 配置SSL证书和HTTPS重定向
3. 设置合适的超时时间
4. 启用请求日志和监控
5. 配置故障通知机制

性能优化

1. 调整应用程序池的并发连接数
2. 配置ARR的缓存策略
3. 优化健康检查频率
4. 设置合理的权重分配

安全配置

1. 限制内部端口的外部访问
2. 配置IP白名单
3. 启用请求过滤
4. 设置速率限制

通过以上详细步骤,您就可以手动配置一个完整的IIS + ARR负载均衡系统,实现API的零停机部署!

相关文章:

iisARR负均衡

IIS ARR负载均衡详细配置指南 &#x1f3af; 什么是ARR&#xff08;Application Request Routing&#xff09; ARR是IIS的一个扩展模块&#xff0c;它可以&#xff1a; 负载均衡&#xff1a;将请求分发到多个服务器反向代理&#xff1a;隐藏后端服务器架构健康检查&#xf…...

uniapp打包报错:重新在manifest.json中生成自己的APPID

在UniApp开发过程中&#xff0c;打包时可能会遇到报错提示需要在manifest.json中重新生成自己的APPID。以下是解决该问题的具体方法&#xff1a; 检查并生成APPID 打开项目根目录下的manifest.json文件&#xff0c;找到appid字段。如果该字段为空或为默认值&#xff0c;需要重…...

人脸识别备案开启安全防护模式!紧跟《办法》!

国家互联网信息办公室与公安部于 2025 年 3 月 13 日联合公布了《人脸识别技术应用安全管理办法》&#xff08;以下简称《办法》&#xff09;&#xff0c;并自 2025 年 6 月 1 日起正式施行。其中&#xff0c;人脸识别备案成为了规范技术应用、守护信息安全的关键一环。​ 一、…...

【爬虫】DrissionPage-7

官方文档&#xff1a; https://www.drissionpage.cn/browser_control/get_page_info/ 1. 页面信息 &#x1f4cc; html 描述&#xff1a;返回当前页面的 HTML 文本。注意&#xff1a;不包含 <iframe> 元素的内容。返回类型&#xff1a;str 示例&#xff1a; html_co…...

新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式

5月14日&#xff0c;新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相&#xff0c;并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径&#xff0c;及在成都市“茶业建圈强链”主题推介会上&#xff0c;珈和科技与蒲江县人民政府就智…...

git 撤销最近的几次push

要实现将远程仓库回退到最近5次push之前的状态&#xff0c;同时保留本地改动&#xff0c;可以按照以下步骤操作&#xff1a; 一、本地分支回退&#xff08;保留改动&#xff09; # 1. 查看提交历史确认要回退的提交点 git log --oneline# 2. 回退到5次提交前的状态&#xff0…...

水滴前端面经及参考答案

盒模型是什么,标准盒模型和 IE 盒模型有什么区别? 盒模型是 CSS 中一个基础概念,它描述了元素在页面中所占的空间大小。每个元素都可以看作是一个矩形盒子,从内到外由内容区(content)、内边距(padding)、边框(border)和外边距(margin)组成。 标准盒模型的宽度和高…...

React 第四十五节 Router 中 useHref() Hook的使用详解及注意事项

前言 React Router 中的 useHref 是一个用于生成完整 URL 路径的钩子&#xff0c; 它可以将相对路径解析为绝对路径&#xff0c;并确保在不同路由层级中正确工作。 它常用于自定义导航组件或需要手动构建链接的场景。 一、useHref核心用途 解析相对路径&#xff1a;自动将相…...

50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?

在 JavaScript 中&#xff0c;var { ipcRenderer } require(‘electron’); 这行代码的含义是&#xff1a; 1. require(‘electron’) 这是 Node.js 的模块引入语法&#xff0c;用于加载 Electron 的核心模块。electron 是 Electron 框架的主模块&#xff0c;提供了构建桌面…...

LeetCode 438. 找到字符串中所有字母异位词 | 滑动窗口与字符计数数组解法

文章目录 问题描述核心思路&#xff1a;滑动窗口 字符计数数组1. 字符计数数组2. 滑动窗口 算法步骤完整代码实现复杂度分析关键点总结类似问题 问题描述 给定两个字符串 s 和 p&#xff0c;要求找到 s 中所有是 p 的**字母异位词&#xff08;Anagram&#xff09;**的子串的起…...

@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse

在Java Web开发中&#xff0c;RequestParam、RequestBody、HttpServletRequest 和 HttpServletResponse 是常用的组件&#xff0c;它们用于处理HTTP请求和响应。下面分别介绍它们的使用场景和使用方法&#xff1a; 1. RequestParam RequestParam 是Spring MVC框架中的注解&am…...

计算机底层的多级缓存以及缓存带来的数据覆盖问题

没有多级缓存的情况 有多级缓存的情况 缓存带来的操作覆盖问题 锁总线带来的消耗太大了。...

SpringBoot-1-入门概念介绍和第一个Spring Boot项目

文章目录 1 开发JAVA EE应用1.1 EJB1.2 Spring框架1.2.1 IoC(Inversion of Control)控制反转1.2.2 DI(Dependency Injection)依赖注入1.2.3 AOP面向切面编程1.3 Spring Boot1.4 Spring Cloud框架1.5 开发工具2 创建Spring Boot项目2.1 在线项目生成向导2.2 使用IDEA导入项目2.3…...

服务器多用户共享Conda环境操作指南——Ubuntu24.02

1. 使用阿里云镜像下载 Anaconda 最新版本 wget https://mirrors.aliyun.com/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bug解决方案 若出现&#xff1a;使用wget在清华镜像站下载Anaconda报错ERROR 403: Forbidden. 解决方案&#xff1a;wget --user-agent“M…...

基于FPGA的电子万年历系统开发,包含各模块testbench

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于FPGA的电子万年历系统开发,包含各模块testbench。主要包含以下核心模块&#xff1a; 时钟控制模块&#xff1a;提供系统基准时钟和计时功能。 日历计算模块&#xff1a…...

Leetcode刷题 | Day63_图论08_拓扑排序

一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依…...

MySQL 可观测性最佳实践

MySQL 简介 MySQL 是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高性能、可靠性和易用性而闻名&#xff0c;适用于各种规模的应用&#xff0c;从小型网站到大型企业级系统。 监控 MySQL 指标是维护数据库健康、优化性能和确保数据…...

系统性能分析基本概念(3) : Tuning Efforts

系统性能调优&#xff08;Tuning Efforts&#xff09;是指通过优化硬件、软件或系统配置来提升性能&#xff0c;减少延迟、提高吞吐量或优化资源利用率。以下是系统性能调优的主要努力方向&#xff0c;涵盖硬件、操作系统、应用程序和网络等多个层面&#xff0c;结合实际应用场…...

OceanBase数据库全面指南(函数篇)函数速查表

文章目录 一、数学函数1.1 基本数学函数1.2 三角函数二、字符串函数2.1 基本字符串函数2.2 高级字符串处理函数三、日期时间函数3.1 基本日期时间函数3.2 日期时间计算函数四、聚合函数4.1 常用聚合函数4.2 分组聚合4.3 高级聚合函数五、条件判断函数5.1 基本条件函数5.2 CASE表…...

SpringBoot 对象转换 MapStruct

文章目录 工作原理核心优势为什么不使用 BeanUtils使用步骤添加依赖定义实体类和VO类定义映射接口测试数据 参考 工作原理 基于 Java 的 JSR 269 规范&#xff0c;该规范允许在编译期处理注解&#xff0c;也就是 Java 注解处理器。MapStruct 通过定义的注解处理器&#xff0c;…...

计算机网络——Session、Cookie 和 Token

在 Web 开发中&#xff0c;Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系&#xff0c;也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。 一、基本定义与原理 1. Cookie 定义&#xff1a; 是浏览器存储在客户端的小…...

01-jenkins学习之旅-window-下载-安装-安装后设置向导

1 jenkins简介 百度百科介绍&#xff1a;Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 [1] Jenkins官网地址 翻译&…...

Spark,SparkSQL操作Mysql, 创建数据库和表

以下是使用 Spark SQL 在 MySQL 中创建数据库和表的步骤&#xff08;基于 Scala API&#xff09;&#xff1a; 1. 准备工作 - 添加 MySQL 驱动依赖 同前所述&#xff0c;需在 Spark 环境中引入 MySQL Connector JAR 包&#xff08;如 mysql-connector-java-8.0.33.jar &#…...

AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘错误解决方法

源代码如下&#xff1a; # 读取图像 import cv2 im cv2.imread("./test.png", 1) # 1表示3通道彩色&#xff0c;0表示单通道灰度 cv2.imshow("test", im) # 在test窗口中显示图像 print(type(im)) # 打印数据类型 print(im.shape) # 打印图像尺寸 cv2.wai…...

HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析

在鸿蒙系统的开发中&#xff0c;状态管理和组件之间的通信是至关重要的部分。为此&#xff0c;鸿蒙提供了多种装饰器来帮助开发者监听和处理数据变化。今天我们将深入探讨Watch装饰器&#xff0c;并与新的状态管理组件V2中的Monitor装饰器进行对比。 Watch装饰器详解 基本概念…...

机器人拖动示教控制

机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷

近日&#xff0c;苏州自动驾驶巴士线路——阳澄数谷示范线正式上线&#xff0c;即日起向全民免费开放试乘体验&#xff01; 在苏州工业园区地铁3号线倪浜•阳澄数谷站外&#xff0c;一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是&#xff0c;小巴造型奇…...

matlab加权核范数最小化图像去噪

加权核范数最小化&#xff08;Weighted Nuclear Norm Minimization, WNNM&#xff09;是一种有效的图像去噪方法&#xff0c;它通过最小化加权核范数来促进图像的低秩近似&#xff0c;同时保留图像的边缘和细节信息。这种方法在去除噪声的同时&#xff0c;能够较好地保留图像的…...

docker容器暴露端口的作用

Docker 镜像中**暴露的端口&#xff08;通过 EXPOSE 指令声明&#xff09;**主要有以下作用和意义&#xff1a; 1. 文档化作用&#xff08;Documentation&#xff09; 显式声明容器内部服务监听的端口&#xff0c;告知用户或开发者该镜像提供的服务需要通过哪些端口通信。例如…...

每日Prompt:像素风格插画

提示词 像素风格插画&#xff0c;日式漫画脸&#xff0c;画面主体为一位站在路边的男孩&#xff0c;人物穿着黑色冲锋衣&#xff0c;手里拿着手机&#xff0c;男孩靠坐在机车旁边&#xff0c;脚边依偎着一只带着小摩托车头盔的小小猫&#xff0c;背景是雨中&#xff0c;身旁停…...