Sentinel Envoy RLS Token Server 实战:基于 gRPC 为 Envoy 提供全局限流服务
后端微服务【免费下载链接】SentinelA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)项目地址https://gitcode.com/gh_mirrors/sentine/Sentinel点击查看免费下载本篇指南以仓库中 sentinel-cluster-server-envoy-rls 模块为主线讲解如何用 Sentinel 集群 Token Server 实现 Envoy 全局限流Global Rate Limiting的 gRPC 服务端覆盖构建打包、YAML 规则配置、动态热加载、运行参数调优以及 Kubernetes 环境下与 Envoy 的完整联调方案。读完本文你将掌握 RLS v2/v3 API 的服务端实现原理并能独立部署一套Envoy 网关 Sentinel 限流服务的云原生限流体系。模块定位与工作原理Envoy 自身提供两种限流能力本地限流local rate limiting与全局限流global rate limiting。全局限流需要调用外部限流服务Envoy 通过 gRPC 将限流请求携带 domain 与 rate limit descriptors发送给限流服务器由服务器统一决策后返回OK或OVER_LIMIT。Sentinel 的sentinel-cluster-server-envoy-rls模块正是这一 gRPC 限流服务端的 Sentinel 实现——它把 Envoy 传来的限流描述符转换为 Sentinel 的集群流控规则再交给 Sentinel 集群 Token Server 的令牌判定链路完成计数与限流。该模块的入口类为 SentinelEnvoyRlsServer.java其启动流程清晰可见将project.name设为sentinel-rls-token-server使 Sentinel 日志与监控归属于该应用初始化EnvoyRlsRuleDataSourceService加载并监听规则文件解析 gRPC 监听端口默认 10245启动 SentinelRlsGrpcServer.java注册 JVM 关闭钩子在进程退出时依次关闭 gRPC 服务与数据源调用InitExecutor.doInit()完成 Sentinel 内部组件的初始化随后阻塞直至服务关闭。gRPC 服务端同时注册了两个限流服务实现v3 版本的 SentinelEnvoyRlsServiceImpl.java 与 v2 版本的SentinelEnvoyRlsServiceImpl位于service包下。这意味着单个进程可同时兼容 Envoy RLS v2 与 v3 两种 API。需要注意的是Envoy 自 1.18.0 起已移除 v2 API 支持因此新部署的环境应优先使用 v3 API。说明RLS 服务所需的 gRPC stub 类并非仓库中手工维护而是由protobuf-maven-plugin在 Maven 的compile阶段根据 src/main/proto 目录下的 proto 定义自动生成生成产物位于构建目录target/generated-sources/protobuf。proto 文件覆盖envoy.service.ratelimit.v2/v3、envoy.extensions.common.ratelimit.v3等 Envoy 官方限流协议定义还有udpa/annotations与validate等依赖项。构建可执行 JAR在sentinel-cluster-server-envoy-rls模块目录下执行以下命令构建可执行 JAR构建产物为目标jar包含全部运行依赖mvn clean package -P prod激活prodprofile 会一并打包出可运行的 fat jar。构建完成后即可通过java -jar启动限流服务启动前必须配置规则文件路径见下文配置项一节。规则配置domain 与 descriptors 模型Sentinel RLS Token Server 支持通过 YAML 文件动态配置规则。要理解规则文件的结构先要理解 Envoy 侧的限流请求模型domain域限流请求的命名空间对应 Envoy 配置中envoy.filters.http.ratelimit过滤器的domain字段。规则文件中的domain必须与 Envoy 配置一致才生效rate limit descriptor限流描述符一次限流请求可能携带多个描述符每个描述符由 Envoy 的路由rate_limitsactions 生成entry条目描述符内部的键值对如destination_cluster: service_httpbin。Sentinel 为同一个 domain 下每个限流描述符分别设置独立阈值。规则文件的结构模型对应源码中的 EnvoyRlsRule.java顶层包含domain与descriptors列表每个 descriptor 包含resources键值对集合对应 Envoy 描述符条目与count阈值。规则文件示例domain: foo descriptors: - resources: - key: destination_cluster value: service_httpbin count: 1以上规则仅对 domainfoo生效含义是所有发往service_httpbin集群的请求最大 QPS 被限制为 1。规则的加载与转换规则文件通过 EnvoyRlsRuleDataSourceService.java 加载。该数据源基于 Sentinel 的FileRefreshableDataSource实现用 SnakeYAML 将文件内容反序列化为EnvoyRlsRule对象Representer配置了setSkipMissingProperties(true)缺失字段不会导致解析失败数据源持有SentinelProperty规则文件内容一旦变化会推送新规则到EnvoyRlsRuleManager实现无重启热更新启动时若未配置规则文件路径会抛出IllegalStateException并提示设置SENTINEL_RLS_RULE_FILE_PATH环境变量。收到新规则后EnvoyRlsRuleManager.java 内部监听器会做以下处理校验规则合法性isValidRuledomain 非空、descriptors 非空、每个 descriptor 的count非空且不小于 0、resources非空且每个条目的 key/value 均非空同一 domain 重复出现时仅保留第一条并打印警告日志通过 EnvoySentinelRuleConverter.java 将每条规则转换为 Sentinel 集群FlowRule使用|分隔符拼接domain|key|value...作为资源标识并生成对应的集群流控 IDInteger.MAX_VALUE key.hashCode()偏移避免负数最终调用ClusterFlowRuleManager.loadRules(ServerConstants.DEFAULT_NAMESPACE, flowRules)加载到默认命名空间的集群流控规则库。规则的校验方法规则的合法性校验逻辑完整体现在EnvoyRlsRuleManager.isValidRule()中其约束可作为配置时的自查清单校验维度约束条件domain非空字符串descriptors非空列表descriptor.count非空且 ≥ 0descriptor.resources非空集合resource.key / value均非空字符串规则生效后的验证方式规则加载是否成功有两种验证途径查看日志Sentinel 运行日志位于~/logs/csp/sentinel-record.log.xxx规则加载时会输出[EnvoyRlsRuleManager] Envoy RLS rules loaded: [...]记录含转换后的 FlowRule 明细查询命令接口访问localhost:8719/cluster/server/flowRules可查看转换后已生效的集群流控规则列表。8719 为 Sentinel 命令端口与 K8s 示例中暴露的 command port 一致。请求判定链路v3 服务端实现当 Envoy 调用 gRPC 限流服务时v3 实现SentinelEnvoyRlsServiceImpl.shouldRateLimit()的执行流程如下解析request.getHitsAddend()作为本次扣减的令牌数小于 0 时报错拒绝等于 0未设置时按 1 处理取出请求中的 domain遍历每个RateLimitDescriptor将描述符条目用|拼接生成 key调用EnvoySentinelRuleConverter.generateFlowId()计算规则 ID从ClusterFlowRuleManager中查找对应FlowRule若规则不存在视为NO_RULE_EXISTS请求直接放行OK若规则存在则通过SimpleClusterFlowChecker.acquireClusterToken()执行集群令牌判定返回OK或OVER_LIMIT每个描述符生成一个DescriptorStatus含Code、currentLimit与limitRemaining任一描述符被限流则整体overallCode置为OVER_LIMIT若开启了访问日志会记录 domain、描述符原文、判定状态与剩余额度。配置项一览模块的配置项通过环境变量或 JVM 系统属性注入。所有常量定义在 SentinelEnvoyRlsConstants.java 中。配置解析遵循系统环境变量优先于 JVM 属性的顺序见SentinelEnvoyRlsServer.resolvePort()与EnvoyRlsRuleDataSourceService.getRuleConfigPath()的实现。配置项环境变量配置项JVM 属性说明默认值是否必填SENTINEL_RLS_GRPC_PORTcsp.sentinel.grpc.server.portRLS gRPC 服务监听端口10245否SENTINEL_RLS_RULE_FILE_PATHcsp.sentinel.rls.rule.fileRLS 规则 YAML 文件路径无是SENTINEL_RLS_ACCESS_LOG无是否开启访问日志设为on开启输出到控制台off否端口默认值说明模块 README 的配置表中写的是 10240但源码常量SentinelEnvoyRlsConstants.DEFAULT_GRPC_PORT的取值为10245且 K8s 示例sentinel-rls.yml、envoy-v3-api.yml中 Envoy 与 RLS 服务交互的端口均为 10245。实际部署时请以 10245 为准或通过环境变量显式覆盖端口。端口解析还带有健壮性保护环境变量或属性中的端口若为空、非法或超出 165535 范围会打印警告并回退到默认端口 10245。Kubernetes 环境部署实战模块在 sample/k8s 目录下提供了完整的 K8s 部署样例包含三个 YAML 模板。第一步准备镜像可以直接使用官方预构建镜像registry.cn-hangzhou.aliyuncs.com/sentinel-docker-repo/sentinel-envoy-rls-server:latest也可以在sentinel-cluster-server-envoy-rls目录下基于仓库自带 Dockerfile 自行构建docker build -t sentinel/sentinel-envoy-rls-server:latest -f ./Dockerfile .第二步部署 Sentinel RLS Token Serversentinel-rls.yml 模板包含三个资源对象ConfigMapsentinel-rule-cm承载限流规则 YAMLkey 为rule-yaml通过 volume 挂载进 Deployment规则更新即时生效Deploymentsentinel-rls-server运行 RLS 服务容器暴露 10245gRPC与 8719命令端口通过环境变量SENTINEL_RLS_RULE_FILE_PATH/tmp/sentinel/rule.yaml指定挂载后的规则文件路径Servicesentinel-rls-serviceClusterIP 类型同时导出 8719 与 10245 端口供集群内 Envoy pod 访问。样例中的限流规则即为上文仅对 domain foo 的 service_httpbin 集群限流 QPS1的配置。若需开启访问日志在 Deployment 的 env 中加入env: - name: SENTINEL_RLS_ACCESS_LOG value: on此外可通过JAVA_OPTS环境变量追加 JVM 启动参数如-Dcsp.sentinel.rls.rule.file...。执行部署kubectl apply -f sample/k8s/sentinel-rls.yml第三步部署 Envoyenvoy-v3-api.yml 提供了完整的 Envoy 部署模板Envoy v1.20.1 镜像配置了两个 Envoy clusterservice_httpbin指向 httpbin.org 的 HTTP 代理与rate_limit_cluster指向sentinel-rls-service:10245即 Sentinel RLS 服务启用http2_protocol_options以支持 gRPCrate limit filter在 HTTP filter chain 中加入envoy.filters.http.ratelimitdomain: foo与规则文件匹配request_type: external表示仅对外部请求做限流failure_mode_deny: false表示限流服务不可用时放行transport_api_version: V3指定使用 v3 API路由限流动作在route_config中配置rate_limitsaction{destination_cluster: {}}该动作会生成包含实际目标集群名如service_httpbin的限流描述符Sentinel 据此按目标集群分别限流。若已有运行中的 Envoy 实例只需将限流集群地址指向sentinel-rls-service、端口 10245 即可。执行部署kubectl apply -f sample/k8s/envoy-v3-api.yml仓库还同时提供了 v2 API 版本的样例 envoy-legacy-v2-api.yml供仍在使用旧版 Envoy 1.18.0的场景参考。第四步验证限流效果部署完成后在 K8s pod 内访问envoy-service:10000/json。由于规则将 QPS 上限设为 1并发请求时只有第一个请求通过后续请求被限流并返回 HTTP 429返回 200放行返回 429触发限流。第五步动态更新规则直接修改 ConfigMapsentinel-rule-cm中的rule-yaml内容并应用。由于 ConfigMap 以 volume 方式挂载Sentinel 通过FileRefreshableDataSource感知到文件内容变化后会自动将新规则加载到EnvoyRlsRuleManager并同步到集群流控规则库全程无需重启任何服务。测试用例与内部细节仓库内置了针对核心链路的单元测试可作为理解行为细节的参考EnvoySentinelRuleConverterTest.java验证 Envoy RLS 规则到 Sentinel FlowRule 的转换逻辑包括规则 ID 生成与资源标识拼接SentinelEnvoyRlsServiceImplTest.java 与 service/v3 下的同名测试验证 v2/v3 服务实现的请求判定行为例如描述符无对应规则时放行、超限时返回OVER_LIMIT、hitsAddend缺失时按 1 处理等。两个值得注意的设计细节无规则即放行若请求描述符在规则库中找不到对应 FlowRule服务端直接返回OK避免因规则缺失导致业务流量被误杀access log 支持RlsAccessLogger.java 在开启SENTINEL_RLS_ACCESS_LOGon时记录每条限流请求的 domain、描述符、判定状态与剩余额度便于线上排查限流命中情况。小结sentinel-cluster-server-envoy-rls将 Sentinel 的集群流控能力封装为标准的 Envoy 全局限流 gRPC 服务通过一份 YAML 规则文件domain descriptors count即可对 Envoy 路由维度如目标集群、请求头等的流量做细粒度限流规则热更新、v2/v3 双 API 兼容、K8s 原生部署支持使其能平滑融入云原生服务网格的限流体系。部署时只需记住三个关键点规则文件路径必填、gRPC 默认端口 10245、Envoy 侧 domain 必须与规则文件中的 domain 保持一致。赞分享后端微服务【免费下载链接】SentinelA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)项目地址https://gitcode.com/gh_mirrors/sentine/Sentinel点击查看免费下载相关推荐Envoy 全局限流实战RLS 与 RLQS 两类 Rate Limit 服务的配置与实现解析Envoy 全局限流实战RLS 与 RLQS 两类 Rate Limit 服务的配置与实现解析 本文基于 Envoy 官方文档 rate_limit.rst云原生服务网格网络微服务Envoy 本地限流全解基于 Token Bucket 的 L4 连接与 HTTP 请求限流机制Envoy 本地限流全解基于 Token Bucket 的 L4 连接与 HTTP 请求限流机制 Envoy 在本地非分布式限流方面提供了三层实现面向云原生服务网格网络微服务Cilium gRPC Ingress 实战基于 Envoy L7 代理的 gRPC 流量路由配置与验证Cilium gRPC Ingress 实战基于 Envoy L7 代理的 gRPC 流量路由配置与验证 本篇指南围绕 Cilium 官方的 gRPC Ing云原生网络服务网格可观测性网络安全eBPF上一篇终极磁盘健康监控指南如何用smartmontools保护你的数据安全下一篇革命性MEV框架Artemis用Rust构建高性能套利机器人的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

SkyWalking Pulsar 监控实战:从 OpenTelemetry Collector 到 MAL 指标规则的全链路解析

SkyWalking Pulsar 监控实战:从 OpenTelemetry Collector 到 MAL 指标规则的全链路解析

SkyWalking Pulsar 监控实战:从 OpenTelemetry Collector 到 MAL 指标规则的全链路解析 【免费下载链接】skywalking APM, Application Performance Monitoring System 项目地址: https://gitcode.com/gh_mirrors/sk/skywalking 本篇基于 SkyWalking 仓库中 …

2026/9/20 17:50:58 阅读更多 →
彻底清理Windows“打开方式”残留:注册表删除无效程序关联

彻底清理Windows“打开方式”残留:注册表删除无效程序关联

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

2026/9/20 17:50:58 阅读更多 →
丰田CAN总线数据加工:OBD口监听、位域解析与反向控制

丰田CAN总线数据加工:OBD口监听、位域解析与反向控制

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

2026/9/20 17:50:58 阅读更多 →

最新新闻

PTO-ISA TSHL 指令详解:Tile 级逐元素左移的汇编语法、C++ 内建接口与多平台实现

PTO-ISA TSHL 指令详解:Tile 级逐元素左移的汇编语法、C++ 内建接口与多平台实现

PTO-ISA TSHL 指令详解:Tile 级逐元素左移的汇编语法、C 内建接口与多平台实现 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository…

2026/9/20 20:25:57 阅读更多 →
WorkBuddy安装全攻略:Windows/macOS环境配置与避坑指南

WorkBuddy安装全攻略:Windows/macOS环境配置与避坑指南

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

2026/9/20 20:25:57 阅读更多 →
Page Assist:把本地大模型装进浏览器侧边栏的完整指南

Page Assist:把本地大模型装进浏览器侧边栏的完整指南

Page Assist:把本地大模型装进浏览器侧边栏的完整指南 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 在读一篇英文长文时&#xff0…

2026/9/20 20:25:57 阅读更多 →
masscan 完整实战指南:互联网级异步 TCP 端口扫描器的参数详解、配置实践与源码原理

masscan 完整实战指南:互联网级异步 TCP 端口扫描器的参数详解、配置实践与源码原理

网络安全渗透测试CLI 【免费下载链接】masscan TCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes. 项目地址: https://gitcode.com/gh_mirrors/ma/masscan 点击查看 免费下载 导读 本文以 doc/masscan.8.markdo…

2026/9/20 20:25:57 阅读更多 →
告别C盘爆满:Windows磁盘清理与预防实战指南

告别C盘爆满:Windows磁盘清理与预防实战指南

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

2026/9/20 20:25:57 阅读更多 →
GD32H759工控实战:RT-Thread下ADC/DAC驱动与硬件过采样调优

GD32H759工控实战:RT-Thread下ADC/DAC驱动与硬件过采样调优

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

2026/9/20 20:24:56 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →