这是我参与「第五届青训营 」伴学笔记创作活动的第 七 天
- 架构是什么
- 企业级后端架构
- 企业级后端架构面临的挑战
架构是什么
定义:架构是有关软件整体与组件的抽象描述,用于指导软件系统各个方面的设计。
架构的重要性:
架构对于软件系统,正如基石对于摩天大楼,奠定下稳固的基石才能成就万丈高楼。架构也正如此,好的架构有如下的体现:
- 可靠性,系统不易崩溃,高可用,可容错
- 安全性,系统安全可靠,可规避不法侵入,信息泄露等等
- 可拓展性,系统能够在保证流量高峰期的合理性能,通过容器服务进行拓展
- 易维护性,系统能够正确记录服务日志以供调试排查,系统的部署简单便捷
- 可伸缩性,当系统引入新的组件或者技术时,不需要改动原先系统代码接入就可以使用。
架构的演进:
单机 -> 单体 -> 垂直应用 -> SOA -> 微服务
单机架构:系统所有功能集成在一个文件中,同时系统部署在一台服务器的一个进程中。
- 优点:架构简单,开发成本低,周期短,适用于微小项目
- 缺点:不易于协同开发,不易于拓展及维护,维护需要暂停服务;系统的鲁棒性极差
单体架构:由单机演进,将同一个系统部署在多台服务器上,由多个服务一起服务应用。
- 优点:具备水平拓展扩容能力,运维不再需要停服
- 缺点:后端进程职责过多,服务压力大;爆炸半径较大,进程中的任一部分出错,都可能会导致整个进程崩溃。
垂直应用架构:在单机架构的基础上,将系统拆分成互不干扰的多个小系统。小系统也使用单体架构的模式部署在多个服务器上。
- 优点:一定程度上减轻了后端进程压力,缩小了爆炸半径
- 缺点:只是将大服务拆成小服务,但是并没有解决单机架构的缺点
SOA(面向服务架构):引入了分布式服务价格(RPC),应用系统根据功能单元拆分,不同功能的模块通过 RPC 进行调用。
- 优点:各模块职责更清晰,易于运维,服务爆炸半径可控
- 缺点:调用需要使用 RPC,接口开发工作量增加;服务器需求量增加(预算增加);需要设计一套完备的 ESB(企业服务总线)解决方案
微服务架构:将系统服务完全独立出来,并将服务处抽取成一个个微服务。微服务遵循单一原则,分工明确,服务不重合。
- 优点:服务粒度细,有利于资源重复利用;提高系统可维护性;去中心化,服务采用RESTful等轻量化通信协议
- 缺点:微服务过多,服务治理成本高,不利于系统维护;开发成本巨大,技术要求高
tips:
架构演进主旋律:提高软件系统的可用性,满足迭代需求,提高迭代效率
架构演进主思路:
- 垂直切分——分布式
- 水平切分——分层/模块化
企业级后端架构
云计算
云计算基础:
-
虚拟化技术
- 硬件层面(VM 虚拟机)- KVM/Xen/VMware
- 操作系统层面(Container 容器)- LCX/Docker/Kata Container
- 网络层面 - Linux Bridge/Open v Switch
-
编排方案
- VM - OpenStack/VMWare Workstation
- Container - Kubernetes/Docker Swarm
云计算架构:
-
云服务
- IaaS - 云基础设施,对底层硬件资源池的抽象
- PaaS - 基于资源池抽象,对上层提供的弹性资源平台
- SaaS - 基于弹性资源平台构建的云服务
- FaaS - 更轻量级的函数服务。好比 LeetCode 等 OJ,刷题时只需要实现函数,不需要关注输入输出流
-
云部署模式(拓展)
- 私有云 - 企业自用
- 公有云 - AWS/Azure/Google Cloud/Huawei
- 混合云
云原生
云原生,实际是云原生(计算)的简称,它是云计算发展到现在的一种形态。
云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。 它的代表技术:
- 弹性资源
- 微服务架构
- DevOps
- 服务网格
弹性资源:
基于虚拟化技术,提供的可以快速扩缩容的能力。可以分为弹性计算资源和弹性存储资源两个方面。
弹性计算资源:
- 计算资源调度:在线计算(后端服务) / 离线计算(Map-Reduce/Spark/Flinnk)
- 消息队列:在线队列 / 离线队列
弹性存储资源:
- 经典存储:对象存储 / 大数据存储
- 关系型数据库:Oracle、MySQL
- 元数据:服务发现
- NoSQL:KV 存储(Redis) / 文档存储(Mongo)
微服务架构:
微服务架构下,服务之间的通讯标准基于 HTTP / PRC 协议,二者区别?
- 性能 - RPC 协议往往具备较好的压缩率,性能较高。如 Thrift, Protocol Buffers
- 服务治理 - RPC 中间件往往集成了丰富的服务治理能力。如 熔断、降级、超时等
- 可解释性 - HTTP 通信的协议往往首选 JSON,可解释性、可调试性更好
服务网格:
服务网格(Service Mesh)是一个专门处理服务通讯的基础设施层。
- 微服务之间通讯的中间层
- 一个高性能的传输层网络代理
- 将流量层面的逻辑与业务进程解耦
服务网格相较于 HTTP/RPC 协议:
- 实现了异构系统治理体验的统一化
- 服务网格的数据平面代理于业务进程采取进程间通信的模式,使得流量相关逻辑(包含治理)与业务进程解耦,生命周期更易于管理。
企业级后端架构面临的挑战
基础设施层面:
- 云计算如何就解决近乎无线的弹性资源,提高物理资源的价值转换率?
- 如何利用闲置的物理资源,提高资源利用率?
用户层面:
- 微服务之间的通信开销较大,如何控制通信成本呢?
- 如何解决微服务因网络抖动导致的运维成本呢?
- 如何屏蔽异构物理环境带来的差异呢?
应对策略:
- 离在线资源并池
- 微服务亲和性部署
- 流量治理
- 屏蔽异构环境算力差异
总结
架构选择得从服务需求出发。一寸长一寸强,但是对于大部分的系统,应该考虑如何把好钢用在刀刃上,尽最大的可能实现需求。
当然学习架构是每个开发者的必经之路。架构的设计第一要义就是结合需求,其次要做足业界调研,第三才是技术选型,最后是考虑异常情况(用户输入校验,容灾能力)。