手段
业务抽象
分而治之
标准规范
组织管理
演进
解决问题
保持重构
迭代升级
应对衰退
公共问题
- 编程思想
- 问题分解
- 领域建模
- 服务治理
- 流程机制
- 架构标准
业务发展 - 越来越复杂 - 必然趋势
理解成本变高
- 宏大的规模不好理解
- 复杂的结构不好理解
预测难度变大
- 业务变化
- 技术变化
Android OS
应用框架层
App开发者直接使用的接口层,UI的实现,数据的处理,资源的使用,都是用这一层的API
Binder IPC
提供跨进程访问的能力,App可以高效的访问由系统进程暴露的能力,App进程与系统进程之间的通信是典型的C/S模型
系统服务
提供窗口管理,相机,音视频等系统能力,包含各种子系统,内部逻辑很庞大,往下调用HAL层封装的硬件能力;往上通过Binder暴露可以远程调用的API
硬件抽象层
屏蔽底层不同驱动的差异,使得系统服务层可以快速适配到不同的硬件设备
Linux内核
CPU、内存、唤醒服务等重要的驱动实现都给予该层操作系统等核心实现
IOS
应用框架层 Cocoa touch(application layer)
- EventKit
- GameKit
- MapKit
- PushKit
图形图像层 media layer
- ULKit
- Animation
- Graphics
- Images
核心服务层 core services
- Location
- Motion
- Health
- GPS
- Telephony
- Foundation
内核层 core os
- Bluetooth
- Security
- Accessories
Android vs IOS
Activity ViewController
Intents Segues/ViewControllers
Service “Backgrond Mode”
ContentProvider CoreData
Layouts Storyboards and scenes
Flutter
UI框架层
提供不同样式的组件和动画,声明式UI,Dart作为编程语言,同时支持JIT和AOT
引擎层
将上层定义的UI树转换成屏幕像素,提供平台调用接口和Dart虚拟机
嵌入层
Flutter引擎需嵌入不同的平台
- 架构设计是为了解决特定领域不同发展阶段的业务问题
- 不同领域的架构有明显的技术差异,但是也有相似性
- 架构要面临技术挑战,还要应对组织业务膨胀的熵增
- 移动端需要利用有限的设备资源设计符合小屏幕的架构
小的架构手段
GoF设计模式
MVC
- View和Controller容易膨胀
- View和Model没有完全分离
MVP
- View和Model完全分离,可以修改试图而不影响模型,交互都发生在Presenter
- Presenter与View的交互是通过接口来进行的,方便单元测试
- 页面逻辑复杂的话,响应的接口也会变多,增加维护成本
MVVM
- ViewModel只负责处理和提供数据
- ViewModel里面只包含数据和业务逻辑,没有UI,方便单元测试
- 数据绑定使得程序较难调试,因为数据都是自动更新到UI
AOP
- OOP
1
2
3
4类:代码以函数(Method)和字段(Field)的形式封装在类中
函数:定义函数签名和函数体
函数题:定义函数的执行逻辑
编译器:将源代码转换成可执行代码 - AOP
1
2
3
4类:代码以切点(PointCuts),属性(Attributes)、植入(Advice)的形式封装在类中
切点:定义植入(Advice)的锚点
植入:定义需要植入的逻辑
植入器:将植入逻辑插入到锚点处
loC
- 直接依赖:一个对象A要完成其功能,通常需要依赖于其他对象B,C等,其具体的实现方式就是在对象A中构建(new)其所依赖的对象B、C等,这就相当于A控制了它所依赖的对象B、C
- 控制反转:打破A直接控制B这层关系,B对象的生命周期交由loC容器来控制,A不用再去寻找和初始化(控制)其所依赖的B、C了,只用等着loC容器的投喂就可以
- 实例SPI
大的架构手段
- 单体架构
- 分离架构
- 分层架构
- 服务化架构
- 需要约定模块可以对外提供的能力
- 模块之间需要遵循相同的调用方式
- 旧的模块需要按照相同的标准来改造
- 使用方不应该直接依赖于实现方
- 事件驱动架构
- 宿主-插件架构
- 微内核架构
- 微服务架构
- 领域驱动架构
summary
- 不同架构手段对共同目标是高内聚低耦合
- 找到适合业务场景的脚骨
- 一个复杂系统是多种架构模型的组合体
定义问题 确定架构 方案落地 结果复盘
认清问题 - 分类 && 分级
基础能力
常规能力建设
服务发现(SPI)
跨端能力建设
Web容器
Flutter
UI相关能力建设
基础UI控件
- 保持基础的UI控件在多端的一致性
夜间模式
- 夜间模式能提升图文场景下的用户体验
Native容器
- Native容器的统一有利于代码复用和页面基础能力建设
技术栈突破
静默灰度能力
- 显著提升版本升级率,加快需求验证
新技术预研
- 保持技术热情,探寻更好的解决方案
标准化
规范
工具
宏观指标
- 重复率
- 组件数
无用代码
- 无用setting
- 未调用的函数
工程架构
物理结构优化
- 良好的工程结构-开发的第一印象
工程组织模式
- 提供简洁高效的工程组织关系
仓库治理
- 保持仓库层级和数量在标准范围
多端工程一致性
- 保持多端在公共仓库和组件使用上的一致性
组件治理
- 目的:更新技术栈,服务多元业务
组件依赖治理
- 消费和拦截不合理的组件间以来
组件内标准化改造
- 保持每个组件职责清晰
多端组件能力统一
- 抹平不必要的组件多端差异
插件治理
- 持续提升插件这项重度使用的动态化能力,能够让业务迭代更为灵活
插件间依赖治理
插件能力建设
- 完善插件相关各项基础能力
插件标准化改造
- 规范多端插件调用和启动方式
全局复杂度治理
工具建设
- 完善有利于代码复杂度问题消费的工具
存量问题消费
- 持续为各业务方消费存量代码复杂度问题做好配套服务
防劣化建设
- 通过规范或流程卡口帮助复杂度指标不劣化
业务架构
解耦
多业务之间的依赖
逻辑优化
业务设计和实现优化
- 提升业务的复用率
组件逻辑优化
- 提升组件的通用性
减少重复代码,能力更稳定
核心能力中台化
视频
图文
Feed
内容生产
目标
技术基建
- 工具流程易使用
- 品质优化可复制
- 质量基建强约束
- 整体架构高可用
目标
- 平台接入工具便捷 -> 持续集成流水线、埋点上报和分析平台,实验平台等
- 本地工具随取随用 -> 各类IDE插件、编译工具链等可直接用于新产品
- 通用场景直接复用 -> 诸如磁盘、内存、线程调度优化等,可直接复制迁移
- 特殊场景沉淀基建 -> 诸如启动、预加载、分片处理等,需沉淀框架能力,形成通用组件
- 线下监测分析准入 -> 代码静态检查和运行时监控、自动化测试、、内测众测等通用能力和流程
- 线上监控止损归因 -> 各类指标监控报警手段、反馈舆情收集、熔断和回滚机制
- 工程结构简洁清新 -> 架构模型、演进思路、工程要素的组织关系要做到清晰明确
- 技术栈保持先进性 -> 工具、组件、Android版本、跨端、热修等动态化能力需持续更新
多个业务
- 业务之间低耦合
- 扇入扇出标准化
- 业务集合可维护
目标
- 服务注册发现机制 -> 利用中心服务管理模块进行解耦
- 公共模块下沉机制 -> 利用具备公共代码的模块进行解耦
- 接口使用规范一致 -> 多业务对外暴露的接口遵循相同的命名、参数、语义规范
- 业务外部依赖收敛 -> 最小化业务对外部的依赖,同步多业务相同依赖的版本
- 业务复用的清单制 -> 业务组合的场景很多,比如大业务拆开分层组合,需整体维护组合清单
- 业务集合的准入制 -> 大而全,但整体可复用程度低的业务稽核,不如少而精
单个业务
- 具备好的扩展性
- 支持傻瓜式集成
- 宿主依赖接口化
目标
- 外围能力可插拔 -> 业务内部具备事件路由能力,能够将事件调度到外围
- 扩展定制有范式 -> 差异化改造可用参照已有的扩展方式,不需要魔改
- 样例文档完备 -> 可用人工支持频次的降低来衡量样例文档是否健全
- 侵入式改造少 -> 减少集成的改造点和代码量
- 数据链路闭环 -> 从外部获取数据后,尽量业务内部闭环处理,交付结果给外部
- 默认实现兜底 -> 外部依赖尽可能有兜底实现,可让业务独立可调试