阿里巴巴微服务技术实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 阿里巴巴微服务技术实践
阿里巴巴/中间件技术部 朱勇
2.
3.
4. 自我介绍
朱勇(千臂)
阿里巴巴中间件
高级技术专家
关注点
分布式架构
微服务
性能优化
字节码及 Java agent 诊断
2009 ~ 2013
阿里巴巴中国网站
收费产品诚信通服务化
企业采购部架构和服务化
2013 ~
中间件技术部
热部署工具 HotCode2
应用容器 Ali-tomcat
微服务框架 PandoraBoot
Dubbo 开源生态建设
5. 目录
Java 隔离容器 Pandora 微服务运维与诊断
2 4
1 3 5
阿里服务化架构演进 微服务框架 Pandora Boot 展望及 Q&A
6. 阿里服务化架构演进
Part I
7. 单一应用架构
技术栈
All in one
•
•
•
•
整个网站几个应用
前台 web + 后台 ops + tasks
业务 web + service/dao 各自开发
一起集成发布
•
•
•
•
Webx
Spring + Ibatis
Jboss
Oracle
存在的问题
•
•
•
合并时经常代码冲突
发布相互制约效率低下
应用代码庞大臃肿维护困难
8. 垂直应用架构
按应用拆分
jar
Service / DAO / Impl 都以二方库 jar 的形式提供出去
• 代码拆分,独立部署,流程隔离,技术栈没有太大变化
• 应用相互之间直接依赖二方库
• 问题:
• 升级困难,要全网推动
• 数据库连接池压力大
商品
会员
交易
9. 分布式服务架构
RPC
API 与实现分离
• 使用 RPC 进行通信,服务端升级方便
• 各种服务中心出现,会员中心,商品中心,交易
中心等
• 技术栈:
• Ali-tomcat
• Pandora
• Dubbo
• HSF
• 存在的问题:
• 依赖冲突
• 中间件升级困难
• 应用配置服务
• 应用开发效率低下
10. 微服务架构
Boot 拥抱微服务,提升开发体验和效率
• 应用更轻量、开发更简单
• 配置
• 编码
• 开发
• 调试
• 部署
• 技术栈:
• Pandora Boot
• Spring Boot
11. Java 隔离容器 Pandora
Part 2
12. 为什么需要隔离?
中间件相互冲突
应用快速升级
发布的需求
中间件与应用
相互冲突
中间件统一升级
统一运维的需求
13. Pandora 容器架构
基于 ClassLoader实现
• 插件体系
• 生命周期
Pandora/Spring Boot Jetty/JBoss
Ali-tomcat Standalone(main)
应用容器
• 事件体系
Pandora 容器
插件部署 类加载器 服务框架 消息组件
生命周期 事件体系 配置组件
插件
数据访问
提供中间件
的服务
App1
使用所需
的服务
应用生命周期
的事件通知
App2
应用
14. Pandora 结构与部署形式
pandora.sar/
| -- conf/
| -- lib/
pandora 容器内部依赖
|
| -- pandora.api.jar
|
| -- pandora.archive.jar
|
` -- pandora.container.jar
| -- plugins/
pandora 插件列表
|
| -- hsf/
|
|
| -- conf/
|
|
` -- lib/
hsf 插件内部依赖
|
| -- tddl/
|
|
| -- conf/
`
`
` -- lib/
•
•
•
~/${app_name}/
|-- bin/
| |-- setenv.sh
| |-- appctl.sh
| `--preload.sh
|
|-- target/
| |-- ${app_name}.tgz
| |-- ${app_name}/
| |-- pandora.tgz
| `-- pandora.sar/
与应用 tgz 包部署在一起
应用可单独升级 pandora.sar
应用容器识别 –Dpandora.location,便于本地开发
15. 现有架构的不足
OPTION 01
使用成本高
pandora 使用方式新人难理解
本地开发麻烦,需要配置 JVM 参数或借助 IDE
调试困难 mvn 依赖与 pandora 实际运行版本不一
致导致调试时行号对不上,或源码找不到
开发效率低 pandora.sar 全家桶用户无法按需选择,
应用启动慢
OPTION 01
OPTION 01
OPTION 01
应用创建难
OPTION 01
部署运维难
新应用创建时多为复制老应用,遗留问题始终
得不到清理解决,形成恶性循环
启动脚本、自检、dockerfile 配置、上线流程复杂繁琐
应用状态不透明,容器及中间件状态是黑盒
16. 微服务框架 Pandora Boot
Part 3
17. 开发人员的痛点
应用创建
应用搭建无从下手
从旧项目中 Copy
基础中间件接入、包冲突严重
中间件代码不易引入
开发调试
本地环境依赖太重
各种 IDE 插件
中间件问题无法 debug 调试
部署发布
应用上线难
打包、脚本、自检
Docker File 配置繁锁
应用状态
中间件黑盒子
无法得到中间件的具体状态
运行状态不透明
没有健康检测
18. Pandora Boot 解决方案
Pandora 改造
核心 Archive
Sar 包 Maven 化
Middleware-SDK
Bootstrap
中间件模板工程
运维脚本、Docker 模板
打通发布运维系统
Pandora Boot
革新中间件使用方式
Main 函数启动
Autoconfig/Junit 支持
Spring Boot
中间件 starter
业务 starter
中间件 Endpotins/health
19. Pandora 核心 Archive 化
Archive 抽象
• dir
• Jar
• Jar In Jar
Jar Protocol 扩展 / Jar In Jar / Fat Jar
jar:file:/pandora.sar!/
jar:file:/pandora.sar!/container.jar!/
jar:file:/pandora.sar!/plugins/hsf-plugin.jar!/
整个 pandora.sar 是一个 Jar,插件是一个 Jar
面向 URL 编程
从面向文件目录转为面向 URL
和标准的 URLClassLoader 对齐
从 URL 扫描 Pandora 插件启动
Plugin Diamond HSF
Archive
Plugin TDDL ONS
Archive
Pandora Container Archive
pandora.sar Archive
20. Pandora sar 包 maven 化
通过 maven 依赖 pandora.sar 包
积木式组合 / 依赖即所得
TDDL
Diamond
应用依赖无污染
PandoraClassloader 才会识别加载
普通 ClassLoader 不会加载
ONS
21. Pandora middleware-sdk
middleware-sdk
maven 平板化依赖
依赖冲突严重
VS
一个 maven 依赖
hsf/tddl/tair/ons,60M,196 jar 使用简单,4M
中间件功能不能保证 ASM字节码生成
Netty/thrift/logger 新增插件 / API 无维护成本
只有导出的 API
大量答疑 解决 Debug 问题
排查问题先要排查依赖 sources.jar / UTF-8 无乱码
难以升级 随 pandora.sar 包升级发布
应用依赖固化 / 升级困难 保证API和sar包对应
22. 自动生成 sdk.jar / sources.jar
ASM
保留 public/protected
删除 private field/method
函数抛出 RuntimeException
SDK生成
hsf plugin 60+ jar/ 22M
hsf-sdk.jar
扫描所有的lib jar
只保留导出类
可选的关联导出类
hsf-sdk-sources.jar
SDK源码
通过maven自动生成
UTF-8编码
无乱码
23. Pandora Boot 解决方案
Pandora 改造
核心 Archive
Sar 包 Maven 化
Middleware-SDK
Bootstrap
中间件模板工程
运维脚本、Docker 模板
打通发布运维系统
Pandora Boot
革新中间件使用方式
Main 函数启动
Autoconfig/Junit 支持
Spring Boot
中间件 starter
业务 starter
中间件 Endpotins/health
24. Pandora Boot 应用开发
% java -jar hsf-server.jar
......
Service(pandora boot) startup in 8484 ms
% mvn pandora-boot:run
......
Service(pandora boot) startup in 12043 ms
25. Pandora Boot 解决方案
Pandora 改造
核心 Archive
Sar 包 Maven 化
Middleware-SDK
Bootstrap
中间件模板工程
运维脚本、Docker 模板
打通发布运维系统
Pandora Boot
革新中间件使用方式
Main 函数启动
Autoconfig/Junit 支持
Spring Boot
中间件 starter
业务 starter
中间件 Endpotins/health
26. 与 Spring Boot 集成
Spring Boot starter 生态在 Pandora Boot 上无缝使用
Pandora Boot 与 Spring Boot 无缝集成
Pandora Boot 类隔离 + Spring Boot 快速开发
Spring Boot 的依赖是平板化的,难以解决依赖
冲突的问题。Pandora Boot 提供类隔离技术,
中间件与业务之间不会存在类冲突
Pandora Boot 提供完整的解决方案
Pandora Boot 是一套完整的解决方案,本地开发时
无缝集成 autoconfig,日常、线上部署无缝打通内
部发布、运维等系统
27. 在 Spring Boot 中使用 HSF
使用 annotation 简单的发布、消费、测试 HSF 服务
HSF 服务 Spring Boot 自动装配 单元测试
@HSFProvider @HSFConsumer @RunWith
@HSFProvider(serviceInterface=HelloW @HSFConsumer 注入服务调用方 @RunWith(PandoraBootRunner.class) 进
orldServlce.class) 标注需要暴露出去的远程 @SpringBootApplication 自动装配 行基于 Pandora 的单元测试
服务
28. 中间件 Endpoints / Health
Endpoints
Metrics
Health
运行时信息 运行时状态 黑盒 -> 白盒
环境信息 应用 / 组件状态 查看实时数据 curl
中间件内部信息 中间件状态 与外部对接查看历史数据
用户配置等
29. Pandora Boot starter 列表
中间件 18+
ü
ü
ü
ü
ü
ü
ü
ü
ü
hsf
diamond
Message
Cache
Data
Monitor
Metrics
Scheduler
……
业务类 10+
ü
ü
ü
ü
ü
ü
ü
登录
会员
ACL
LOG
地址库
类目
……
30. Pandora Boot 解决方案
Pandora 改造
核心 Archive
Sar 包 Maven 化
Middleware-SDK
Bootstrap
中间件模板工程
运维脚本、Docker 模板
打通发布运维系统
Pandora Boot
革新中间件使用方式
Main 函数启动
Autoconfig/Junit 支持
Spring Boot
中间件 starter
业务 starter
中间件 Endpotins/health
31. Pandora Boot 模板工程 Bootstrap
标准模板
避免复制旧代码,依赖干净
创建工程数 3W+
中间件示例
按需勾选,代码质量保证
最正确用法,持续更新
Release 相关
打包发布规范
脚本、健康检查等
可以直接发布,30分钟上线
32. 32
Pandora Boot 应用增长数
Pandora Boot 应用增长趋势
5000
30% 全网占比
集团微服务开发框架标准
主打开发体验,成为业务架构升级的⾸首选
年年应⽤用增⻓长 10 倍
4500
4355
4000
3504
3500
3000
3626
3818
2853
2500
2381
2000
1884
2594
2092
1551
1500
1255
1000
500
0
901
330
189 247
69 110
455
574
8 18 35 52
Jun Jul Aug Sep Oct Nov Dec 2017 Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec 2018 Feb Mar Apr
33. 微服务运维及诊断
Part 4
34. 微服务中心
平台能力
基础能力
应用资源 应用管控 应用诊断
健康状态
能力透出
应用健康 资源状态 中间件管控 日志分析
环境配置 资源申请 容器管控 在线诊断
Metrics
Health
Config
JMX
Arthas
35. 实时大盘
36. 线程堆栈
37. 在线诊断
38. 未来发展方向
Part 5
39. 未来发展
Spring Boot 2.0
JDK9 Jigsaw
Serverless/RxJava
40. THANKS
--------- Q&A Section --------
/感谢聆听
41.
42.
43.
44.