背景: 微服务架构之下,系统数量急速膨胀;伴随着公司业务高速迭代和悠久的历史,系统内充斥着越来越多的无用代码。
痛点:系统体量不断增大,对于开发、测试、发布、运维各阶段成本不断增加,系统瘦身的诉求越来越迫切。
1. 系统瘦身背景
- 全司应用数 3000+、代码行数 5000w+
- RD 人数约 500,人均 6 个应用,10w 行代码
- 一年内无变更应用,20%
问题:迭代近十年的服务,伴随着公司业务高速迭代,系统内充斥着越来越多的无用代码。系统体量不断增大,对于开发、测试、发布、运维各阶段成本上升,系统瘦身的诉求越来越迫切
目标:精简 50% 现有代码
2. 瘦身方案设计
将系统瘦身分为两部分:服务精简、代码精简
对于服务精简,在网关处捞取最近一段时间各服务的请求流量,对于无请求的服务可直接精简掉,对于流量很小的服务,考虑合并到其他服务或者进行下线;
对于代码精简,有三种方案:
- 基于 agent 进行代码插桩
- 基于 jacoco 实现
- 基于 Serviceability Agent (简称 SA)方案
最终选择 SA 方案,最大优势是对线上服务无任何性能影响,风险基本为 0
3. 代码精简实战
每日跑数逻辑:
- 随机抽取一个服务实例,进行下线
- 定期在机器上使用 SA 探测 JVM 中的方法执行次数,并上报 ACED 服务端
- 对实例进行服务上线
- ACED 服务端对存在调用次数的方法数据进行落库
- 对多次跑出的结果进行聚合,取并集,作为最终的被调用方法集
可精简方法分析:
- 静态代码分析,获得方法全集
- 除去跑输获得的被调用方法集,即为可精简方法集
精简逻辑:
- 全自动精简:自动在 git 中创建代码精简分支,直接删除可精简方法相关签名和实现。
- 这里有个细节,删除后可能无法编译。可增加选项,支持将方法置空,保留方法签名,这样能保证代码库可编译
这种方式,开发者对可精简代码的把控力度弱,因此提供了另一种半自动精简方式
- 半自动精简:将代码精简相关能力加入 idea 插件中,能实时拉取可精简列表集,开发者自行选择删除哪些方法,一键批量删除
4. 最终效果
- 开发估时平均降低约 10.9%,节省成本:8785 PD/年
- 发布效率提升约 9.5%,节省成本:641PD/年
- 酒店 hspa 接口:25%;报价详情页接口:34%
5. 总结与展望
后续可深入的方向:
- 很长周期才会被执行到的代码
- 代码行粒度的精简
- 对于配置的精简
1. 掌握多种代码精简技术,及各自适用场景和优缺点
2. 获得一种可落地的系统瘦身手段,提升团队效能