一、架构
架构的定义:
1. 运行时抽象
一个软件架构是一个软件系统在其操作的某个阶段的运行时(run-time)元素的抽象。一个系统可能由很多层抽象和很多个操作阶段组成,每个抽象和操作阶段都
有自己的软件架构。
软件架构的核心是抽象原则:通过封装来隐藏系统的一些细节,从而更好地识别和支持系统的属性
2. 元素
一个软件架构由一些架构元素(组件、连接器和数据)的配置来定义,这些元素之间的关系受到约束,以获得想要得到的一组架构属性。
3. 组件
一个组件是软件指令和内部状态的一个抽象单元,通过其接口提供对于数据的转换。
转换的例子包括从二级存储将数据加载到内存、执行一些运算、转换为另外一种格式、使用其他数据来封装等等
4. 连接器
一个连接器是对于组件之间的通讯、协调或者合作进行仲裁的一种抽象机制。
连接器的例子包括共享的表述、远程过程调用、消息传递协议和数据流。
5. 数据
一个数据是组件通过一个连接器接收或发送的信息元素。
6. 配置
一个配置是在系统的运行期间组件、连接器和数据之间的架构关系的结构。
组件——计算的所在地;连接器——定义组件之间的交互;配置——相互交互的组件和连接器的集合。
7. 属性
软件架构的架构属性集合包括了对组件、连接器和数据的选择和排列所导致的所有属性。
例如:进化的相对容易程度、组件的可重用性、效率、动态扩展能力;
8. 风格
一种架构风格是一组协作的架构约束,这些约束限制了架构元素的角色和功能,以及在任何一个遵循该风格的架构中允许存在的元素之间的关系。
9. 基于网络 vs. 分布式
基于网络的架构(network-based architectures)与软件架构(software architectures)的主要区别通常是:组件之间的通信仅限于消息传递(message passing)或者消息传递的等价物; 分布式系统在用户看来像是普通的集中式系统,但是运行在多个独立的CPU之上。相反,基于网络的系统有能力跨越网络运转,但是这一点无需表达为对用户透明的方式。 在某些情况下,还希望用户知道一个需要网络请求的动作和一个在他们的本地系统就能满足的动作之间的差别,尤其是当使用网络意味着额外的处理成本的时候
Rest架构的风格:
1. 客户-服务器;2.无状态;3.缓存;4.统一接口(统一接口的交互方式及数据传输方式);5.分层系统;
Rest的数据:
一种表现形式为默认返回HTML,而如果请求其它,则会返回HTML的转化版即json或XML;
二、架构师的作用
1. 一个组织中为何需要架构师
架构师通常承担的职责:
团队中的代码高手:
负责核心代码的编写以及代码疑难问题的解决
进行复杂度分解的人员:
对需求进行架构设计,以满足如下要求:
确保完成系统的各项功能
如果是多个系统或功能模块,要对多个系统或功能模块的交互进行设计,以尽量降低藕合性来实现降低系统复杂度的目的;
对系统的功能进行难度的划分,抽取出功能中通用且难度较大的部分,使用框架或自己实现;
对系统进行业务功能的复用性划分,抽取出业务功能中可复用的逻辑,抽取进行公共实现;
系统风格的定义,即规定系统的风格来使代码具有最大的自解释性,通常可以用规范以及代码的形式;
对系统的未来可预见的扩展性进行设计;
解决环境问题:
解决系统相关的中间件及环境问题:
如HTTP服务器环境,LDAP服务器环境,J2EE服务器环境,数据库环境,操作系统环境,网络环境等;
2. 开源框架的作用
一些开源的框架或JAR包,主要是为了解决功能通用且难度较大的部分而生的,即把大多数项目中都会碰到的难度较大的通用功能进行实现,以直接被使用;
当然,因为大多数项目的功能要求可能又有所差异,为了保持最大限度的通用和可扩展性,所有框架都有着复杂的参数配置和接口职能划分;
其中,参数配置主要是为了通用性,即满足大部分的不同的常见需求;而接口则是为了可扩展性以及降低复杂度;
如常见的SSH框架,工作流框架,VIEW层框架等都是为了解决这些问题而生的;
即常用的软件功能分解方式决定了常用的框架实现的功能,而软件功能的分解方式则决定于业务功能;
故架构师的职责就是根据业务功能进行最合理的分解,并根据分解的结果选择最合适的框架,以避免重复造轮子的问题;
当然,在实际工作中,因为用来解决问题的框架本身也会带来复杂性,故架构师的作用就包括解决框架本身使用的复杂性;
通常有两种方式:1.对框架进行合理的封装,降低使用的复杂性;2.使用常用的框架,降低学习成本;一般情况下,是二者通用的;
3. SPRING框架的功能和解决的问题:
1. 控制反转I/O,即由SPRING框架来产生Bean,而非由程序来产生Bean:
消除不同功能模块的藕合性,从而实现最大的可扩展性,即使用哪种技术,则加载哪种技术的框架;
降低系统的大小和复杂度,即需要解决哪些问题,则加载哪些组件,而非无论解决多少问题,都加载所有组件;
2. 面向切面AOP,基于I/O,通过在生成Bean时在相关方法中加入公共操作来实现:
进行自定义范围的日志记录
进行自定义范围的事务控制
进行自定义范围的异常处理
进行自定义范围的其它公共操作
3. 广泛使用
因:
SPRING提供多种方式来适用于多种情况, 如适用于WEB的WebApplicationContext以及适用于非WEB的FileSystemXmlApplicationContext的BeanFactory,
适用于XML,注解情况的配置定义方式;
适用于File,InputStream,URL,ClassPath等多种的资源输入方式;
SPRING实现了常用框架的实现类,故可使用SPRING来进行整合常用大众框架;如Hibernate,JDBC,IBATIS等;
SPRING实现了大多数的常用独立功能,可供SPRING进行直接整合,如邮件发送,LDAP访问等;
果:
大部分程序员都了解该框架,故学习成本低,降低了其自身的复杂性;
大多数的框架都提供了对SPRING框架的支持,即实现了供SPRING框架使用的接口类,故可使用SPRING直接整合该框架;如JBPM,STRUTS等;
4. STRUTS2框架的功能和解决的问题:
STRUTS2本身相当于Control层框架以及半个VIEW层框架,其VIEW层的作用主要是通过标签来实现的;
1. 自动转向功能
通过定义的配置,来实现对URL匹配对应的Action及方法的功能;
2. AOP功能
通过拦截器机制来实现对所有Action的AOP功能;
3. 封装HttpRequest,HttpResponse,session请求参数功能
可通过ApplicationContext来获取对应参数;
4. POJO类,解藕HttpServlet
HttpServlet的参数通过ApplicationContext来获取,或者通过自动填充机制来获取;
5. 后台校验功能
通过书写校验文件来实现后台的校验;
6. 自定义标签
通过一些自定义的STRUTS2标签,提供了比J2EE标签更多的便利和灵活性;
其国际化标签+国际化的程序实现了VIEW层的国际化;
7. 国际化
如上,通过标签+国际化文件的加载解析程序+拦截器,实现了VIEW层数据的国际化;
8. 自动填充及组装机制
将请求的参数自动组装成对应的Model或者填充入对应的Action中;
9. 支持更多View框架
通过使用filter的转向结合View框架的servlet拦截功能实现;
5. Hibernate框架的功能和解决的问题
Hibernate框架即ORM框架,用于解决对象的持久化问题,使用对象的方式或HQL的方式来持久化而非SQL方式来持久化,以及事务的自动管理;
减少了对应的工作量,也减少了因使用SQL时调用不同类型数据库的函数而导致的程序藕合数据库的情况;
通过Cache,理论上可减少数据库的访问次数,从这个角度上看,理论上可提升性能;
提供的锁机制,来处理并发,当然,该机制也可程序自己实现;
但并不会减少开发的难度,因为用Hibernate的程序员不可能不懂SQL,而Hibernate的复杂度则高于直接使用JDBC的复杂度;
1. 对象与关系数据库映射ORM
可使用对象的操作方式来实现ORM,需解决对象与表及表字段与对象的相互转换,及对象的一对多,多对多的关联更新问题,对象的集合类的功能;
其瞬时,持久,脱管三态来解决对象何时与数据库表相对应的问题,当然,也带来了一定的误操作的风险;
通过session来实现增删改查的一级缓存;
通过二级缓存来改善性能;
2. 事务的管理
一般来说,是通过spring来进行事务的管理,而非自行管理
3. 一些自动插件来实现 表到配置文件和实体类,以及实体类到表的转换;
6. LDAP VS 数据库
1. 数据库支持事务回滚,大量的函数,以及更多的数据类型,针对大量的插入更新操作;
LDAP只在简单的ALL OR NOTHING,函数很少,数据类型主要为字符型,主要针对的是大量的读操作;
2. 数据库的访问需要为不同的数据库开发不同的JDBC驱动;
而LDAP是跨平台和标准的协议,故驱动可用于各种不同的LDAP服务器;
3. 数据库通常为关系数据库,其每条记录的每个属性只能有一个值;
LDAP更像是层次关系,其每个记录的每个属性可以有多个值;
架构的定义:
1. 运行时抽象
一个软件架构是一个软件系统在其操作的某个阶段的运行时(run-time)元素的抽象。一个系统可能由很多层抽象和很多个操作阶段组成,每个抽象和操作阶段都
有自己的软件架构。
软件架构的核心是抽象原则:通过封装来隐藏系统的一些细节,从而更好地识别和支持系统的属性
2. 元素
一个软件架构由一些架构元素(组件、连接器和数据)的配置来定义,这些元素之间的关系受到约束,以获得想要得到的一组架构属性。
3. 组件
一个组件是软件指令和内部状态的一个抽象单元,通过其接口提供对于数据的转换。
转换的例子包括从二级存储将数据加载到内存、执行一些运算、转换为另外一种格式、使用其他数据来封装等等
4. 连接器
一个连接器是对于组件之间的通讯、协调或者合作进行仲裁的一种抽象机制。
连接器的例子包括共享的表述、远程过程调用、消息传递协议和数据流。
5. 数据
一个数据是组件通过一个连接器接收或发送的信息元素。
6. 配置
一个配置是在系统的运行期间组件、连接器和数据之间的架构关系的结构。
组件——计算的所在地;连接器——定义组件之间的交互;配置——相互交互的组件和连接器的集合。
7. 属性
软件架构的架构属性集合包括了对组件、连接器和数据的选择和排列所导致的所有属性。
例如:进化的相对容易程度、组件的可重用性、效率、动态扩展能力;
8. 风格
一种架构风格是一组协作的架构约束,这些约束限制了架构元素的角色和功能,以及在任何一个遵循该风格的架构中允许存在的元素之间的关系。
9. 基于网络 vs. 分布式
基于网络的架构(network-based architectures)与软件架构(software architectures)的主要区别通常是:组件之间的通信仅限于消息传递(message passing)或者消息传递的等价物; 分布式系统在用户看来像是普通的集中式系统,但是运行在多个独立的CPU之上。相反,基于网络的系统有能力跨越网络运转,但是这一点无需表达为对用户透明的方式。 在某些情况下,还希望用户知道一个需要网络请求的动作和一个在他们的本地系统就能满足的动作之间的差别,尤其是当使用网络意味着额外的处理成本的时候
Rest架构的风格:
1. 客户-服务器;2.无状态;3.缓存;4.统一接口(统一接口的交互方式及数据传输方式);5.分层系统;
Rest的数据:
一种表现形式为默认返回HTML,而如果请求其它,则会返回HTML的转化版即json或XML;
二、架构师的作用
1. 一个组织中为何需要架构师
架构师通常承担的职责:
团队中的代码高手:
负责核心代码的编写以及代码疑难问题的解决
进行复杂度分解的人员:
对需求进行架构设计,以满足如下要求:
确保完成系统的各项功能
如果是多个系统或功能模块,要对多个系统或功能模块的交互进行设计,以尽量降低藕合性来实现降低系统复杂度的目的;
对系统的功能进行难度的划分,抽取出功能中通用且难度较大的部分,使用框架或自己实现;
对系统进行业务功能的复用性划分,抽取出业务功能中可复用的逻辑,抽取进行公共实现;
系统风格的定义,即规定系统的风格来使代码具有最大的自解释性,通常可以用规范以及代码的形式;
对系统的未来可预见的扩展性进行设计;
解决环境问题:
解决系统相关的中间件及环境问题:
如HTTP服务器环境,LDAP服务器环境,J2EE服务器环境,数据库环境,操作系统环境,网络环境等;
2. 开源框架的作用
一些开源的框架或JAR包,主要是为了解决功能通用且难度较大的部分而生的,即把大多数项目中都会碰到的难度较大的通用功能进行实现,以直接被使用;
当然,因为大多数项目的功能要求可能又有所差异,为了保持最大限度的通用和可扩展性,所有框架都有着复杂的参数配置和接口职能划分;
其中,参数配置主要是为了通用性,即满足大部分的不同的常见需求;而接口则是为了可扩展性以及降低复杂度;
如常见的SSH框架,工作流框架,VIEW层框架等都是为了解决这些问题而生的;
即常用的软件功能分解方式决定了常用的框架实现的功能,而软件功能的分解方式则决定于业务功能;
故架构师的职责就是根据业务功能进行最合理的分解,并根据分解的结果选择最合适的框架,以避免重复造轮子的问题;
当然,在实际工作中,因为用来解决问题的框架本身也会带来复杂性,故架构师的作用就包括解决框架本身使用的复杂性;
通常有两种方式:1.对框架进行合理的封装,降低使用的复杂性;2.使用常用的框架,降低学习成本;一般情况下,是二者通用的;
3. SPRING框架的功能和解决的问题:
1. 控制反转I/O,即由SPRING框架来产生Bean,而非由程序来产生Bean:
消除不同功能模块的藕合性,从而实现最大的可扩展性,即使用哪种技术,则加载哪种技术的框架;
降低系统的大小和复杂度,即需要解决哪些问题,则加载哪些组件,而非无论解决多少问题,都加载所有组件;
2. 面向切面AOP,基于I/O,通过在生成Bean时在相关方法中加入公共操作来实现:
进行自定义范围的日志记录
进行自定义范围的事务控制
进行自定义范围的异常处理
进行自定义范围的其它公共操作
3. 广泛使用
因:
SPRING提供多种方式来适用于多种情况, 如适用于WEB的WebApplicationContext以及适用于非WEB的FileSystemXmlApplicationContext的BeanFactory,
适用于XML,注解情况的配置定义方式;
适用于File,InputStream,URL,ClassPath等多种的资源输入方式;
SPRING实现了常用框架的实现类,故可使用SPRING来进行整合常用大众框架;如Hibernate,JDBC,IBATIS等;
SPRING实现了大多数的常用独立功能,可供SPRING进行直接整合,如邮件发送,LDAP访问等;
果:
大部分程序员都了解该框架,故学习成本低,降低了其自身的复杂性;
大多数的框架都提供了对SPRING框架的支持,即实现了供SPRING框架使用的接口类,故可使用SPRING直接整合该框架;如JBPM,STRUTS等;
4. STRUTS2框架的功能和解决的问题:
STRUTS2本身相当于Control层框架以及半个VIEW层框架,其VIEW层的作用主要是通过标签来实现的;
1. 自动转向功能
通过定义的配置,来实现对URL匹配对应的Action及方法的功能;
2. AOP功能
通过拦截器机制来实现对所有Action的AOP功能;
3. 封装HttpRequest,HttpResponse,session请求参数功能
可通过ApplicationContext来获取对应参数;
4. POJO类,解藕HttpServlet
HttpServlet的参数通过ApplicationContext来获取,或者通过自动填充机制来获取;
5. 后台校验功能
通过书写校验文件来实现后台的校验;
6. 自定义标签
通过一些自定义的STRUTS2标签,提供了比J2EE标签更多的便利和灵活性;
其国际化标签+国际化的程序实现了VIEW层的国际化;
7. 国际化
如上,通过标签+国际化文件的加载解析程序+拦截器,实现了VIEW层数据的国际化;
8. 自动填充及组装机制
将请求的参数自动组装成对应的Model或者填充入对应的Action中;
9. 支持更多View框架
通过使用filter的转向结合View框架的servlet拦截功能实现;
5. Hibernate框架的功能和解决的问题
Hibernate框架即ORM框架,用于解决对象的持久化问题,使用对象的方式或HQL的方式来持久化而非SQL方式来持久化,以及事务的自动管理;
减少了对应的工作量,也减少了因使用SQL时调用不同类型数据库的函数而导致的程序藕合数据库的情况;
通过Cache,理论上可减少数据库的访问次数,从这个角度上看,理论上可提升性能;
提供的锁机制,来处理并发,当然,该机制也可程序自己实现;
但并不会减少开发的难度,因为用Hibernate的程序员不可能不懂SQL,而Hibernate的复杂度则高于直接使用JDBC的复杂度;
1. 对象与关系数据库映射ORM
可使用对象的操作方式来实现ORM,需解决对象与表及表字段与对象的相互转换,及对象的一对多,多对多的关联更新问题,对象的集合类的功能;
其瞬时,持久,脱管三态来解决对象何时与数据库表相对应的问题,当然,也带来了一定的误操作的风险;
通过session来实现增删改查的一级缓存;
通过二级缓存来改善性能;
2. 事务的管理
一般来说,是通过spring来进行事务的管理,而非自行管理
3. 一些自动插件来实现 表到配置文件和实体类,以及实体类到表的转换;
6. LDAP VS 数据库
1. 数据库支持事务回滚,大量的函数,以及更多的数据类型,针对大量的插入更新操作;
LDAP只在简单的ALL OR NOTHING,函数很少,数据类型主要为字符型,主要针对的是大量的读操作;
2. 数据库的访问需要为不同的数据库开发不同的JDBC驱动;
而LDAP是跨平台和标准的协议,故驱动可用于各种不同的LDAP服务器;
3. 数据库通常为关系数据库,其每条记录的每个属性只能有一个值;
LDAP更像是层次关系,其每个记录的每个属性可以有多个值;