4qcon广州 岑裕 保障API优雅与稳定的多平台实践

QCon大会

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

QCon  QCon2019 

文字内容
1. 保障 API 优雅与稳定的多平台实践 岑裕 融云 - 工程效率首席架构师
2. 自我介绍
3. 自我介绍 岑裕 在融云担任工程效率首席架构师、音视频核心技术负责人 工作集中在 IM、音视频与工程效率 对 0 ➔ 1 过程中质量与效率的提升比较有兴趣 之前,曾在三星通信研究院从事 Android 系统及 RCS 融合通信 framework 研发
4. 目录 • 重要性与愿景 • 问题与挑战 • API 的范围 • 实践讨论 • 演进示例
5. API 的重要性 计算机领域有句名言 —— 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。 • 积木式编程,扩宽业务范围 • 降低交流成本,身心愉悦
6. 愿景 • • • • 优雅 简单 健壮 稳定
7. 问题与挑战 • • • • 用户群与使用方式不明确 不同用户的需求不一致,功能与流程不断变化 多种平台风格不统一,变更不可预见 历史包袱与向后兼容
8. API 的范围 • 如何被使用? 协议调用(HTTP/RPC),语言调用(Native SDK) • 如何运行? 配置文件,环境变量,加载库,内存,线程 • 谁在使用? • 相关方都有谁? LSUD(Larget Set of Unkown Developers) SSKD(Small Set of Kown Developers) 人,需要可理解性 文档/Demo/工具/Log 机器,需要 向后兼容
9. 实践讨论:明确的 Workflow 范围定义 设计 编码 • 量化指标和使用工具提升稳定性 • 避免设计压力集中于 1~2 个人 Review 发布 反馈 演进
10. 实践讨论:范围定义 • • • • 明确服务对象 明确用户的使用场景 Eating your own dog food 针对不同需求可以采用分层 API 模式
11. 范围定义:分层 API 模式 125 App MeetingKit MeetingLib 100 CallKit CallLib IMKit RTCLib IMLib 集 成 时 间 75 灵 活 性 50 25 RTCEngine Protocol 0 RTCLib CallLib CallKit
12. 实践讨论:优雅的设计 • • • • • 简单:一个 API 只做一件事情 先抽象模型,再进行多平台设计 平台风格 ➔ 语言风格 ➔ 业务抽象 ➔ 团队风格 命名细节:时态、单复数、介词、大小写 等等 经验式编程:所见即所得
13. 优雅的设计:经验式编程 • • • • 免注释式命名 行为自解释 区分基础与高级 API 避免副作用 https://www.programmableweb.com/
14. 实践讨论:稳定的设计 • 少即是多 http://api.example.com/cgi-bin/get_user.php?user=1 • 信息是否必须要用? • 如果只保留1个接口,2个接口? • 避免扩散:Interface/ Final • 向后兼容 Java8: Interface Java7: Final Class Objetive-C: __attribute__((objc_subclassing_restricted)) __attribute__((objc_requires_super))
15. 稳定的设计:向后兼容 • 100% 向后兼容是可能的吗? 否
16. 稳定的设计:向后兼容 • 接口适配层,为业务预留空间 • URI 中预置版本号 • http://api.example.com/v1/users/12345?fields=name,age • 预定义错误码 • 410 Gone • 小版本之间直接迁移 • 使用新 API 重新实现旧 API,并标为废弃 • 抽象模型不同时:警惕同时维护两套 API
17. 实践讨论:编码 • • • • 防御性编程 LifeCycle 注册 检查版本号 运行库命名空间
18. 实践讨论:Review • Code Review 是基础 • 自动化工具的参考报告 • 静态分析:命名/复杂度 • 接口变更统计 • 接口 Unit Test • 文档自动生成 • 团队评审
19. 实践讨论:发布与反馈 • • • • 区分版本:dev/stable A/B Test 接口使用统计:APM Log:级别与回调
20. 演进示例:一次爬坑的实践 1. 假设拯救灾难项目:停下新功能的发布 2. 加入反馈:API 使用统计,A/B Test 3. 建立 API 评审的流程 4. Dog Food:写一个 App,审视 API 是否合理 起跑线
21. 演进示例:一次爬坑的实践 5. API 声明变更,interface/ final/ Getter/ Setter 6. 向下抽象适配层,为 API 调整预留空间
22. 演进示例:一次爬坑的实践 7. 业务重构,用新的业务实现旧 API
23. 演进示例:一次爬坑的实践 8. 用新 API 重写 Demo,尝试简单和复杂的功能 9. 发布 dev 版本并收集反馈 10. 发布 stable 版本更新
24. 演进示例:数据统计展示 • API: 融云 IMLib iOS SDK • 版本: 2.2.5~2.9.16 / 98 • 时间: 2015/07/27~2019/05/14
26. 总结 • • • • 明确 API 的用户群体 建立 API Workflow 与度量指标 收集反馈 改进细节