浅谈软件工程架构及其演进 | 青训营笔记
这是我参与「第五届青训营」伴学笔记创作活动的第 7 天
前言
本文介绍了软件工程架构及其演进史,并包含了企业级后端架构刨析等内容。
什么是架构
软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。软件架构会包括软件组件、组件之间的关系,组件特性以及组件间关系的特性。软件架构可以和建筑物的架构相比拟。软件架构是构建计算机软件,开发系统以及计划进行的基础,可以列出开发团队需要完成的任务。 —— Wikipedia
简单来讲,软件架构就像建筑的地基一样,为指导软件实现的方法起到重要作用。只有地基坚实了,大厦才能盖的高。
我们以蛋糕店为例,假设有人想要开一家蛋糕店,那么作为蛋糕店的老板,一开始他可能会这样布置他的蛋糕店…
单机架构
所谓单机架构,就是把所有功能都实现在一个进程里,并部署在一台机器上。对于蛋糕店来讲,就是一家蛋糕店里只有一个人工作,且这个人要负责所有制作,售卖蛋糕的工作。
这种架构的好处是,开发和部署起来十分简单,对于小型应用来说足矣。但对于大型应用来说,他的并发性不足,存在性能瓶颈(如著名的 The C10K problem),并且无法保证高可用性。对于蛋糕店来讲,就是这个人一个人不能服务成千上万的人,且这个人必须24小时不停的干,无法停止工作。
于是,单体架构和垂直应用架构被提出用于解决此类问题。
单体架构和垂直应用架构
单体架构通过分布式部署来对服务进行扩容。对于蛋糕店来讲,就是招了多个师傅去做相同的工作,招的师傅越多,能同时接待的客户数量就越多。
而竖直应用架构则更进一步,将服务进行竖直切分,让将一个服务切分成多个功能互不相干的服务,独立运行。对于蛋糕店来讲,就是招了多个师傅,但是这些师傅有的只会做肉松蛋糕,有的只会做慕斯蛋糕……
值得一提的是,无论是单体架构还是垂直应用架构,都需要一个中心化的负载均衡层引导用户使用需要的服务。对于蛋糕店来讲,就是类似大堂经理的职责啦。
单体架构和垂直应用架构解决了单机架构的停服问题,保证了高可用性,因为其中一个服务下线并不影响其他服务正常运行,或可由其他服务替代线下服务;同时,这种架构还支持水平扩容,只需要简单增加服务数量,就可以轻松服务更多用户。但是这种架构的缺点是,每个服务虽然各自独立,却负责了太多职能(例如肉松蛋糕师傅虽然只做肉松蛋糕,但是他依然需要负责发面,装饰,售卖等职责,其他师傅也需要做同样的事),这导致每个服务开发效率急剧降低,模板代码增多,且爆炸半径巨大(想象蛋糕店的某个蛋糕师傅无法正常出餐,那我们就需要排查这个师傅做过的所有活中哪个活有问题)。
于是,我们引入分工协作的方式来提高做蛋糕的效率,这便是 SOA 和 微服务。
SOA 和微服务架构
在软件工程中,面向服务的体系结构 (Service-Oriented Architecture) 是一种体系结构样式,它侧重于离散服务而不是整体式设计。[1] 因此,它也应用于软件设计领域,其中服务由应用程序组件通过网络上的通信协议提供给其他组件。 —— Wikipedia
SOA 以水平切分的思想,通过将一个应用之间有关联和无关联的功能都切分成一个个单独运行的服务,并通过某种通信标准(例如 HTTP, RPC)交换数据,最终构成一个完整的服务整体。还是拿蛋糕店举例,此时大堂经理将希望购买蛋糕的用户带到不同蛋糕售卖点,这些售卖点会通过某些特别的沟通技巧和发面的,干杂活的,烘烤的师傅互相交流(这些师傅也会通过同样的沟通技巧互相交流以进行协作),最终拿到成品蛋糕。
而微服务架构则可以被近似的认为是 SOA 的一种去中心化方向。蛋糕店的职能被进一步拆分,每个单独职能都可和其他职能进行必要的沟通交流。
SOA 和微服务架构通过引入分工协作有效的提高了软件开发和软件运行的效率,同时带来了弹性的软件架构。当然,这也引入了更多问题:数据一致性问题,高可用问题,治理和容灾问题,解耦和过微问题等。这些问题都是企业级后端架构常见的问题。
企业级后端架构刨析
经过软件工程行业多年的发展,目前市面上有多种技术为企业级后端架构设计带来了便利,它们各自都极大程度上的改变了企业级后端架构的设计:
云计算
云计算是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模数据分析和存储的基石。
云计算的基础是虚拟化技术(例如 KVM, Hyper-V,可以简单理解为虚拟机服务)和编排方案(例如 Kubernetes, OpenStack,将不同的虚拟机或容器以某种方式组合在一起,动态使用)。
云计算的架构由 IaaS(Infrastructure as a Service,基础设施即服务,例如腾讯云,AWS),PaaS(Platform as a Service,平台即服务,例如 Heroku,Netlify),SaaS(Software as a Service,软件即服务,例如 Microsoft 365,Adobe Creative Cloud),FaaS(Function as a Service,功能即服务,例如云函数,AWS Lambda 等) 等共同组成。
云原生
云原生技术为组织(公司)在公有云、自由云、混合云等新兴的动态环境中构建和运行可弹性拓展的应用提供了可能。
云原生可以为企业提供弹性计算资源(如服务资源调度,计算资源调度,消息队列等)和弹性存储资源(如对象存储,关系型数据库,NoSQL 等)。
DevOps 是云原生时代软件交付的利器,贯穿整个软件开发周期。结合自动化流程,提高软件开发,交付效率。常见的 DevOps 有敏捷开发,CI/CD 等。
云原生场景下,可使用微服务中间件(使用 RPC,HTTP 等协议进行通信)或服务网格(Service Mesh)组织容器之间的沟通。
值得一提的是,由于以 docker, Kubernetes 为主的一系列 Go 云原生基建的流行, Go 语言本身也越来越受到市场的青睐。
企业级后端架构的挑战
问题:
- 物理资源有限
- 资源利用率受制于部署服务
- 网络通信和网络抖动导致成本提高
- 异构环境下,不同实例资源水位不均
解决方案:
- 离在线资源并池,自动缩扩容(在线业务是指 IO 密集型业务,有实时性要求,离线业务是指计算密集型业务。在不同的时间以在线资源资源占用为量度,为在线资源和离线资源分配不同的空间来动态利用剩余资源)
- 微服务亲和性部署
- 流量治理
- CPU 水位负载均衡
引用
该文章部分内容来自于以下课程或网页:
- 字节内部课:架构初探 – 谁动了我的蛋糕
- 软件架构 – Wikipedia
- Service-oriented architecture – Wikipedia