这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
什么是架构
- 有关软件整体结构与组件的抽象描述
- 用于知道软件系统各方面的设计
实例类比: 蛋糕店
单机架构
把所有功能实现在一个进程中, 并部署在一个机器上
优点:
- 简单
问题:
- c10k problem: 讨论了单个机器在网络服务中的瓶颈
- 运维需要停服
蛋糕店只有一个师傅, 完成制作蛋糕所有的工作
单体, 垂直应用——垂直切分
单体架构: 分布式部署
多雇几个师傅, 完成蛋糕的制作
垂直应用架构: 按应用垂直切分的单体
优点:
- 水平扩容
- 运维不需要停服
问题:
- 职责太多, 开发效率不高
- 爆炸半径大, 当服务的一个环节出问题, 影响到很大范围的服务
划分不同种类的蛋糕, 由不同师傅完成
SOA, 微服务——水平切分
SOA(service-oriented architecture)
- 将应用的不同功能单元抽象为服务
- 定义服务之间的通信标准
微服务: SOA的去中心化演进方向
企业级后端架构剖析
云计算
通过软件自动化管理, 提供计算资源的服务网络, 是现代互联网大规模分析和存储的基石
基础:
- 虚拟化技术
- 编排方案
架构:
- IaaS: Infrastructure as a Service
- PaaS: Platform as a Service
- SaaS: Software as a Service
- FaaS: Function as a Service
使用云计算提供的服务, 将更多精力集中在业务上
云原生
云原生技术为组织在公有云, 自由云, 混合云等新型的动态环境中, 构建和运行可弹性扩展的应用提供了可能
弹性资源
计算资源:
-
服务资源调度
- 微服务: 逻辑简单, 性能要求较低的服务
- 大服务: 性能要求高的服务
-
计算资源调度
- 在线: 对实时性要求高的计算任务
- 离线: 实时性要求不高, 但是计算量大的任务
-
消息队列
- 在线: 削峰, 解耦. 对于消息的生产者, 不用关心消费者的状态, 只需要将消息放入消息队列中, 这样降低了负载, 满足了在线的实时性要求
- 离线: 大数据分析
存储资源:
-
经典类型
- 对象
- 大数据
-
关系型数据库
-
元数据: 如用户数据等
-
nosql: KV类型的存储
DevOps
用于软件交付, 贯穿整个软件开发周期, 结合自动化流程, 提高软件开发和交付的效率
微服务架构
通信标准:
- HTTP(RESTful API)
- RPC(Thrift, gRPC)
如何选用http或rpc:
- 性能方面: rpc存在数据的压缩方案, 优于http
- 服务治理
- 协议可解释性: http的json数据格式更有利于数据的解释
服务网格
- 微服务之间通讯的中间层
- 高性能网络代理
- 业务代码与治理解耦
相比较于传统的http/rpc通信框架:
- 异构系统治理统一化
- 与业务进程解耦, 生命周期易管理
企业级后端架构的挑战
-
基础设施层面
- 物理资源有限: 机器, 带宽
- 资源利用率受制于部署服务
-
用户层面
- 网络通信开销大
- 网络抖动导致运维成本提高
- 异构环境下, 不同实例资源水位不均
离在线资源并池
- 降低物理资源成本
- 提供更多弹性资源
将离线资源和在线资源并池, 在不同时间段提供弹性的物理资源调度
-
在线业务: 在高峰时期提供更多的资源调度
- IO密集型
- 潮汐性, 实时性
-
离线业务: 在非高峰时期进行大型的计算任务
- 计算密集型
- 非实时性
自动扩缩容: 利用在线业务潮汐性自动扩缩容
微服务亲和性部署
- 将满足亲和性条件的容器调度到一台宿主机
- 微服务中间件与服务网格通过共享内存通信
- 服务网格控制面实施灵活, 动态的流量调度
流量治理
- 熔断, 重试
- 单元化
- 复杂环境的流量调度
CPU水位负载均衡
- IaaS提供资源探针, 获取当前机器的负载情况
- 服务网格实现动态负载均衡
后端架构实战
实现CPU负载均衡
- 动态权重决策中心采集容器的性能指标, 动态更新权重信息
- 向注册中心更新权重信息, 当出现问题, 可以回滚为静态的权重
- 采集RPC指标
缺点: 决策中心职责较多, 风险增加
微服务化:
- 引入消息队列削峰, 解耦
- 离在线链路切分
- 梳理强弱依赖