如何配置Azure APIM在运维时段返回带Retry-After头的503响应
Azure APIM 运维场景返回503+动态Retry-After实现方案
完全可以通过Azure APIM的自定义策略能力实现该需求,具体方案如下:
实现逻辑
通过在对应生效范围(全局/指定产品/指定API/指定操作)配置入站策略,判断当前是否处于预设的运维窗口期,符合条件则直接返回503响应,同时动态计算当前时间到运维结束的剩余秒数作为Retry-After响应头的值。
配置步骤
- 登录Azure APIM管理界面,进入「策略」配置页,选择你需要生效的范围
- 替换/补充入站策略为以下示例内容,只需修改
maintenanceEndTime变量的值为你实际的运维结束UTC时间即可
<policies> <inbound> <base /> <!-- 配置运维结束的UTC时间,执行运维前修改此值即可生效 --> <set-variable name="maintenanceEndTime" value="@(new DateTime(2024, 6, 30, 14, 30, 0, DateTimeKind.Utc))" /> <!-- 动态计算剩余等待秒数 --> <set-variable name="retryAfter" value="@(Math.Max(0, (int)((DateTime)context.Variables["maintenanceEndTime"] - DateTime.UtcNow).TotalSeconds))" /> <choose> <!-- 剩余等待秒数大于0则返回503 --> <when condition="@((int)context.Variables["retryAfter"] > 0)"> <return-response> <set-status code="503" reason="Service Under Maintenance" /> <set-header name="Retry-After" exists-action="override"> <value>@((int)context.Variables["retryAfter"])</value> </set-header> <set-body>服务正在进行运维维护,请稍后再试</set-body> </return-response> </when> </choose> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
附加说明
- 运维结束后直接删除或注释上述策略代码即可恢复正常流量转发,无需重启服务
- 如需仅对部分后端服务生效,可在
when节点的判断条件中补充请求路径、后端服务地址等匹配规则 - 示例中
Retry-After的值为实时计算的剩余秒数,每次请求都会返回最新的倒计时数值,符合需求
内容的提问来源于stack exchange,提问作者Jaime
相关产品推荐
相关产品推荐

