除 Feign 场景外,MSE 流量防护可以与应用内的开源 Sentinel 同时使用,原有开源 Sentinel 规则可以继续生效。从 Java 探针 5.1.0 起,HTTP 客户端限流的 URL 资源名默认按路径层级收敛,本文说明该行为的升级影响和配置调整方式。
MSE 流量防护与开源 Sentinel 的兼容性
开源兼容性说明
MSE 流量防护使用隔离后的 Sentinel 实现,可以和应用内的开源 Sentinel 同时使用。接入 MSE 后,原有的开源 Sentinel 规则可以继续执行,不需要删除或停用。开源 Sentinel 的资源指标也可以通过 MSE 控制台查看,并以 SENTINEL: 前缀展示。
如果没有继续维护两套规则的必要,建议统一使用 MSE 服务治理企业版。两种方案的能力和维护成本对比,请参见MSE 流量防护与开源自建限流组件对比。
Feign 场景特殊性说明
受 Feign 框架自身设计限制,如果应用使用 Spring Cloud Alibaba Sentinel 提供的 Feign 流控,接入 MSE 服务治理后,开源 Sentinel 的 Feign 流控将不再生效。受 Spring 自动配置机制影响,部分应用还可能启动失败。如遇此情况,请提交阿里云工单获取协助。
Feign 场景可以选择以下一种配置方式:
继续使用 MSE 流量防护(推荐):MSE Feign 流控默认启用,直接通过 MSE 控制台为 Feign 资源配置规则即可。
继续使用开源 Sentinel:关闭 MSE Feign 适配器,继续使用开源 Sentinel Feign 适配器。配置方法:
-Dfeign.mse.sentinel.enabled=false -Dfeign.sentinel.enabled=trueHTTP 客户端限流 URL 资源名路径层级收敛
MSE 流量防护从 Java 探针 4.5.0 起支持 Apache HttpClient 4.x、Apache HttpClient 5.x 和 OkHttp 的客户端限流。客户端发起 HTTP 调用时,请求 URL 会作为限流资源名。
例如,应用实际发起了以下两个请求:
http://hostname:port/v1/a/123
http://hostname:port/v1/a/456不同探针版本的默认行为如下:
Java 探针 4.5.0 及以上、5.1.0 以下版本不收敛 URL 路径,上述两个请求会以两个完整 URL 资源分别展示。
从 Java 探针 5.1.0 开始,限流资源名的 URL 路径默认保留两层,上述两个请求会收敛为 MSE 控制台上的同一个资源:
http://hostname:port/v1/a通过 MSE 控制台针对该资源配置限流规则后,规则会同时对上述两个请求生效。
路径层级从域名后的第一个非空路径段开始计算。查询参数和 URL 片段(Fragment)不计入资源名;路径不足指定层级时,保留原路径。
为什么需要收敛资源名
HTTP 请求 URL 经常包含用户 ID、订单 ID 等动态路径参数。如果直接使用完整 URL 作为限流资源名,每个动态参数值都会生成一个资源。动态参数较多时,控制台的资源数量会迅速增加,Sentinel 资源节点占用的内存也会随之上涨。
升级到 5.1.0 及以上版本的影响
5.1.0 会改变路径超过两层的 URL 资源名。原规则如果配置了完整路径,升级后将匹配不到新的资源名。例如:
升级前:http://hostname:port/v1/a/123
升级后:http://hostname:port/v1/a探针升级不会自动修改已有规则。升级前请先核对 HTTP 客户端规则中的资源名。
确认现有规则后,按实际情况选择下面一种配置。配置修改后需要重启应用;升级完成后,再发起真实请求检查资源名和规则是否符合预期。请使用当前正式版本的探针,版本信息请参见Java探针版本。
方案一:全局调整收敛层级
使用以下 JVM 参数设置所有 HTTP 客户端资源保留的路径层级:
-Dmse.sentinel.http.client.resource.path.level=N默认值为
2。设置为大于
0的整数时,保留前 N 层路径。设置为
-1时不收敛路径,继续使用完整 URL。
例如,保留前三层路径:
-Dmse.sentinel.http.client.resource.path.level=3-1 适合升级时临时兼容旧规则,不建议长期使用,否则动态路径仍会造成资源发散。旧规则调整完成后,应恢复路径收敛。
方案二:按 URL 前缀差异化配置
不同接口需要不同的收敛层级时,可以按 URL 前缀单独配置:
-Dmse.sentinel.http.client.resource.path.level.rules=http://host1/api/users=2,http://host2/api/orders=-1URL 前缀可以包含协议、域名、端口和路径。
同一个 URL 命中多个前缀时,使用最长前缀对应的配置。
前缀对应的层级设置为
-1时,该前缀下的 URL 不收敛。未命中任何前缀时,使用
mse.sentinel.http.client.resource.path.level的全局配置;未配置全局参数时使用默认值2。
例如,可以只收敛动态路径发散严重的接口,其他接口继续保留更深路径或完整 URL。
方案三:使用开源 Sentinel 自定义资源名
固定层级不能满足资源命名要求时,可以通过开源 Sentinel 1.8.10 的 HTTP 客户端适配器自定义资源名:
Apache HttpClient 4.x 使用
SentinelApacheHttpClientBuilder。Apache HttpClient 5.x 使用
SentinelApacheHttpClient5Handler。OkHttp 使用
SentinelOkHttpInterceptor。
通过对应配置对象设置资源提取器(extractor),返回一个不随动态参数变化的资源名。Java 探针 5.1.0 及以上版本会保留已有的开源适配器,并优先使用自定义 extractor 返回的资源名。
这种方式需要修改业务代码,并自行管理开源 Sentinel 依赖。只有在必须按租户、业务动作或自定义模板生成资源名时才建议使用。
如何选择方案
场景 | 建议方案 |
所有接口使用相近的路径结构 | 设置全局收敛层级 |
只有部分接口存在动态路径发散 | 按 URL 前缀差异化配置 |
需要先保证升级后已有规则继续生效 | 临时设置全局层级为 |
固定路径层级无法表达业务资源语义 | 使用开源 Sentinel 自定义 extractor |