新闻详情

新闻详情

首页 / 资讯中心 / 详情

Sentinel Envoy RLS Token Server 实战:基于 gRPC 为 Envoy 提供全局限流服务

发布时间:2026/9/20 17:50:43来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

FastGPT 接入企业微信:三步把知识库变成群里的问答机器人 2026/9/20 18:41:53

FastGPT 接入企业微信:三步把知识库变成群里的问答机器人

FastGPT 接入企业微信:三步把知识库变成群里的问答机器人 【免费下载链接】FastGPT FastGPT is a knowledge-based platform built on the LLMs, offers a comprehensive suite of out-of-the-box capabilities such as data processing, RAG retrieval, and visual…

阅读更多 →
Phoenix 前端资产与样式开发规范:Tailwind CSS、JS/CSS 构建与 UI/UX 设计指南 2026/9/20 18:41:53

Phoenix 前端资产与样式开发规范:Tailwind CSS、JS/CSS 构建与 UI/UX 设计指南

Phoenix 前端资产与样式开发规范:Tailwind CSS、JS/CSS 构建与 UI/UX 设计指南 【免费下载链接】phoenix Peace of mind from prototype to production 项目地址: https://gitcode.com/gh_mirrors/ph/phoenix 导读 本指南基于 Phoenix 仓库中随应用脚手架一…

阅读更多 →
Gooey 1.0.8.1 发布解读:放宽 WxPython 依赖约束,根治跨环境安装问题 2026/9/20 18:41:53

Gooey 1.0.8.1 发布解读:放宽 WxPython 依赖约束,根治跨环境安装问题

Gooey 1.0.8.1 发布解读:放宽 WxPython 依赖约束,根治跨环境安装问题 【免费下载链接】Gooey Turn (almost) any Python command line program into a full GUI application with one line 项目地址: https://gitcode.com/gh_mirrors/go/Gooey 本…

阅读更多 →
SuperClaude Framework 前端架构师(frontend-architect)Agent 实战指南:无障碍、性能与响应式设计 2026/9/20 18:41:53

SuperClaude Framework 前端架构师(frontend-architect)Agent 实战指南:无障碍、性能与响应式设计

开发工具CLIAI 技能/插件测试人工智能AI 评测 【免费下载链接】SuperClaude_Framework A configuration framework that enhances Claude Code with specialized commands, cognitive personas, and development methodologies. 项目地址: https://gitcode.com/gh_m…

阅读更多 →
接口Mock测试实战指南:从原理到工具选型与避坑手册 2026/9/20 18:41:53

接口Mock测试实战指南:从原理到工具选型与避坑手册

开会的时候,产品经理说了一句“这个接口咱们Mock一下就OK了”,全桌人点头如捣蒜,只有你在心里反复问自己:Mock到底是什么?说实话,这个问题我当年也问过自己很多次。我第一次听到“接口Mock测试”这个词&…

阅读更多 →
大模型时代视觉智能三境界:判别、理解与生成行动 2026/9/20 18:38:52

大模型时代视觉智能三境界:判别、理解与生成行动

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞