阿里巴巴超大规模微服务实践 陈志轩

QCon大会

2019/06/25 发布于 技术 分类

QCon  QCon2019 

文字内容
1. 阿里巴巴超大规模微服务实践 陈志轩/断岭 阿里中间件技术专家
3. 自我介绍 who am I • • 陈志轩/横云断岭 阿里巴巴中间件 • • • 类隔离容器Pandora/Pandora Boot Spring Boot微服务落地 开源应用断工具Arthas • • • 专注于微服务 Spring Boot 字节码/APM • • • Github: hengyunabc Email: hengyunabc#gmail.com 公众号:横云断岭的专栏
4. 大纲 阿⾥里里巴巴微服务实践 1 2 3 Spring Boot 实践 微服务诊断 4 微服务的思考
5. Alibaba微服务应用现状 微服务得到认可,提升开发效率 10K应⽤用 53.1% 2016 – 2019 增⻓长趋势分析 随着微服务理理念不不断深⼊入⼈人⼼心,应⽤用数开始爆发性增⻓长。成为收 购公司转型 Java 以及业务平台技术架构升级的⾸首选。 • ⽀支持核⼼心电商业链路路 • ⽀支持数⼗十个BU • 周新增应⽤用150+ • 占新增应⽤用95%以上 10206 8812 7867 6672 5484 330 579 150K机器器 8 18 2016.03 June 52 Sep 52 189 901 330 Oct 2017.03 June Sep Oct 2018.03 June Sep Oct 2019.03 Jul
6. Bootstrap创建应用 30分钟上线新应⽤用 标准模板 避免复制旧代码 依赖干净 中间件示例 按需勾选 代码质量保证 Docker模板 一杆到底 发布系统一路next 创建工程数50K 新人入职 旧应用迁移 价值放大
7. 用代码解决开发问题 勿以事⼩小⽽而不不为 01 VM Args/Program Args • • • • • 02 需要配置一个 –D 的参数 容易误配置到Program Args 开发人员可能是新手 在代码里判断提示Google一下 可能是在阿里写的最有价值的代码😂 检测日志配置冲突问题 • classloader检测多个日志配置文 件 • 防止日志配置不生效 • 定位日志冲突 • VPN下网络不通 • 低版本servlet-api冲突 • IDEA测试下无法输入 …
8. Docker分层发布 应⽤用启动速度优化 Maven插件改造 Lib目录分为三个目录: • Lib : 应用本身的module └── BOOT-INF ├── classes └── lib • Release-lib: release jar依赖 • Snapshot-lib: snapshot jar依 └── BOOT-INF ├── classes ├── lib ├── release-lib └── snapshot-lib 赖 Docker分层 COPY • Docker Layer有缓存 • Release-lib /snapshot-lib 基本不变 • 上传Registry的镜像大幅减小 • 分发到部署机器上的数据大幅减少 • 大应用上千个jar包/几百M,非常可观 COPY COPY COPY COPY BOOT-INF/release-lib BOOT-INF/snapshot-lib BOOT-INF/lib BOOT-INF/classes target/BOOT-INF/release-lib target/BOOT-INF/snapshot-lib target/BOOT-INF/lib target/BOOT-INF/classes
9. ClassLoader优化 应⽤用启动速度优化 Jar URL 转换为 File URL • • • • 以Exploded方式启动 URLClassLoader里File URL更快 大应用提速40S spring-boot/pull/16248 去掉未使用的Jar • ClassLoader记录所有加载类的URL • 统计得到未使用的Jar • 精确排掉未使用Jar 减少getResource • 缩小scan package • Exclude不必要的Configuration AJDK优化 • 去掉查找AWT Customizer
10. 大纲 阿⾥里里巴巴微服务实践 1 从0到 10K应⽤用 2 3 微服务诊断 4 微服务的思考
11. 维护Bom/避免Parent spring boot 实践 组合优于继承 Bom是组合,Parent是单继承 用户可以自由组合Spring Boot版本号和中间件版本号 不同部门有自己的Parent Bom管好自己/Parent进退两难 Bom只负责自己提供组件的版本 Parent管理越多,越难管理 维护Parent非常困难 需要长期的责任感 推动升级困难 依赖组合无法测试
12. 全部Starter放一个仓库 spring boot 实践 All In One 以日期为版本号 • 20+ Spring Boot Starter • 统一版本号/2019-04-stable • Starter之间的集成测试 • 按时间节点推动升级 618/双11 • 统一管理Bean/Filter初始化顺序 • 用户清楚知道使用的是老版本 • 和代码在一起的文档才是好文档 • Starter提供方要按时间保持更新 • 900+ Issue • 用户和Starter提供方形成升级默契 • 认真维护Release Note
13. 同时兼容Spring Boot 1/2 spring boot 实践 通过ASM分析现有Jar • • • • 抽取所有String 依赖spring boot 2 用ClassLoader查找类名 收集spring boot 2中不存在的类 Conditional • • • • @ConditionalOnSpringBoot1 @ConditionalOnSpringBoot2 Endpoint兼容/@ManagementContextConfiguration HealthIndicator兼容 代码组织 • • • • starter common autoconfigure1 autoconfigure2 集成测试保证兼容 • maven-invoker-plugin • 独立的spring boot1/2 demo • verify.groovy
14. Spring Boot Starter最佳实践 spring boot starter实践 1 2 3 如无必要,勿增实体 避免使用内部API 避免scan package • 不要提取新的概念 • 谨慎考虑是否增加 Builder类 4 提供enabled配置 • @Enabled 太多了 • @Enabled 停止 • 默认依赖即使用 • 很容易引起兼容性问题 • 打乱spring生命周期 5 优先用数组配置多个Bean • 数组方式自动提示友好 • 复数方式不支持自动提 示 • Fat jar下scan package非常麻烦 • 参考mybatis starter 6 Endpoint/HealthIndicator • 暴露starter的信息
15. JVM实时大盘 spring boot 实践
16. 中间件实时大盘 spring boot 实践
17. 应用日志 spring boot 实践
18. 线程堆栈 spring boot 实践
19. 依赖分析 spring boot 实践
20. 大纲 阿⾥里里巴巴微服务实践 1 2 从0到 10K应⽤用 Spring Boot 实践 3 4 微服务的思考
21. 开源应用诊断利器Arthas 微服务应⽤用诊断 Github 趋势 14000 12000 10000 2018年9月开源 https://alibaba.github.io/arthas/arthas-tutorials 8000 6000 13K 2K 800 STAR FORK WATCH 4000 2000 0 2018.09 10 12 Star Fork 2019.02 Watch 04 05
22. Arthas是一个Java Agent 微服务应⽤用诊断 字节码变换 Instrumentation API ClassFileTransformer redefineClasses 02 01 JVM信息API MemoryUsage MemoryPoolMXBean BufferPoolMXBean GarbageCollectorMXBean getAllLoadedClasses 03 功能组合 ognl表达式 静态函数调用 全局变量 信息汇总提取
23. Arthas快速开始 微服务应⽤用诊断 $ wget https://alibaba.github.io/arthas/arthas-boot.jar $ java -jar arthas-boot.jar
24. Arthas示例: dashboard 微服务应⽤用诊断
25. Arthas示例: watch 微服务应⽤用诊断 $ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
26. Arthas示例: jad/mc/redefine 微服务应⽤用诊断 jad 反编译代码 mc 内存编译代码 redefine 加载新的字节码
27. Arthas示例: Web Console 微服务应⽤用诊断
28. 大纲 阿⾥里里巴巴微服务实践 1 2 3 从0到 10K应⽤用 Spring Boot 实践 微服务诊断 4
29. 微服务实践的总结 Result Spring Boot • 事实的标准 • 开发效率 • 易用性打败其它对手 Metrics • 成为阿里巴巴基础设施 • RESTful接口透出 • 监控运维指标 Docker 01 10K应用 • 支持业务的快速发展 • 30分钟上线新应用 • 周上线新应用150+ 02 03 20+ Spring Boot Starter • 业务快速接入中间件 Arthas 13K Star • Java应用诊断利器 • 全面Docker化 • 保证环境一致 04 Spring Boot 6PR/Tomcat 2PR • 反馈上游
30. 微服务会成长为大应用 Future 服务不能无限拆分 Nano service? 应用随业务成长 不成长的应用说明业务没有成长 微服务是开发部署方式的变革 康威定律适用于微服务 设计系统的架构受制 于产生这些设计的组 织的沟通结构。 马尔文·康威
31. 微服务的未来 Future Serverless • • • 开发 开发调试不友好 运维复杂 成本下降 ServiceMesh • • • 成本上升 运维复杂 大部分只支持RPC/HTTP 应用 Native • • • GraalVM/Kotlin Native 成本下降 调试/排查问题困难 运维 成本