Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每一个上课听讲的程序员都不会陌生——软件的设计模式为咱们提供了针对现有的、重复出现的问题以可靠的解决方案。git
在软件架构方面一样存在相似的机制,通用的、可重用的解决方案在给定上下文中的软件体系结构中常常出现的问题。不一样的软件架构模式各有千秋,如下是目前较为主流的5种软件架构模式。程序员
分层模式大概是最知名的软件架构模式之一,有大量的开发者使用,但并不知道它的名字。分层模式将代码拆分为“层”,每一个层都有必定的责任,并为更高“层”服务。github
分层模式并无规定层的数量,但一般会有如下结构:数据库
分层模式的想法是用户经过执行某些动做(例如点击按钮)在表现层启动一段代码。随后,表现层调用应用层、进入业务层,最后持久层将全部内容存储在数据库中。简单来讲,分层模式中的高层调用并依赖低层。设计模式
根据应用复杂程度,咱们会看到不少相应的变体。例如某些应用会省略应用层,而某些应用会添加缓存层,甚至会出现两层合一的状况。缓存
如上所述,每层有每层的责任。表现层包含应用的图形设计和处理交互的代码。理论上来说,咱们不该该在这一层添加任何与user interface无关的逻辑。服务器
业务层是放置特定业务问题模型和逻辑的地方。微信
应用层位于业务层和和表现层之间。一方面为表现层提供业务层抽象,另外一方面为应用层提供放置某些不适合放置于业务层或表现层的某些协调逻辑。架构
持久层包含访问数据库层的代码,而数据库层是底层数据库技术,例如SQL Server、MongoDB。持久层是用于操做数据库的代码集:SQL语句、链接详情等。框架
当应用程序有一组核心职责和一组可互换的部件时,微内核模式(或插件模式)很是有用。微内核将提供应用程序的入口点和通常流程,而不须要真正了解不一样的插件在作什么。
例如任务调度,微内核能够包含全部的调度和触发逻辑,而插件负责特定的任务。只要插件遵循特定的API,微内核就能够出发它们,而不须要了解实现的细节。
另外一个例子是工做流。工做流的实现包含诸如不一样步骤的顺序、评估步骤的结果、决定下一步的内容等概念,步骤的的具体实现对于工做流的核心代码并不重要。
CQRS是Command and Query Responsibility Segregation的缩写。这种模式的核心概念是应用具备彻底分离的读取操做和写入操做,这也意味着用于写操做(命令)的模型和读取(查询)不一样。此外,数据将存储在不一样的位置。在关系数据库中,意味着将存在用于命令模型的表和用于读取模型的表。一些实现甚至将不一样的模型存储在彻底不一样的数据库中,例如用于命令模型的SQL Server和用于读取模型的MongoDB。
CQRS模式一般和事件溯源(Event Sourcing)结合,下一小节会讲到。
CQRS如何工做?当用户执行操做,应用会向命令服务器发送命令。命令服务从命令数据库中检索所需的任何数据,进行必要的操做并将其存储回数据库中,而后它通知读取服务,以便更新读取模型。以下所示:
当应用须要向用户显示数据时,它能够经过调用读取服务来检索读取模型,以下所示:
这种模式不会将模型的当前状态存储在数据库中,而是将时间存储其中。所以,例如customer name发生变化时,该值不会存储在“name“列中,咱们会存储一个”NameChanged“事件。
当咱们须要检索模型时,咱们将检索其存储的全部事件并在新对象上从新应用,即rehydrating an object。
用EXCEL记帐来理解event sourcing会容易一些。当咱们添加支出时,咱们不需更改总值,而是增长一“行”,出现错误,也增长一“行”,最终利用EXCEL的公式自动计算出总数,而这里计算总数能够看做是读取模型。
您能够看到咱们在添加Invoice 201805时发生了错误。咱们添加了两条新行,而不是更改行,首先是一行取消错误的行,而后是新的正确行。这就是event sourcing的工做方式。你永远不会删除事件,由于它们无能否认地发生在过去。为了纠正状况,咱们添加了新事件。
另外,请注意咱们是如何获取总值的,它是上面单元格中全部值的总和。在Excel中,它会自动更新,所以咱们能够说它与其余单元格同步。这就是一个读取模型。
Event sourcing一般会与CQRS同时使用,由于rehydrating an object可能会对性能产生影响,尤为是当实例中存在大量事件时。快速读取模型能够显着改善应用的响应时间。
编写一组微服务实际上就是编写能够协同的多个应用。每一个微服务都有本身独特的责任,团队能够独立于其余微服务开发它们。他们之间惟一的依赖是通讯。当微服务相互通讯时,咱们必须确保它们之间发送的消息保持backwards-compatible(向后兼容)。这须要一些协调,特别是当不一样的团队负责不一样的微服务时。
以下图所示——
在上图中,应用调用一个中央API,将调用转发给正确的微服务。在此示例中,有为用户配置文件、库存、订单和付款提供单独的服务。咱们能够想象这是一个用户订购应用。单独的微服务也能够相互调用。例如,支付服务能够在支付成功时通知订单服务。而后,订单服务能够调用库存服务来调整库存。
没有明确规定微服务有多大。在前面的示例中,用户配置文件服务可能负责用户的用户名和密码等数据,也可能负责家庭地址、头像图像、收藏夹等,也能够选择将全部这些责任分红更小的微服务。
各类软件架构模式不少时候会结合起来使用,他们之间并无咱们想象得那么水火难容。换句话说,没有万能的软件架构模式,如何选择取决于咱们对于解决方案利弊的权衡。
当下,已经有很大一部分公司完成了单体架构向微服务架构的迁移改造,并在疲于应对大量微服务间通讯问题时,开始考虑采用Service Mesh微服务架构做为服务与服务直接通讯的透明化管理框架,以插件式的方式实现各类业务所需的高级管理功能。
而开源PaaS Rainbond提供了开箱即用的Service Mesh微服务架构,部署在Rainbond上的应用原生便是Service Mesh微服务架构应用。