系统架构设计师-软件水平考试(高级)-论文-架构风格

系统架构设计师-论文-架构风格java

 

前言:算法

这三个月因为工做等方面的事情,因此没有更新博客。spring

其实我是有作许多总结的。可是写博客,就须要整理格式,好麻烦啊。。。。数据库

不过接下来,我会慢慢整理出来的,包括java,spring,数据库,业务架构等。缓存

四个月,经过工做之余的学习,今天终于将架构师的证书拿到手了。而后想到我能够将架构师的论文发上来。安全

 

首先谈谈架构师考试的论文通用问题,分别是素材(包括实践与理论),心态,技巧服务器

本人是不提倡押题的,可是素材的准备是必要的。素材包含两个部分,第一是挑一个你熟悉而且适合的项目。熟悉是指你要了解这个项目的功能,技术要点,开发背景等。而适合是指项目属于商业项目(不是什么图书管理系统那样的学习项目),而且便于在多个论文题目中使用(这个项目能够谈架构,也能够谈需求什么的)。第二是理论知识的充分准备。须要熟悉多个方面的论文理论知识,包括架构,需求,数据库等方面相关的理论储备。网络

论文准备最重要的是心态。由于题目是不固定的,每一年都有新鲜的技术考察,因此咱们须要稳定的心态,来不变应万变。拿我本身举个例子吧。我以前因为时间关系,实际写出来的论文,只写了三篇(固然我作了五篇论文的理论素材)。实际考试时,我发现没有我写过的论文。惟一能写出较为完整的论文理论的是微服务方面,因此我在慎重思考了两分钟后,我将原来有关架构风格的论文迅速转为微服务方面的论文,最后经过了考试。session

架构师考试的论文技巧,其实准确说是论文的格式,就像毕业论文也有其格式要求。说实话,论文若是有可能的话,最好仍是让专业的人批改一下。不管你是经过培训班,培训老师,又或者是让一些学员帮你提交,提交两篇论文,内心会有底气一些。论文技巧,就是内容的分布要合理。一篇论文通常会有三个论点,其中会有一个核心论点。另外两个论点每每分别一个段落便可,而核心论点每每须要五个段落(相关理论一段,中心要点一段,分要点三段)。除了这六个段落,正文还有背景介绍一段,总结一段。最后,别忘了还有一个摘要,摘要建议最后写。架构

通用方面主要就这三个方面,若是还有什么须要问的,能够@我。

 

架构方面的知识做为系统架构设计师的绝对核心,其知识点几乎占到整个架构师考试的一半。而架构方面的论文,能够说每一年都有,因此是必须准备的。

 

 

一,理论:

 

 

二,论文:

摘要:

本人于2015年11月参与浙江省某在线教育平台“外教一对一在线教育”项目,该项目为客户提供了一对一欧美外教视频教学,社交圈,公众直播等功能提供全方位的软件支撑,在该项目组中我担任系统架构师岗位,主要负责总体架构设计与中间件选型。本文以该教育平台为例,主要讨论了软件架构风格在该项目中的具体应用。整个系统采用具备三层的层次式软件架构的设计思想,分别是应用层,服务层,数据层。在应用层中的业务逻辑层的设计中,将整个业务系统划分为十余个子系统。服务层以dubbo服务框架为核心,数据采用了Mybatis框架。整个系统开发工做历时18个月。目前,该系统已经稳定运行近一年半的时间。实践证实,这种架构设计有效地下降了维护成本,提升了系统的开放性,可拓展性,可复用性和可移植性。

正文:

随着国家对教育对愈加重视,英语教育的市场份额逐步上升,其中用户口语提高的需求愈来愈大。为此,一些公司开始提供与外国人聊天的平台。我公司决定从国际通信领域进军口语教育领域。为了这项战略转变,公司于2015年11月设计在线教育平台系统(如下简称为“系统“)。该系统帮助人们与欧美外教进行面对面的口语交流与教学。其中随意聊提供了一个相似QQ视频通话,而正式课程还提供了H5互动课件以提升教学质量。与此同时,还有公众直播用于拉新,AI测试用于评测学员能力,下降成本。我参与了该项目的开发工做,担任系统架构设计师职务,主要负责设计系统架构。本项目组全体成员共9人,我主要负责项目计划制定,需求分析,总体架构设计与技术选型,以及底层设计。该项目的架构工做于次年2月完成,整个项目耗时18个月,于2017年5月完成。

在架构工做的开始阶段,咱们便意识到,架构风格定义了用于描述系统的术语表和一组指导构建系统的规则,是系统组织方式的惯用模式,能够为咱们的项目提供架构级的通用解决方案。这种架构级的软件重用能够极大提升咱们的系统建设进程。软件系统开发中经常使用的软件架构风格有数据流风格,调用/返回风格,独立构件风格,虚拟机风格,仓库风格。数据流风格包括批处理序列与管道-过滤器,其每一步处理都是独立,顺序执行的,适用于简单的线性流程。调用/返回风格包括主程序/子程序风格,面向对象风格,层次结构风格,其进一步下降系统耦合度,明确系统层次。独立构件风格包括进程通讯,事件驱动系统(隐式调用),其构件特色为软件重用提供了支持。虚拟机风格包括解释器风格,基于规则的系统风格,其具备良好灵活性,可自定义规则。仓库风格包括数据库系统风格,超文本系统风格,黑板系统风格,其以数据为中心。除此以外,还有dssa,soa等架构风格。

在了解需求后,咱们决定在公司技术顾问的建议下,采用层次架构风格。为了解决公司原通信系统代码冗余问题,咱们进行了系统服务化,中间层不一样的服务中心提供不一样的业务服务。最终,咱们将系统分为应用层,服务层,数据层。应用层负责具体业务和视图展现,如网站首页,app内搜索输入与结果展现等,其又分为视图层与业务逻辑层。服务层负责为应用层提供通用服务支持,如帐户管理服务,session管理服务等,其又细分为逻辑处理层与数据接口层。而数据层负责提供数据存储访问服务,如数据库服务,缓存服务,文件服务,搜索服务等。接下来,我将分层次详细介绍三层层次体系结构的设计过程。

首先是应用层。在应用层中,咱们将系统根据应用进行水平划分,这有助于代码管理与维护。咱们将系统分为课件管理系统,公众直播系统,学员测试系统,课程管理系统等十余个子系统,这里以课件管理系统为例。课件管理系统负责学员上课所用的课件,有课件编辑,课件预览,课件交互,课件展现等多个功能模块。功能模块调用服务层的服务支撑,如课件交互须要调用服务层由ActiveMQ实现的stomp通讯服务,经过该通讯服务,实现教师端与学生端的课件的同步,从而使得课件交互变得有趣,生动,具备互动性。另外一方面为了区别教师端与学生端的交互权限,课件模块还须要调用服务层的帐户服务,肯定用户身份,从而明确用户在课件交互中的交互权限。与此同时,为提升课件的可修改性,可互动性等,课件采用H5编写。应用层主要采用structs这一基于J2EE平台的MVC框架,主要经过Servlet与JSP技术实现。另外还有动静分离,动态资源静态化等,这里再也不赘述。

其次是服务层。服务层采用了dubbo服务框架等技术实现。随着服务器规模的扩大,开发人员的增多,每一个应用都变得复杂,臃肿,存在大量代码重复。为解决这个问题,提出了两个方案。一个是将应用拆分得更小,确保每一个应用都保持在一个合适的大小。好处是设计可以较快地完成,代码也较容易实现。这个方案存在一些问题,一方面数据库的链接数压力依旧存在,另外一方面,代码的冗余依旧存在。因此咱们采用了第二个方案-服务化方案。服务化方案,即应用层和数据层中增长一个服务层。首先从结构上来看,系统结构更为清晰明了,更为立体。稳定性上来看,许多散落的代码成为了通用服务,并交付专门的团队负责运维。出于对成本与技术成熟度的考虑,咱们采用了阿里研发的dubbo服务框架。在服务框架实际操做时有两个问题:服务框架自身的部署方式问题与实现服务框架所依赖的一些外部jar包与应用自身依赖的jar包之间的冲突。前者,咱们经过Tomcat做为Web容器,而服务框架做为容器的一部分。后者,咱们经过Java的ClassLoader将服务框架自身用的类与应用用的类进行隔离。除此以外,还有服务线程池隔离,分布请求合并,服务调用端的流控处理,异步服务调用,经过Future方式对远程服务调用的优化等问题,限于篇幅,再也不赘述。

最后是数据层。数据层涉及缓存,文件系统,数据库,数据通知服务,搜索系统等模块。因为用户对数据的访问具备集中性,因此咱们基于SpringCache与Redis实现了缓存机制。因为系统的业务特性,数据库每每是读操做远多于写操做,因此咱们对数据库进行了读写分离。数据访问方面,Java已经有不少成熟技术,大体分为三种。第一种是为用户提供专有API,这种方法便于实现功能,可是通用性较差。第二种是经过JDBC方式访问数据库,数据层自己做为一个JDBC的实现,也就是暴露出JDBC的接口给服务层。该方法成本很低,迁移成本也很是低,但开发成本相对高一些。第三种方式是基于ORM或类ORM接口的方式。咱们采用的就是这种方式,使用数据库时使用ORM框架-Mybatis框架,再将框架包装一层,用于实现数据层功能,对外暴露的仍然是Mybatis的接口。该方法开发高效,敏捷,成本较低,并且兼容性不错。此外,咱们采用solr做为数据层搜索引擎,数据访问层物理部署采用Proxy方式等。限于篇幅,不在赘述。

最终项目成功上线,正常运行了近一年半,收到各方好评。尤为是H5课件的良好互动性,使得大量业界同行争相模仿,改用H5制做课件。还有咱们的服务化方案架构被做为许多传统互联网企业系统重构的经典方案。在系统的架构设计中,咱们引入了层次架构的设计思想,有效地下降了维护成本,提升了系统的开放性,可扩展性,可重用性以及可移植性。固然仍是存在一些问题的。如H5课件采用http协议,易被非法劫持,嵌入广告,能够将协议修改成https来解决。还有咱们采用的负载均衡算法是加权轮转算法,过于简单,经常出现资源分配不合理的现象,能够将算法改成加权最小链接数算法来解决。这些都是我在从此的系统设计和开发中须要注意与改进的地方,也是往后我应该努力的方向。

 

 

三,总结:

这个论文的项目,其实我不是很熟悉。可是当时这个项目最好接触,体量也足够。囧。

可是整体的技术架构是没有太大问题的,技术点也是没有问题的。

最后的最后,说一个要点,不要抄论文,不要抄论文,不要抄论文。我之因此将个人这篇论文放上来,是为了令大家可以熟悉论文的结构(心疼我当初写论文的时候,网上找不到太多适合的相关博客)。

 

 

附录:


早期未修改的论文:

摘要:

本人于2015年11月参与浙江省某在线教育平台“外教一对一在线教育”项目,该项目为客户提供了一对一欧美外教面对面视频教学,以及相关的社交圈,外教公众直播等功能提供全方位的软件支撑,在该项目组中我担任系统架构师岗位,主要负责总体架构设计与中间件选型。本文以该教育平台为例,主要讨论了软件架构风格在该项目中的具体应用。整个系统采用具备四层的层次式软件架构的设计思想,分别是接入层,应用层,服务层,数据层。在应用层中的业务逻辑层的设计中,将整个业务系统划分为十余个子系统。子系统根据其环境与特色采用相同或不一样的架构。整个系统开发工做历时18个月。目前,该系统已经稳定运行近一年半的时间。实践证实,这种架构设计有效地下降了维护成本,提升了系统的开放性,可拓展性,可复用性和可移植性。

正文:

随着国家对教育对愈加重视,英语教育的市场份额逐步上升,其中用户口语提高的需求愈来愈大。为此,一些公司开始提供与外国人聊天的平台。我公司决定从国际通信领域进军口语教育领域。为了这项战略转变,公司于2015年11月设计在线教育平台系统(如下简称为“系统“)。该系统帮助人们能够与欧美外教进行面对面的口语交流与教学。其中随意聊提供了一个相似QQ视频通话,而正式课程还提供了H5互动课件以提升教学质量。与此同时,还有公众直播用于拉新,AI测试用于评测学员能力,下降成本。我参与了该项目的开发工做,担任系统架构设计师职务,主要负责设计系统架构。本项目组全体成员共9人,我主要负责总体架构设计与技术选型,以及底层设计。该项目的架构工做于次年2月完成,整个项目耗时18个月,于2017年5月完成。

在架构工做的开始阶段,咱们便意识到,架构风格定义了用于描述系统的术语表和一组指导构建系统的规则,是系统组织方式的惯用模式,能够为咱们的项目提供架构级的通用解决方案。这种架构级的软件重用能够极大提升咱们的系统建设进程。

了解需求后,咱们决定在公司技术顾问的建议下,采用层次架构风格。为了解决公司原通信系统代码冗余问题,咱们进行了系统服务化,中间层不一样的服务中心提供不一样的业务服务。最终,咱们将系统分为接入层,应用层,服务层,数据层。接入层负责应对PC端,移动端等的接入。应用层负责具体业务和视图展现,如网站首页,app内搜索输入与结果展现等,其又分为视图层与业务逻辑层。服务层负责为应用层提供通用服务支持,如帐户管理服务,session管理服务等,其又细分为逻辑处理层与数据接口层。而数据层负责提供数据存储访问服务,如数据库服务,缓存服务,文件服务,搜索服务等。

接入层采用了CDN,WAF,SLB等技术实现。因为系统核心是跨国一对一视频聊天,因此用户对网络延迟很是敏感。为此,咱们采用CDN技术。CDN经过全局负载技术将用户的访问指向距离最近的边缘服务器,由边缘服务器响应用户请求。这使得用户就近获取所需内容,下降网络拥塞,提升用户响应速度。为了防止来自DDOS等恶意网络攻击,咱们采用了WAF技术实现一系列针对HTTP/HTTPS的安全策略来保护咱们的Web应用。为了应对日益提升的数据吞吐量,系统扩展性,系统可用性,咱们采用了负载均衡技术。负载均衡技术的实现有多种手段,有经过硬件技术实现的F5,专业的负载均衡软件LVS,HAproxy等。通过讨论,以后出于对成本与技术成熟度等方面的考虑,咱们决定采用Nginx实现负载均衡。经过对Nginx中upstream模块的配置,实现了在多台服务器的反向代理加载负载均衡。而且要让配置生效,咱们不须要重启Nginx服务器,只须要reload配置便可。除此以外,还有API网关等问题,这里就再也不赘述了。

应用层中,咱们将系统根据应用进行水平划分,这有助于代码管理与维护。咱们将系统分为课件管理系统,公众直播系统,学员测试系统,课程管理系统等十余个子系统,这里以课件管理系统为例。课件管理系统负责学员上课所用的课件,有课件编辑,课件预览,课件交互,课件展现等多个功能模块。功能模块调用服务层的服务支撑,如课件交互须要调用服务层由ActiveMQ实现的stomp通讯服务,经过该通讯服务,实现教师端与学生端的课件的同步,从而使得课件交互变得有趣,生动,具备互动性。另外一方面为了区别教师端与学生端的交互权限,课件模块还须要调用服务层的帐户服务,肯定用户身份,从而明确用户在课件交互中的交互权限。与此同时,为提升课件的可修改性,可互动性等,课件采用H5编写。应用层主要采用structs这一基于J2EE平台的MVC框架,主要经过Servlet与JSP技术实现。另外还有动静分离,动态资源静态化等,这里再也不赘述。

服务层采用了dubbo服务框架等技术实现。随着服务器规模的扩大,开发人员的增多,每一个应用都变得复杂,臃肿,代码存在大量重复。为解决这个问题,提出了两个方案。一个是将应用拆分得更小,确保每一个应用都保持在一个合适的大小。好处是设计可以较快地完成,代码也较容易实现。这个方案存在一些问题,一方面数据库的链接数压力依旧存在,另外一方面,代码的冗余依旧存在。好比,在课件系统的交互应用与我的中心的计费应用都需调用帐户相关的功能,这就形成了代码的冗余。因此咱们采用了第二个方案-服务化方案。服务化方案,即应用层和数据层中增长一个服务层。首先从结构上来看,系统结构更为清晰明了,更为立体。稳定性上来看,许多散落的代码成为了通用服务,并交付专门的团队负责运维。一方面提升了代码质量,另外一方面因为核心模块,修改和发布的次数将减小,这也会提升稳定性。最后,底层资源统一由服务层管理,结构更为清晰,也更有利于提升效率。出于对成本与技术成熟度,以及技术支持的考虑,咱们采用了阿里研发的dubbo服务框架。在服务框架实际操做时有两个问题:服务框架自身的部署方式问题与实现服务框架所依赖的一些外部jar包与应用自身依赖的jar包之间的冲突。前者,咱们经过Tomcat做为Web容器,而服务框架做为容器的一部分。后者,咱们经过Java的ClassLoader将服务框架自身用的类与应用用的类进行隔离。为了提升服务层效率,咱们采用了不一样服务的线程池的隔离以及通布式环境中的请求合并。这有效下降了整个系统的负载,提升处理效率。除此以外,服务调用端的流控处理,异步服务调用,经过Future方式对远程服务调用的优化等问题,限于篇幅,再也不赘述。

数据层涉及缓存,文件系统,数据库,数据通知服务,搜索系统等模块。因为用户对数据的访问具备集中性,因此咱们基于SpringCache与Redis实现了缓存机制。因为系统的业务特性,数据库每每是读操做远多于写操做,因此咱们对数据库进行了读写分离。数据访问方面,Java已经有不少成熟技术,大体分为三种。第一种是为用户提供专有API,这种方法便于实现功能,可是通用性较差。第二种是经过JDBC方式访问数据库,数据层自己做为一个JDBC的实现,也就是暴露出JDBC的接口给服务层。该方法成本很低,迁移成本也很是低,但开发成本相对高一些。第三种方式是基于ORM或类ORM接口的方式。咱们采用的就是这种方式,使用数据库时使用ORM框架-Mybatis框架,再将框架包装一层,用于实现数据层功能,对外暴露的仍然是Mybatis的接口。该方法开发高效,敏捷,成本较低,并且兼容性不错。此外,咱们采用solr做为数据层搜索引擎,数据访问层物理部署采用Proxy方式等。限于篇幅,不在赘述。

最终项目成功上线,正常运行了近一年半,并受到业界争相模仿。在系统的架构设计中,咱们引入了层次架构的设计思想,有效地下降了维护成本,提升了系统的开放性,可扩展性,可重用性以及可移植性。固然仍是存在一些问题的。如H5课件采用http协议,易被ISP等劫持,嵌入广告,能够将协议修改成https来解决。