关于架构的理解 “把桌子放在房间里看,把房间放在院子里看,把院子放在城市规划里看。” 2.1 什么是架构 架构,是对系统的描述。 维基百科的定义是:软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。 系统的三大特征表现在架构上就是:横向可并列,纵向可推导,整体可演进。 物理学的熵增定律表明孤立系统总是趋向于熵增的方向发展。在软件系统里同样适用,只不过是以复杂度的增加表现的。 互联网软件系统总是朝着复杂度增加的方向发展。所以架构的第一目的是控制复杂,使系统朝着可控的方向发展。 2.2 什么是好的架构图 简洁抽象:好的架构图一定是简洁的,表现上简洁有力,能够一眼看上去就经纬分明。有一定的抽象度的,如果一个架构图存在各种飞线环线,那一定是抽象的不够。抽象才有意义,架构里如果存在各种细节,那就是堆砌。 可解释:好的架构图一定能够用来解释当前系统的现状和行为。 指导行动:好的架构图一定是可以指导行为的,指导行动才是架构图的最大价值。能够预测未来,指导行动。对于某个领域架构图,根据架构图都不知道把某个模块放哪里,那就是失败的。好的架构图应该是对于一个没有经验的人,都能根据架构来做模块划分。 可进化:对应于系统的动态性,架构也会随着时间而进化的。不能进化的架构就像花瓶,看着很美,一碰就碎。 2.3 架构图 对架构的呈现业界已经存在不同的框架。有4+1视图、C4 模型、TOGAF 提出的企业架构模型等。不管哪种模型,其核心思想都是从不同的维度对软件架构进行描述。下面着重从这几个方面来简述。 2.3.1 4+1模式 4+1视图由 Philippe Kruchten 提出的对软件工程逻辑架构的描述,目前已经成为事实上的软件结构标准,分别以终端使用者、开发者、系统工程师、软件经理等不同的视角对软件进行描述。如下图所示: 逻辑视图(Logic View):终端使用者的视角,从功能角度来描述不同功能组件的层次关系。 开发视图(Development View):开发者视角下,从实现层面描述不同代码的包、类、库的构成关系。 过程视图(Process View):不同组件之间的行为关系,通常以时序图的形式来表示,有一定的时序延展性。 物理视图(Physical View):部署视图,系统所依托的物理视图。 场景视图(Scenarios):系统所涉及的不同对象之间的关系。通常以用例图的形式来呈现。 基于这5个视角,可以衍生出5种架构模型。场景、功能、实现、过程、部署,一层层的抽象。 4+1架构视图,构建了一个观察了解系统框架。它告诉我们可以从逻辑视图、开发视图、过程视图、物理视图、场景视图这几个层面来对系统进行描述、观察、理解。对于一个系统,这5个视角已经是很完备了。值得注意的是4+1更大的价值是提供了一套分析系统的框架,实际上怎么呈现不同的团队可能有不同的形式。对于一个系统从不同的视角看会得到不同的理解,横看成岭侧成峰。 2.3.2 C4模型 C4 模型是由 Simon Brown 在2006年至2011年之间创建,在4+1模型的基础上建立( https://c4model.com/ ),实际上就是以下4个单词的缩写: 上下文 Context:描述的系统与周边系统、人的关系。重点是该系统与外界的关系。这里的外界包含人、以及其他的系统。 容器 Containers:容器是一个功能的单位,是从技术层面来描述,可以是一个服务,也可以是一个技术组件或者一个功能模块。例如一个基金系统会包含交易服务、订单服务、商品服务等。 组件 Components:组件是容器的的组成,组件是对容器的放大,例如商品服务里包含 sku 管理、行情数据、衍生指标等。 代码 Code:这一层次是代码级别,包含接口、类、对象的继承、组合、包含等。 该模型是对一个系统从宏观到微观逐级展开来描述,犹如拿着放大镜从太空看地球一样。 第一层看到的是地球与其星球的环绕、第二层是看到地球上的山川海河,第三层看到的是不同的国家城市,第四层看到的是不同的房子家庭。 C4 模型基于4+1模型,但是也有些差异。如果说4+1重点是横看成岭侧成峰。那 C4 模型则是一窥到底的放大镜。 C4 模型告诉我们,不同抽象层次的关注点、挑战点、问题域都是不同的,站在不同的层次就要思考对应的事情。 关注点一旦与该层次不匹配就会出现逻辑错乱问题。能分清楚问题域在何种层次其实已经把问题解决一大半了。 有时候,在低层次很难解的问题,上升一个层次就迎刃而解了。 有时候,在高层次看不清的问题, 降低一个层次就一目了然了。 高层次是低一层的抽象,低层次是高一层的具化。 高手应该是能够识别不同的抽象层次,并且可以游刃有余地在不同抽象层次之间穿梭。 处于高层次时不应该被低层次的具体牵绊,处于低层次的时候也不应该好高骛远。 2.3.3 TOGAF-4A 架构 业务架构:业务战略,治理,组织和关键业务流程。从企业视角来看,重在价值、信息、协作,关联多部门。 应用架构:要部署的各个应用程序的蓝图,其交互以及与组织核心业务流程的关系。 数据架构:一个组织的逻辑和物理数据资产和数据管理资源的结构。 技术架构:支持部署业务,数据和应用程序服务所需的逻辑软件和硬件功能。这包括IT基础设施,中间件,网络,通信,处理和标准。 TOGAF 认为架构的目的是为了帮助企业实现如下能力:异构到同构(塑造同构 IT)、事后到事先(塑造规划 IT)、离散到统一(塑造统一 IT)、无序到有序(塑造有序 IT) 2.3.4 实际模型-互联网模型 实际上,相对于传统的软件系统,互联网行业发展比较快,业务存活周期比较短,就形成了互联网行业特定的架构描述方式。更多是以业务架构、技术架构、部署架构三种形式呈现。 业务架构:从业务角度描述系统承载的功能集合、领域边界、各组成部分的逻辑关系。区别于技术架构,业务架构图里避免出现技术类的术语,如 DB、MySQL、CMQ、同步、异步、并发等。 技术架构:从技术角度描述系统各组成部件之间的交互关系,技术架构体现的要具有技术特色,例如同步、异步、消息等。 部署架构:从物理角度描述系统的部署分布。 2.4 微服务的理解 软件架构归根结底无非两种模式:从技术层面和业务功能层面来设计。在理解这两个之前先区分一下技术语言和业务语言: 技术语言:是实现层面的。如 DB、MySQL、查询、超时、读写分离、快慢分离、逻辑层、缓存、创建订单、同步、异步、多线程、多进程。 业务语言:是功能层面的。如买入、取出、基金信息、行情、基金详情、资产、产品列表、持仓列表、申购列表、赎回列表。 技术人员要做的是摆脱技术语言体系,走进业务体系,不能被技术语言限制住。从本质上来说技术是为了业务服务的,所以理解业务第一,技术第二。对业务有了深刻的理解,再转过去用技术来实现业务。最好的实践就是在业务代码中看不到技术词汇,只有业务。 微服务最早由martinfowler提出,定义如下:“In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.” --- https://www.martinfowler.com/architecture/ 说一下我的理解,微服务不是小服务,如果只是因为规模小,那直接叫小服务即可,更准确的叫法是:小而完整的服务,这里的小是指体积,完整是指能够提供完整的业务能力。微服务是一种理念,其表达的是用一个服务来表达一个实体相关的所有行为,某个实体与外部的所有联系均通过该服务来发生。区别于以往按照技术功能划分的服务,ao 做逻辑层,dao 做存储层,vo 做展示层。一个实体的行为要通过 vo、ao、dao 三个服务的关联才能表达出来。而微服务是纯粹从业务语义层面出发,只需要一个服务,对外的表示只有一个。类似于一个国家,虽然小,但是有自己的法律、武装、税收等。微服务拥有自己的逻辑、存储、领域等。微服务核心思想:服务即实体,我即全部。服务是实体概念的载体。其出发点是从业务领域或者功能层面就进行彻底的解耦。微服务之间完全异构,微服务之间甚至都无技术层面的共通性。 例如代表保单的微服务,所有跟保单的相关行为都是该服务提供的,该服务内部实现保单的存储和查询,外界无需关心,创建保单、查询保单、理赔保单均是通过该保单微服务实现的。 但是在实操中,限于硬件水平和当前的技术能力,单个微服务又难以承接实体相关的所有行为。例如保单的查询对性能要求比较高,保单的写入对一致性要求比较高,这种情况下,如果放在一个服务里就会带来实现上的困难。这时可能又会回到了传统技术功能划分服务上来,考虑读写分离,分出一个查询和读的保单微服务。有时候也是无奈的妥协,但是一般的原则是先坚持原则再妥协。先按照微服务领域的不可分割性来设计,遇到技术性的挑战再做调整与妥协。