携程酒店技术微服务实践
如果无法正常显示,请先停止浏览器的去广告插件。
1.
2. 携程酒店技术微服务实践
SACC 2021
傅向义
3. 个人简介
携程大住宿事业部研发经理,酒店搜筛排前端服务负责人和技术专家
2015年加入携程,曾先后负责酒店前端服务转Java、搜筛排技术架构设
计与开发、推荐与广告工程、微服务及中台架构设计与开发等工作。在
酒店搜索、筛选、排序、微服务实践等方向有丰富经验。
4. 大纲
1. 为什么要做微服务?
2. 怎么做?
3. 微服务为我们带来了什么?
4. 技术实践
5. 经验教训分享
6. 总结和展望
5. 1. 为什么要做微服务?
6. 原因1:庞大的单体前台应用
页面端
特点
• 单体应用提供了500+服务
前台服务
• 五百万行代码仓库
问题
• 代码项目越来越大,复杂度指数上升
• 业务之间相互耦合严重
• 无效业务代码清理困难
酒店列表 酒店详情 房型列表 榜单列表
点评列表 相册 订单提交 支付
订单列表 收藏列表 周边列表 ……
• 发布部署成本高
• 对新人不友好
酒店后台
7. 原因2:多平台一致性问题
每一个平台都对接各自的单个应用
App端 Web端 H5端
App服务 Web服务 H5服务
信息不一致根因
• 开发团队不同
• 架构设计差异
• 数据源和数据模型不一致
• 不同团队代码风格和实现不一致
• 代码冗余严重
• 需求迭代速率不同
酒店后台
8. 原因3:SCRUM模式成本加剧
多个团队同时迭代同一个代码仓库
问题
• 代码冲突严重
• 代码碎片多
• 集成测试需求冲突严重
• 发布迭代相互依赖
• 需求管理混乱
9. 原因4:治理困难
不同服务对性能和资源的要求不一样
问题
• 非核心服务影响核心服务
单体应用
• 伸缩性差
大报文
• 流量管理困难
• 资源利用率差
• 性能调优困难
计算密集
IO密集
日志型
非核心
高并发
核心
10. 解决方案:微服务化
解耦
可复用
独立部署
弹性伸缩
让一个小规模的应用专注做好一件事
独立团队
……
11. 可行性分析
服务架构:SOA
技术选型:Java,Springboot,Tomcat,……
携程云生态:
• CtripPaaS(容器化、集成部署、……)
• SOA Portal(注册发现、熔断限流、负载均衡、配置中心、……)
• CAT/Sitemon/Hickwall 日志与监控
• ES/Kibana 数据可视化
• ……
12. 2. 怎么做?
13. 原来的架构
Ctrip App
前
台
应
用
Ctrip
App
服务
Ctrip Web
中间件
Ctrip Mobile
Web
Trip App
Ctrip
Mobile
Web
服务
Ctrip
Web
服务
Trip
App
服务
Trip Web
Trip PC
服务
Trip Mobile
Web
Trip
Mobile
Web
服务
服务治理 配置
AB实验 日志
消息 监控报警
定时任务 ……
数据中心
酒
店
后
台
DB Redis
搜索 查询 静态信息 订单提交 点评 ES Hive
营销 智能算法 支付 智能客服 …… ClickHouse ……
Ctrip PaaS
14. 领域模型拆分
横向的核心业务拆分
酒店
列表
酒店
详情
房型
列表
填写
页
订单
创建
排序推荐
纵向的特有业务拆分
静态信息
酒店列表
价格
标签
用户优惠券
……
订单
详情
……
15. 逻辑统一
多平台逻辑统一收口
Ctrip App 服务 Ctrip PC 服务 Trip App 服务
…… …… ……
酒店排序逻辑 酒店排序逻辑 酒店排序逻辑
顶部推荐逻辑 顶部推荐逻辑 顶部推荐逻辑
…… …… ……
排序微服务
酒店排序逻辑
顶部推荐逻辑
16. 通用组件抽象
微服务框架组件
• 整理统一maven依赖,打包成parent-bom
• 微服务非业务代码解耦
• 功能扩展
• Sidecar(计划中)
微服务
SOA 日志
数据Mock
微服务
UBT埋点
本地cache
业务代码
微服务框架组件
业务代码
17. 微服务平台架构
注册中心
治理系统
路由
配置
注册
发现
注册
发现
微服务
(调用方) 微服务
(服务方)
微服务框架组件 微服务框架组件
SOA Agent SOA Agent
协议契约
流量管理
……
服务平台
内网服务访问
实例管理
Proxy
Proxy
Gateway
Gateway
容器编排
集成部署
外网服务
容器编排
……
18. 微服务业务架构
中文App
中文Web
酒店列表集成
酒
店
中
台
中文Mobile
Web
Trip App
Trip Web
房型列表集成
Trip Mobile
Web
其他第三方
订单创建集成
用户信息 筛选 用户信息 筛选 用户信息 可订校验
酒店信息 房型信息 房型推荐 房型信息 酒店信息 房型信息
标签 价格 标签 价格 标签 价格
酒店排序 …… 房型排序 …… 预订信息 ……
……
酒店后台
搭
积
木
19. 3. 微服务为我们带来了什么?
20. 好处
数据一致性大大提升 系统容错力提升
• 酒店信息、房型信息各端一致率53%-
>100% • 独立部署
研发效率提升 研发人员的成长 (码农 -> 专家)
• 同一份业务代码
• 微服务发布灵活成本降低
• 消化更多需求
• 弹性伸缩(SmartHPA)
• 成为微服务owner
• 微服务持续性能优化
21. 带来的新问题
问题排查环节变多
• 单应用内的处理微服务间的通信
• 分布式缓存节点分散在
• 解决方案:分布式日志追踪(后面介绍)
发布管理复杂
• 一个团队管理的微服务数量变多
• 总发布频次增多
• 解决方案:发布计划管理
22. 4. 技术实践
23. 通用数据模型建设
减少数据模型差异
统一字段名定义,减少五花八门的命名
降低微服务之间协议契约的定制成本
24. CI/CD实践
CI&CD接入
• 由git merge触发,经过一系列代码检测,打包发布部署
• 支持发布生产环境
25. CI/CD实践效果
线上质量
发布效率
微服务规范和要求:
1)无影响订单的RCA
覆盖率
• CodeReview -> 100%
• Sonar问题 -> 0
每次发布节省约1h
静态扫描:节省约30m
接入应用
UT平均覆盖率:86%
2)生产事件:10个, 对比
同期减少60%
自动化运行和分析:节
省30m
所有微服务均接入
• UT新增覆盖率-> 80%
质量数据:
CI&CD流程
生产事件数量
微服务化后
12
10
8
6
4
2
0
生产事件数量减少60%
1月
2月
3月
4月
5月
6月
7月
2019年
8月
9月
10月
11月
12月
1月
2月
3月
4月
2020年
5月
6月
26. 日志架构
日志框架
日志标准化
• 日志/埋点分布式框架
• 微服务日志实现
应用层
Trace
微服务
TripLog
Hermes
/Kafka
日志展现层
存储层
传输层
ES
Realtime
Processor
CK
Request/
Response
Cat/Bat 日志系统
Artnova 报表系统
Kibana
数据可视化系统
27. 分布式日志追踪
每个微服务内部可能依赖多
个第三方或者后台服务
唯一标识前后串联单次请求
中的完整链路
提升问题的排查效率
微服务内部调用链
28. 5. 经验教训分享
29. 微服务化=重构
微服务化的过程,其实就是对原有代码的重构
我们到底都有哪些业务逻辑?
• 文档维护缺失+人员流动,唯有代码,而且注释几乎没有,导致前期整理困难
• 大量无用代码、开关、ABTest实验等影响业务分析
因此,微服务化也是一次文档的再整理,以及代码的清理过程。
30. 生产流程标准化
持续集成
Unit
Test
开发
构建
CI/CD pipeline
Pass
Sonar Pass
自动化
Case
发布
FAT
回归
测试
发布
UAT
Pass
迭代开发流程变化
敏捷
敏捷+微服务
设计
开发
测试
部署
回归
测试
发布
PROD
生产
灰度
生产
全量
31. 技术升级与业务需求的矛盾
微服务化本身会消耗研发资源
• 与产品沟通达成妥协,在一定周期内减少业务需求量
• 抽调人员单独组建微服务研发团队
不能“Stop The World”
• 生产对比时发现缺了需求,再紧急补,影响原来上线计划
• 同一个需求,微服务里做一份,原来的单体应用里也要做一份
• 仅做在了微服务里,但是因为微服务有问题,切回导致功能丢失
改造期间,与各业务开发团队及时沟通,做好需求同步
32. 分布式缓存变化
单体应用的local cache分散到各个微服务中,反而增加了资源的消耗
本地缓存往redis里迁移,牺牲一些性能来节省资源
微服务A
单体应用
城市缓存
微服务A
城市缓存
品牌缓存
Redis
微服务B
……
微服务B
城市缓存
品牌缓存
微服务C
城市缓存
品牌缓存
微服务C
品牌缓存
33. 服务流量治理
微服务化后,每个微服务可能会承接多个调用方
• 流量管理:黑白名单,服务级qps限制,应用及qps限制等
• 拆分核心和非核心Group,设置不同的降级策略,进一步提高系统稳定性
调用方A 微服务G
调用方B 核心Group
治理中心
调用方C
调用方D
非核心Group
34. 团队的变化
在逻辑收口到中台微服务后,多平台的团队将重组,并且将微服务分配到每个人/团队管理
• 按照领域划分团队可以最大程度上减少团队之间的应用重合度
35. 6. 总结和展望
36. 总结
• 微服务化会改变原有生产流程,是对老的生产全链路的再升级
• 微服务化带来了轻量化的小规模应用,高复用性和灵活性的同时,对例如稳定性、一致性、
减少生产事件等等问题有一定的帮助
• 微服务化的同时,组织结构也会相应发生变化
• 微服务化会是一个长期持续的过程,分分合合,不断平衡
37. 展望
• Service Mesh——Istio的实践
• Scrum团队的划分边界有待进一步探索
• 自动化测试高效化和智能化探索
38. 一些建议
• 在开始微服务化之前一定要想明白
• 您理解的微服务是什么?
• 为什么要微服务化?
• 目前公司基础建设程度?
• 是否值得花成本来做?
• 是否符合公司战略?
39.