基于sermant的应用实战之全链路灰度
背景
我们是一家致力于提供 数字零售解决方案 的创新型科技公司,聚焦于 社交电商 和 私域流量运营 领域。公司通过构建完善的技术平台和多场景业务模式,帮助商家提升销售效率,实现数字化转型。
在中间件统一监控和微服务治理的推进过程中,我们一直面临着一个显著的挑战:由于历史原因,公司内部应用数量庞大,推动业务侧通过 SDK 改造并发布新版本的成本极高,升级的阻力也较大。为了解决这一痛点,我们开始探索通过 Agent 技术统一实现公共的监控和服务治理。
服务化现状
- 应用规模:公司当前拥有 260个服务,支撑近 1000台服务器 的运行;
- 多云架构:采用 多云多主体 部署模式,涵盖腾讯云、阿里云、火山云、亚马逊等平台,服务链路复杂且分布广泛;
- 高并发支持:在大促期间,整体 QPS 峰值可达 10万左右,系统具备高负载承载能力;
- 技术栈统一:服务端技术栈以 Java 为主,保证了系统开发与运维的一致性;
为什么选择 Sermant
Sermant 是一种基于 Java 字节码增强技术的无代理服务网格。其核心原理是通过 JavaAgent 将 Sermant 挂载至目标进程中,借助插件化机制支持多种扩展功能。这种设计不仅降低了业务接入门槛,还显著减少了改造成本。
从 Sermant 1.0 版本发布开始,我们便启动了相关的探索和实践。在多次版本迭代中,我们发现 Sermant 的功能和稳定性持续优化,能够很好地满足我们的业务需求。目前,我们的系统已全面升级至 Sermant 1.3.1 版本。
痛点场景
我们基于 Sermant 技术体系进行了深度探索,并通过自研插件,实现了在监控、全链路灰度及服务治理等多个场景的突破性进展。
1. 监控场景
通过自研监控插件,我们大幅提升了对核心资源和关键调用的透明化管理能力,为业务优化提供了重要支撑:
- Dubbo 请求包监控:实时监控 Dubbo 请求与响应的大小,帮助业务侧发现并优化过大的入参和返回值,从而降低大促期间的网络延迟问题;
- Druid 连接池监控:采集并分析 Druid 数据库连接池的状态,帮助定位连接池性能瓶颈,提高数据库访问的稳定性;
- JDBC 参数监控:监控 JDBC URL 中的参数配置情况,推动业务统一添加
connectionTimeout
和socketTimeout
等关键参数,优化数据库连接的超时策略;
2. 全链路灰度场景
在全链路灰度方面,我们通过一系列插件实现了多场景的灰度发布与流量隔离能力:
- 网关流量入口基于用户染色:在流量进入网关时,根据用户特征打上灰度标签,为后续的链路传播提供支持;
- Dubbo 静态标签规则:在 Dubbo 调用中通过静态规则设置标签,确保灰度流量精准落地;
- 全链路透传标签:实现调用链路上灰度标签的无缝透传,确保不同模块之间能够一致识别流量属性;
3. 服务治理场景
服务治理插件聚焦于资源规范化和安全管理:
- Jar 包管控:通过插件上报应用所依赖的 Jar 包信息,帮助运维团队实现对依赖版本的统一管控,避免版本冲突或漏洞问题;
- 敏感密钥管控:结合自研的 KMS(密钥管理服务),插件自动下发应用所需的敏感密钥(包括数据库、 Redis、 Elasticsearch、第三方服务密钥等),减少人工介入并提升安全性;
本文主要已应用全链路灰度来详细阐述我们的实践。
全链路灰度的实践
在大规模微服务架构下,全链路灰度是实现功能稳定发布与风险最小化的关键手段。通过灰度发布,企业可以在小范围内验证新功能的稳定性与兼容性,在降低故障影响范围的同时,逐步完成全量推广。然而,全链路灰度的实施面临流量精准控制、跨模块一致性、以及实时动态调整等多重挑战。
基于 Sermant 的插件化机制,我们构建了一套完整的全链路灰度方案,成功覆盖了从流量入口到后端服务的全链路场景,下面将详细介绍我们的实践过程与成果。
全链路灰度的设计原则
在设计全链路灰度方案时,我们遵循了以下三大核心原则:
- 全链路一致性:确保灰度流量从入口到调用链的每个环节,都能完整保留灰度标签,并严格按照灰度规则执行;
- 高扩展性:支持灵活定义灰度策略,满足不同业务场景的需求,例如用户维度、设备维度、地域维度等;
- 动态调整能力:支持实时监控与调整,快速响应异常情况并进行流量回收或修复;
全链路灰度的具体实现
流程概览如下图所示:
1. 网关流量入口:基于用户染色
灰度发布的第一步是将目标流量正确标记。我们通过在网关层实现以下功能,确保灰度入口的准确性:
- 用户特征标记:根据业务需求,通过用户业务线、用户 ID、地域(IP)等信息对流量进行染色(打灰度标签);
- 标签动态配置:未来计划支持通过管理平台动态调整染色规则,无需重启网关服务即可生效;
通过网关的染色能力,我们可以将特定的用户群体精准纳入灰度范围,避免影响正常用户。
2. Dubbo 调用:静态标签规则与动态路由
在微服务调用中,我们结合 Dubbo 的静态标签机制,确保灰度流量能够按照预定规则精准流转:
- 静态标签规则:应用启动时,通过配置指定应用的环境标识,并将其注册到注册中心;
这一机制通过标签的静态化管理,实现了灰度流量的精确分发,避免了对非灰度服务的影响。同时,我们选择静态标签规则而未采用 Dubbo 的动态路由,主要是出于未来运维和维护成本的考量。静态标签规则简单清晰,无需频繁调整路由配置,而网关可以依据既定的标签规则自动完成流量转发,大幅降低了复杂度并提升了稳定性。
3. 全链路透传:标签无缝传递
全链路灰度的核心在于确保灰度标签能够在调用链的每一个环节中无损传递,确保流量的准确性与一致性。借助 Sermant 开源插件,我们实现了以下关键能力:
- 自动透传:无需业务侧进行代码改动,即可在 HTTP、Dubbo、Kafka 等多种调用链中实现灰度标签的自动透传;
- 跨模块一致性:确保灰度标签在跨模块、跨系统调用中始终完整传递,不丢失、不变形;
这一功能显著降低了全链路灰度的实施难度与业务改造成本,同时有效保障了灰度流量的全链路一致性,为灰度发布的稳定性提供了技术支撑。
4. 实时监控与流量调整
灰度发布的过程中,异常情况的快速处理尤为重要。我们通过以下手段实现对灰度流量的动态管控:
- 实时监控:通过网关实时日志,实时跟踪灰度流量的健康状态(如响应时间、错误率等);
- 快速回滚:在监控到异常时,可以通过管理平台一键调整灰度策略,将流量快速回退到稳定版本,减少影响范围;
落地实施
- 全面落地应用:
已实现全量接入,覆盖 200+ 服务 和 1000+ 台 pod,形成了稳定的应用生态。 - 成本显著优化:
有效节省 20% 的运维成本 和业务沟通成本,提升了整体协同效率。 - 插件化能力输出:
公司公共组件通过 插件化 形式提供,减少了业务侧频繁进行 SDK 升级的工作量,大幅降低了升级推动的难度与成本。
展望
通过 Sermant 的插件化实践,我们不仅在监控、灰度和服务治理方面取得了显著成效,还为公司内部的大规模系统优化提供了技术支撑:
- 提升研发效能:减少了业务开发侧的改造工作量,降低接入成本;
- 增强系统可靠性:通过实时监控和治理手段,确保系统在高并发场景下的稳定运行;
- 强化安全管控:敏感数据和资源的统一管理,降低了安全隐患;
未来,我们将继续挖掘 Sermant 在性能优化和功能扩展方面的潜力,包括但不限于:
- 进一步精细化的监控能力:覆盖更多中间件场景,实现更细粒度的指标采集;
- 插件生态建设:扩展适配更多的技术框架和业务场景,提升 Sermant 的通用性和适用性;
Sermant 的实践让我们看到了字节码增强技术在微服务治理中的巨大潜力,也期待与社区和行业伙伴共享经验,共同推进这一领域的技术发展!