题外话:本篇文章讲的是软件架构设计中的最后一章节,构件与中间件技术以及Web架构设计等内容。
一:构件与中间件技术
1、构建的定义:
定义1:软件构件是一种组装单元,它具有规范的接口规约和显式的语境依赖。软件构件可以被独立地部署并由第三方任意地组装。
定义2:构件是某系统中有价值的、几乎独立的并可替换的一个部分,它在良好定义的体系结构语境内满足某清晰的功能。
定义3:构件是一个独立发布的功能部分,可以通过其接口访问它的服务。
构件、对象、模块三者的区别如下图:
2、构件系统架构特性(概念)
构件系统架构特性就是基于构件的开发方法中的架构以及构件会有什么特性的存在。构件系统体系结构由一组平台决策、一组构件框架和构件框架之间的互操作设计组成。构件框架是一种专用的体系结构(通常围绕一些关键的机制),同时,也是一组固定地作用于构件层次机制的策略。
概念框架的互操作设计包括系统体系结构连接的所有框架间的互操作的规则。
构件是一组通常需要同时部署的原子构件.构件和原子构件之间的区别在于,大多数原子构件永远都不会被单独部署,尽管它们可以被单独部署。
一个原子构件是一个模块和一组资源.
模块是一组类和可能的非面向对象的结构体,比如过程或者函数.
资源是一个类型化的项的固定集合。
资源这个概念可以包含代码资源,进而包含模块。问题在于除了编译器编译一个模块或包生成的资源外,还可能存在其他的资源。在”纯对象”的方法中,资源是外部化的不可改变的对象一一不可改变是因为构件没有持久化的标志,而且复制不制度区分。
体系结构即为架构,体系结构是架构的书面表达。
3、构件的复用
构件的复用主要包括构件的检索与提取、理解与评价构件、修改构件、组装构件等几个环节。
(1)检索与提取构件
- 基于关键字的检索。系统在图形用户界面上将构件库的关键字树形结构直观地展示给用户,复用者通过对树形结构的逐级浏览,寻找需要的关键字并提取相应的构件。
- 刻面检索法。该方法基于刻面分类法,由三步构成,分别是构造查询、检索构件和对构件进行排序。这种方法的优点是它易于实现相似构件的查找,但复用者在构造查询时比较麻烦。
- 超文本检索法。复用者首先给出一个或数个关键字,系统在构件的说明文档中进行精确或模糊的语法匹配,匹配成功后,向复用者列出相应的构件说明,这种方法的优点是用户界面友好,但在某些情况下复用者难以在超文本浏览过程中正确选取构件。
(2)理解与评价相件
- 要复用构件,准确地理解构件至关重要。特别是对构件修改使用时。
- 为达到目的,必须要求相件的开发过程遵循公共标准。
- 一般构件库的文档中全面而准确地说明以下内容:构件的功能与行为、相关的领域知识、可适应性约束条件与例外情形、 可以预见的修改部分及修改方法。
(3)修改构件
- 理想状态是直接复用构件库中现成的构件,但大多数情况下,必须对构件进行或多或少的修改,以应对新需求。
- 为了减少构件修改的工作量,要求开发人员尽量使用构件的功能、行为和接口设计更为抽象化、通用化和参数化。这样,复用者即可通过对实参的选取来调整构件的功能或行为。如果这种调整仍不足以使构件适用于新系统,复用者就必须借助设计信息和文档来修改构件
- 构件库中若无可修改使用的构件,则按新需求开发构件,并存入构件库。
(4)组装构件
- 基于功能的组装技术。基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来.它要求库中的构件以子程序/过程/函数的形式出现,并且接口说明必须清晰。当使用这种组装技术进行软件开发时,开发人员首先要对新系统进行功能分解,将系统分解为强内聚、松耦合的功能模块;然后根据各模块的功能需求提取构件,进行适应性修改后,再挂接在上述功能分解框架中.
- 基于数据的组装技术。基于数据的组装技术首先根据当前软件问题的核心数据结构设计出一个框架,然后根据框架中各结点的需求提取构件并进行适应性修改,再将组件逐个分配至框架中的适当位置.此后,构件的组装方式仍然是传统的子程序调用与参数传递。这种组装技术也要求库中构件以程序形式出现,但它所依赖的软件设计方法不再是功能分解,而是面向数据的设计方法,例如, Jackson系统开发方法。
- 面向对象的组装技术。由于封装和继承特征,面向对象方法比其他软件开发方法更适合支持软件复用.在面向对象的软件开发方法中,如果从类库中检索出来的基类能够完全满足新系统的需求,则可以直接应用。否则,必须以基类为父类,生成相应的子类,以满足新系统的需求。
在构件组装阶段失配问题主要包括:
- 由构件引起的失配,包括由于系统对构件基础设施、构件控制模型和构件数据模型的假设存在冲突引起的失配;
- 由连接子引起的失配,包括由于系统对构件交互协议、连接子数据模型的假设存在冲突引起的失配;
- 由于系统成分对全局体系结构的假设存在冲突引起的失配等。要解决失配问题,首先需要检测出失配问题,并在此器出上通过适当的手段消除检测出的失配问题.
中间件在系统中所处于的位置如下图:
中间件是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同的技术之间共享资源。
- 负责客户机与服务器之间的连接和通信,以及客户机与应用层之间的高效率通信机制
- 提供应用层不同服务之间的互操作机制,以及应用层与数据库之间的连接和控制机制
- 提供多层架构的应用开发和运行的平台,以及应用开发框架,支持模块化的应用开发
- 屏蔽硬件、操作系统、网络和数据库的差异
- 提供应用的负载均衡和可用性、安全机制与管理功能,以及交易管理机制,保证交易的一致性
- 提供一组通用的服务去执行不同的功能,避免重复的工作和使应用之间可以协作
4、采用中间件技术的优点
- 面向需求。即设计师集中精力于业务逻辑本身.
- 业务的分隔和包容性。应用开发人员可以按照不同的业务进行功能的划分,体现为不同的接口或交互模式。
- 设计与实现隔离。构件对外发生作用或构件间的交互,都是通过接口进行的,构件使用者只需要知道构件的接口,而不必关心其内部实现,这是设计与实现分离的关键。
- 隔离复杂的系统资源.架构很重要的一个功能就是将系统资源与应用构件隔离,这是保证构件可复用甚至“即插即用”的基础,与中间件的意图也是一致的。
- 符合标准的交互模型.中间件则实现了架构的模型,实现了标准的协议.
- 软件复用.中间件提供了构件封装、交互规则、与环境的隔离等机制,这些都为软件复用提供了方便的解决方案.
- 提供对应用构件的管理。基于中间件的软件可以方便的进行管理,因为构件可以通过标识机制进行划分.
5、中间件技术- Corba (公共对象请求代理体系结构)
伺服对象( Servant ) : CORBA对象的真 实现,负责完成客户端请求。
对象适配器( Object Adapter ):用于屏蔽ORB内核的实现细节,为服务器对象的实现者提供抽象接口,以便他们使用ORB内部的某些功能。
对象请求代理( Object Request Broker ):解释调用并负责查找实现该请求的对象,将参数传给找到的对象,并调用方法返回结果.客户方不需要了解服务对象的位置、通信方式、实现、激活或机制。
corba 其实就是web service 体系的前一个体系,corba是构件标准当中的三大标准之一,还没有做到完全的统一化。
CORBA体系的主要内容包括以下几部分:
- 对象请求代理. ( Object Request Broker , ORB )。负责对象在分布环境中透明地收发请求和响应,它是构建分布对象应用、在异相或同构环境下实现应用间互操作的基础。
- 公共设施( Common Facilitites )。向终端用户提供一组共享服务接口,例如系统管理、组合文档和电子邮件。
- 应用接口( Application Interfaces )。由销售商提供的可控制其接口的产品,相应于传统的应用层表示,处于参考模型的最高层。
- 领域接口( Domain Interfaces )。为应用领域服务而提供的接口,如OMG组织为PDM系统制定的规范。
二:典型的应用架构
1、J2EE-分布式多层应用程序
Bean运行于EJB容器之中,共分三类:
- 会话Bean :描述了与客户端的一个短暂的会话。
- 实体Bean :持久化数据,0/R映射。
- 消息驱动Bean :会话Bean+JMS ,客户把消息发送给JMS 目的地,然后,JMS提供者和EJB容器协作, 把消息分发给消息驱动 Bean. 支持异步消息。
(1)J2EE-核心组成:
(2)J2EE-Java企业应用框架-SSH
- Struts是一个基于J2EE平台的MVC框架,主要采用Serviet JSP技术来实现,在Struts中, 自实现业务逻辑的JavaBean构成,由此tionServlet平日Action来实现, 由一组JSP文件构成.
- Spring 通过 RMI或Web Service远程访问业务逻辑,允许自由选择和组装各部分功能,还提供和其他软件集成的接口。Spring本身是个容器,管理构件的生命周期、构件的组态、依赖注入等,并可以控制构件在创建时是以原型或单例模式来创建。
- Hibernate是一个对象关系映射框架,提供了Java对象到数据库表之间的直接映射,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思维来操作数据库。在Hibernate 中, ORM机制的核心是一个XML文件,该文件描述了数据库模式是怎么与一组Java类绑定在一起的
(3)Web架构设计
- 从架构来看:MVC 、MVP、MVVM、REST、Webservice 、微服务。
- 从缓存来看:MemCache、Redis、Squid
- 从并发分流来看:集群(负载均衡)、 CDN
- 从数据库来看:主从库(主从复制)、内存数据库、反规范化技术、 NoSQL、分区(台表)技术,视图与物化视图。
- 从持久化来看:Hibernate、Mybatis。
- 从分布存储来看:Hadoop 、FastDFS 、区块链。
- 从数据编码看:XML、JSON.
- Web应用服务器来看:Apache、WebSphere、Weblogic 、Tomcat、JBOSS、IIS。
- 其他:静态化、高状态与无状态、响应式Web设计。
2、Web服务架构的演化
(1)单台服务器到数据库服务器与Web服务器相分离
(2)应用服务器集群
系统演变到这里,将会出现下面几个问题:
a、用户的请求由谁来转发到到具体的应用服务器
b、用户如果每次访问到的服务器不一样,那么如何维护session的一致性(在无状态的情况下,不考虑上下文。只考虑单次通信,不会出问题)。
在这其中就引入了负载均衡,其中就有状态与无状态问题
无状态服务( stateless service ):对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息。
有状态服务( stateful service ):则相反,它会在自身保存一些数据,先后的请求是有关联的。
(3)负载均衡的引入
负载均衡技术的分类:
- 基于特定软件的负载均衡( HTTP重走向) (应用层)
- 反向代理负载均衡(应用层)
- 基于DNS的负载均衡(传输层)
- 基于NAT的负载均衡(传输层)
- 混合型负载均衡
静态算法:轮转算法、加权轮转算法、源地址晗希散列算法、目标地址晗希散列算法、随机算法
动态算法:最小连接数算法、加权最小连接数算法、加权百分比算法
硬件负载均衡:FS
软件负载均衡:LVS Nginx HAproxy
a、应用层负载均衡
http重定向:HTTP重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群。特点:实现简单,但性能较差。
反向代理服务器。在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache , nginx都可以充当反向代理服务器.特点:部署简单,但代理服务器可能成为性能的瓶颈。
b、传输层负载均衡
DNS域名解析负载均衡。:DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时, DNS服务器直接给出负载均衡后的服务器IP。特点:效率比HTTP重定向高,减少维护负载均衡服务器成本。但一个应用服务器故障,不能及时通知DNS ,而且DNS负载均衡的控制权在域名服务商那里,网站无法做更多的改善和更强大的管理。
基于NAT的负载均衡:基于NAT的负载均衡将一个外部IP地址映射为多个IP地址,对每次求动态地转换为一个内部节点的地址。特点:技术较为成熟,一般在网关位置,可以通过硬件实现。像四层交换机一般就采用了这种技术.
(4)数据库读写分离化
(5)用缓存缓解读库的压力
(6)运用CDN(内容分发网络)
CDN的全称是Content Delivery Network ,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定.
CDN是在外部环境进行的系统优化,其余的几种都是针对服务器进行的优化。
3、XML与JSON
(1)扩展标记语言(Extensible Markup Language, XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML的优点:
- 格式统一,符合标准;
- 容易与其他系统进行远程交互 ,数据共享比较方便.
XML的缺点:
- XML文件庞大,文件格式复杂,传输占带宽;
- 服务器端和客户端都需要花费大量代码来解析XML ,导致服务器端和客户端代码变得异常复杂且不易维护;
- 客户端不同浏览器之间解析XML的方式不一样,需要重复编写很多代码
- 服务器端和客户端解析XML花费较多的资源和时间.
(2)JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.
JSON的优点:
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- 易于解析,客户端JavaScript可以简单的通过eval ()进行JSON数据的读取;
- 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl,PHP, thon, Ruby等服务器端语言,便于服务器端的解析;
- 因为JSON格式能直接为服务器端代码使用,大大简化 服务器端和客户端的代码开发量,且完成任务不变,并且易于维护.
JSON的缺点:
- 没有XML格式这么推广的深入人心和使用广泛,没有XML那么通用性,
4、Web应用服务器
5、缓存技术
6、REST (表述性状态传递)
REST ( Representational State Transfer ,表述性状态转移)是一种只使用HTTP XML进行基于Web通信的技术,可以降低开发的复杂性,提高系统的可伸缩性,
REST 的5个原则:
(1)网络上的所有事物都被抽象为资源.
(2)每个资源对应一个唯一的资源标识。
(3)通过通用用的连接件接口对资源进行操作.
(4)对资源的各种操作不会改变资源标识.
(5)所有的操作都是无状态的.
7、响应式Web设计
响应式WEB设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相应的布局。
方法与策略
( 1 )采用流式布局和弹性化设计:使用相对单位,设定百分比而非具体值的方式设置页面元素的大小.
( 2)响应式图片:不仅要同比的缩放图片,还要在小设备上降低图片自身的分辨率。