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 的建筑师) 有关模式的工作.他们非常想知道,在建筑学成立的理论, ...
随机推荐
- JVM 方法调用之静态分派
分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派.这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合.本章讲静态分派. ...
- asp.net——地址栏传递中文参数乱码解决方案
地址栏传递中文参数乱码解决方案: 很多人在使用地址栏传递参数的时候都会遇到一个麻烦的问题(参数为中文时乱码了),那要怎么解决呢? 其实解决这个问题也不怎么难,无非就是给要传递的中文参数一个编码解码的过 ...
- Word页面去除下划线(Office 2017)实现
后面就不用说了吧设置边框无
- Python【数据类型】
本文介绍 1.什么是数据类型 2.Number类型 3.字符串类型 4.布尔类型 一.什么是数据类型 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又 ...
- codeVS 动态最大子段和
题目链接:戳我 对于最大子段和,我们只需要维护四个变量--maxl,maxr,maxs,sum(分别表示区间最大前缀子段和,区间最大后缀子段和,区间最大子段和,区间所有数的和) 然后合并的时候是这样的 ...
- [NOI2010]能量采集(莫比乌斯反演)
题面: bzoj luogu NOI2010能量采集 题解 读完题之后我们发现在每个产生贡献的点\((x1,y1)\)中,它与原点之间的点\((x2,y2)\)都满足\(x2|x1\),\(y2|y1 ...
- [译文]casperjs 的API-casper模块
Casper class: 可以通过这个模块的create()方法来获取这个模块的一个实例,这是最容易的: var casper = require('casper').create(); 我们也可以 ...
- PHP中SimpleXMLElement对象字符编码
最近在使用SimpleXMLElement来生成和解析XML. 由于我们使用PHP开发的这边使用UTF-8编码,而对方使用GBK编码,因此就遇到了中文字符编码问题. 后来发现,XML内部的编码与其头 ...
- 最短路 CF954D Fight Against Traffic
CF954D Fight Against Traffic 题意描述: 给你一张无向图,一共有n个点(2 <= n <= 1000),由m条边连接起来(1 <= m <= 100 ...
- vue-cli起的webpack项目 用localhost可以访问,但是切换到ip就不可以访问
我用的是vux起的一个项目(移动端,基于vue的),因为是移动端的,需要在手机上测试,发现用http://localhost:8081/访问的挺好的,但是换到ip就访问不了,期初我以为是代理的原因,将 ...