Software Architecture Pattern(Mark Richards)笔记
软件架构模式
缺少规范架构的程序通常会变得紧耦合、脆弱、难以更改,缺少清晰的发展方向和愿景。这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设计、架构、模式的人。当然,此书也只是高层的讨论,能够起到归纳总结、理顺思路的作用。如果想实际应用,还是需要从代码入手,站在架构模式的角度分析优秀的项目源码。
分层架构(Layered/N-tier Architecture)
分层架构的组件按垂直模式组织成多层,每一层表现为程序的一种角色。分层架构大概是最普遍的架构了,写过java web的人大概都规规范范地写过那什么dao、service、controller之类的包,每一层都是围绕一种功能的抽象,各负其责,有利于系统开发、测试、管理和维护。分层架构图如下:
一般来说,请求从上到下,下一层为上一层提供服务。这样做得好处是起到了解耦和封装的好处。然而有时候我们确实需要跨层访问,于是乎可以做一些退步,让某些层open。当然,这也是对结构的一种破坏。这种架构的一种典型反模式是,在某一层中只用少量的逻辑就到了下一层。解决办法是使用二八定律,如果大约20%的请求很简单的穿过该层,80%还是有些必要的逻辑,那么还是可以接受的,如果差距得大的话就得考虑将该层改为open。分层架构虽然简单但很实用,很多优秀的程序都多多少少用到这种模式。
事件驱动架构(Event-Driven Architecture)
事件驱动架构是使用高解耦、单一用途的事件处理组件来异步接收和处理事件的架构。事件驱动也是十分流行的架构,特别是在分布式、异步系统中。这种架构模式有两种拓扑结构,mediator和broker。mediator结构通常用在需要对一个事件组合多个步骤处理的情况,通过一个中心mediator来实现。broker结构通常用在需要将事件串在一起,并不通过中心化的mediator的情况。
Mediator结构
如下为mediator结构:
mediator结构包括4类组件:event queues, event mediator,event channels和event processors。事件首先到达event queue,通过event mediator接收的事件称为init event,然后经过编排组合,生成process event并异步地发送到event channels中。event processors将从event channels中取出事件并进行响应。event queue组件可以是消息队列、web服务端点等。需要注意的是,event mediator并不执行业务逻辑来编排process event,它只是知道处理init event的步骤,然后将每一步的执行事件异步发送到event channels。event mediator通常使用开源工具来实现(Spring Integration、Apache Camel或Mule ESB等)。event processor通常只处理单一的业务逻辑,并相互独立。
Broker结构
如下为broker结构:
broker结构与mediator结构的不同之处是没有event mediator组件。消息像一条链一样通过轻量级的message broker被分发。当你需要简单的事件处理流程,而不想使用事件编排中心的话,这是一个很好的选择。该结构包含两类主要组件:broker和event processors。broker包含了所有的event channels。与mediator结构不同,事件被一个event processor处理后会重新发布一个新的事件给broker,然后其他感兴趣的processor就会进行处理。
事件驱动模型由于其天然的异步性,是一种相对复杂的模式。由于其异步性,很难保证事务的原子性。如果你的业务逻辑中很少有原子性的事务则可以选择它。除此之外,事件驱动架构的代码编写、维护、管理都相对困难。尽管事件驱动有如此多麻烦问题(编程要求高),但是其异步特性和事件处理的机制是很多程序的首选。
微内核架构(Microkernel Architecture)
微内核架构又称为插件架构,它能够像添加插件一样添加系统特性。想想众多IDE可以安装插件就知道它的好用了。图示如下:
它包含两类组件:core system和plug-in components。core system包含程序的最小化、最基本的系统功能。plug-in component是独立的插件,用来扩充系统功能的。core system需要知道如何获取到plug-in,并知道如何使用它们,一类通用的方式是一种plug-in注册表的方式,其中包含plug-in的基本信息,如何控制,数据格式等等。core system和plug-in component之间要有某种contract,这样core system就不要编写特定的代码来适配。
微内核架构可以作为一种嵌入式的或者说作为其他架构模式一部分的架构模式,如果你不能一次性实现整个系统架构,那么微内核架构模式可以作为你的设计的一部分。
微服务架构(Microservices Architecture)
微服务体系结构的每个组件都可以作为一个单独的单元进行部署,允许通过有效且精简的交付管道更容易地进行部署。微服务架构由于其实用性,成为代替单体架构、面向服务架构的选择,并获得了广泛的关注。图示如下:
service component包含了一到多个模块来实现单一的功能,设计service component的粒度是设计微服务架构的挑战之一。微服务将应用分离成多个部署单元,使每一个单元都可以单独开发、部署、测试等,极大提高了开发效率、可测试性、可维护性等,可能这也是众厂商追捧的原因。微服务是由面向服务(SOA)发展而来的,但是相比之下微服务通过简化服务概念、减少服务编排需求、简化服务接入等方法让其更轻量。作者根据3种不同的使用场景又将微服务划分为API REST-based topology、application REST-based topology、centralized messaging topology三种结构。但是总体架构还是上图的样子。
基于空间的架构(Space-Based Architecture)
基于空间的架构模式也叫云架构模式(cloud architecture pattern),是设计用来解决扩展性和并发性问题的。在互联网应用中,可以简单分为web server、application server和database server三类,请求从前到后经过三类服务器,当流量剧增时,三类服务器都可能遇到瓶颈,特别是database,最难扩展,且决定了并发量。此模式性通过去掉中心化database server,使用可复制的内存数据网格来实现高扩展性。程序数据都存储在内存中,在活动的process units中相互复制。process units可以在流量激增时动态启动来应对高负荷。架构图如下:
这种模式有两类主要组件:process unit和virtula Middleware。process unit中包含了应用程序的组件,小的web应用可能将所有内容塞到一个unit中,大的web应用可能将功能分开部署到不同的unit中。通常来说,process unit中包含了应用组件、内存数据网格和用于失效备援的异步的持久化存储组件。同时也包括一个复制引擎(replication engine)被virtual middleware使用来与其他unit交换数据。virtual middleware用于管理和通讯,包括了数据同步和请求处理的相关组件,有messaging grid、data grid、process grid和deploy manager。这些组件可以自己编码实现,也可以购买三方产品。
- messaging grid:管理输入请求和会话(session)信息。该组件决定请求分发到那个unit中。
- data grid:此模式中最重要且起决定性作用的组件。当数据更新时,该组件与unit中的replication engine交互。由于messaging grid可能将请求分发到任意一个unit中,所以unit中的数据必须时一致的,在实际中,数据的交互是并行的异步的,并且速度非常快(当然,即便很快,也需要解决一致性问题)。
- processing grid:如果unit是中存放了程序的一部分内容,那么由该组件来选择转发到不同类型的unit。
deployment manager:管理unit的动态启动和关闭,该组件监视流量情况,动态执行操作。该组件是实现可变扩展性的决定性组件。
总结
最后,是一个架构模型的总结表,在程序设计中可以根据实际需求来选择不同的软件架构模式。
Software Architecture Pattern(Mark Richards)笔记的更多相关文章
- Agile software architecture design document style..( sketches and no UMLs)
http://www.infoq.com/articles/agile-software-architecture-sketches-NoUML If you're working in an agi ...
- [Architecture Pattern] Factory Builder
[Architecture Pattern] Factory Builder 目的 同时提供延迟注入对象.挂载注入项目这两个功能 情景 在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Fac ...
- [Architecture Pattern] Singleton Locator
[Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrast ...
- [Architecture Pattern] Repository实作查询功能
[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...
- Architecture pattern & Architecture style
Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...
- Software Architecture
Software Architecture Architecture serves as a blueprint for a system. It provides an abstraction to ...
- Software Architecture软件架构(方法、模式与框架)纵横谈
Software Architecture软件架构是啥 随着软件行业的发展,软件的规模越来越大,"Software Architecture软件架构"这个名词开始频繁出现.&quo ...
- Architecture Pattern: Publish-subscribe Pattern
1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Role Publisher: ...
- Design Pattern Explained 读书笔记二——设计模式序言
设计模式的由来: 20 世纪 90 年代初,一些聪明的开发者偶然接触到 Alexander(Christopher Alexander 的建筑师) 有关模式的工作.他们非常想知道,在建筑学成立的理论, ...
随机推荐
- Python之算法基础
1>递归相关: 递归:递归算法是一种直接或间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且 易于 ...
- 基于SSH的网上购物商城系统-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 基于WEB的网上购物系统主要功能包括:前台用户登录退出.注册.在线购物.修改个人信息.后台商品管理等等.本系 ...
- docker+selenium grid解决node执行经常卡死
执行用例时出现下图: 可以在启动node节点容器时添加如下红色字体的参数 docker run -d -p 5903:5900 --shm-size=512m --link selenium_hub: ...
- Python【变量】
本文介绍 1.Python运算符 运算符分类 运算符分为:算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 一.算数运算:返回数字 假设变量a=10,b=20 运算符: + 相加a+ ...
- SCVMM 安装
1.所有的物理机必须在域环境下 2.安装VMM和SQL使用的域账号尽量相同,并且唯一,尽量与管理hyper v主机使用的账号不相同
- 阿里云PolarDB及其共享存储PolarFS技术实现分析(上)
PolarDB是阿里云基于MySQL推出的云原生数据库(Cloud Native Database)产品,通过将数据库中计算和存储分离,多个计算节点访问同一份存储数据的方式来解决目前MySQL数据库存 ...
- docker安装与基本配置
Docker有很多种安装的选择,我们推荐您在Ubuntu下面安装,因为docker是在Ubuntu下面开发的,安装包测试比较充分,可以保证软件包的可用性.Mac, windows和其他的一些linux ...
- Android 用 res 中文件名获取资源 id 的方法
res 中我们可能会放很多图片和音频视频等.它们放在 R.drawable, R.raw 下面. 有一种情况是,比如我有一个数据库保存项目中声音的一些信息.声音的 id 就很难保存.因为我们不能把 R ...
- CentOS7-Minimal1708安装设置python3
使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下,切换到该目录下执行 ll ...
- opencv学习笔记(七)---图像金字塔
图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...