本文来自极客时间《架构实战案例解析》--王庆友
架构的本质
架构的本质是:通过合理的内部编排,保证复杂系统高度有序,能够不断扩展,满足业务和技术的变化。
- 保证复杂系统有序
首先,架构的出发点是业务和技术不断复杂化,引起系统混乱,从而需要通过架构来保证有序。
搭一个草房子很简单,可以直接上手;盖一个 2 层楼房,稍微复杂一些,但在工匠的经验 指导下,问题也不大;而盖一座高楼,复杂性就大不一样了,我们需要考虑内部结构、承重、采光、排水、防雷抗震等,这就需要专业人员事先做好整体的架构设计,并严格地按照设计来施工。
可以看到,建筑里的架构不是天然就有的,而是因为建筑越来越复杂,我们需要通过架构来管理这种复杂性,避免建造过程的失控。
软件系统也是如此,从简单的桌面应用发展到现在的大型互联网平台,这个过程中,系统规模越来越大,业务和技术也越来越复杂。我们同样需要通过架构设计,消化复杂性带来的混乱,使系统始终处于一个有序状态,能够应对现有和将来的需求变化。
- 内部编排保证有序
其次,架构实现从无序到有序,是通过合理的内部编排实现的,基本的手段,就是“分”与“合”,先把系统打散,然后将它们重新组合,形成更合理的关系。
“分”就是把系统拆分为各个子系统、模块、组件。我们比较熟悉的微服务架构,就是一种典型的拆分做法。
“合”就是基于业务流程和技术手段,把各个组件有机整合在一起。比如说在微服务架构中,拆分为具体微服务后,我们需要对这些服务进行归类和分层。
举个例子,在 Builder 设计模式中,它的主逻辑是将各个部件组装起来,它不关心创建某个具体部件的内部逻辑,它承担的是合的部分;工厂模式负责细粒度的构造逻辑,承担的是分的部分。大家各自管理自己的复杂性。
架构的分类
可以分为业务架构、应用架构和技术架构。
通常有很多种分法,这只是其中一种。
那么,这些架构分别为谁服务,解决什么问题?
通过一个系统的落地,首先需要人来开发,然后由机器来运行,人和机器共同参与一个系统的落地。
人可能会遇到的问题:业务太复杂,系统后续维护困难;架构追求的是系统概念清晰,业务逻辑容易理解,从而使人可以直观地进行代码开发。
机器可能会遇到的问题:外部请求并发量太大,机器扛不住;架构要求的是系统能够水平扩展,支持硬件容错,保证系统的高性能和高可用。
这里,开发的痛点主要由业务架构和应用架构来解决,机器的痛点主要由技术架构来解决。
- 业务架构
业务架构就是讲清楚核心业务的处理过程,定义各个业务模块的相互关系,它从概念层面帮助我们理解系统面临哪些问题以及如何处理;
- 应用架构
应用架构就是讲清楚系统内部是怎么组织的,有哪些应用,相互间是怎么调用的,它从逻辑层面帮助我们理解系统内部是如何分工与协作的。
- 技术架构
技术架构就是讲清楚系统由哪些硬件、操作系统和中间件组成,它们是如何和我们开发的应用一起配合,应对各种异常情况,保持系统的稳定可用。它从物理层面帮助我们理解系统是如何构造的,以及如何解决稳定性的问题。
举一个电商的例子。
比如一个商品业务,可能对应 3 个应用,一个前台商品展示应用、一个后台商品管理应用,以及一个商品基础服务。
业务架构定义了一个下单的具体流程;应用架构定义了下单有哪些应用参与以及它们如何协作;技术架构要保障相关的应用能够处理高并发,从而保证大促顺利进行。
举一个拍电影的例子。
业务架构定义了这个电影的故事情节和场景安排;应用架构定义了有哪些角色及其职责,在每个场景中,这些角色是如何互动的;技术架构确定这些角色由谁来表演,物理场景上是怎么布置的,以此保证整个拍摄能够顺利完成。
什么是好的架构?
一个好的架构必须满足两方面挑战:业务复杂性和技术复杂性。
- 业务复杂性
系统架构首先要满足当前的业务需求,还要满足将来的业务需求,系统要能不断地扩展变化,包括调整现有功能,以及增加新功能。(扩展性)
而且,系统的功能变化不能影响现有业务,不要牵一发动全身。因此,在架构设计上,要做到系统的柔性可扩展,能够根据业务变化做灵活的调整。(扩展性)
此外,上新业务功能,需要短时间就能落地。因此,架构设计上,还要做到系统功能的可重用,这样才能通过快速复用,实现业务敏捷和创新。(可重用)
- 技术复杂性
要保证一个业务能正常运行,还要保证这个系统稳定可用。
一个复杂系统是由很多部分组成的,如应用程序、服务器、数据库、网络、中间件等,都可能会出问题。那怎么在出问题时,能够快速恢复系统或者让备用系统顶上去呢?(高可用)
还有流量问题,平时流量不大,少量机器就可以处理,但在大促的时候,大量流量进来,系统是不是能够通过简单地加机器方式就能支持呢?(高并发)
此外还有低成本的问题,系统能否做到,使用廉价设备而不是高大上的 IOE 设备,使用免费的开源组件而不是昂贵的商业套件,使用虚拟化技术而不是物理机。(低成本)
什么是好的架构师?
一个优秀的架构师,应具备很强的综合能力。
- 抽象思维
抽象思维是架构师最重要的能力,架构师要善于把实物概念化并归类。比如,面对一个大型的 B2C 网站,能够迅速抽象为采购 -> 运营 -> 前台搜索 -> 下单 -> 履单这几大模块,对系统分而治之。
- 透过问题看本质
透过问题看本质是由事物的表象到实质,往深层次挖掘。比如,看到一段 Java 代码,知道它在 JVM 中如何执行;一个跨网络调用,知道数据是如何通过各种介质(比如网卡端口)到达目标位置。
- 多领域知识和技术前瞻性
架构师要有技术的广度(多领域知识)和深度(技术前瞻)。对主流公司的系统设计非常了解,知道优劣长短,碰到实际问题,很快就能提供多种方案供评估。
- 沟通交流
能落地的架构才是好架构,架构师还需要具备良好的沟通能力,能确保各方对架构达成共识,愿意采取一致的行动。
- 平衡取舍
良好的平衡取舍能力,可以确保架构在现有资源约束下是最合理的,能让理想最终照进现实。