软件架构之我见

  在传统企业应用开发中,项目往往采用"烟囱式"开发模式,数据处理,业务逻辑以及界面操作糅杂在一起,快速推出一个可用版本,这本无可厚非。

  但是随着企业应用的发展以及移动互联网的推进,你会发现你的系统无法轻易对接其他厂家系统,也无法快速开发其他平台应用。面对这样的问题,我们不得不考虑架构的变更。而这一切其实都是可预见的或者说是可以提早规划的。

传统架构的问题

传统企业开发架构面对变化总是有诸多的不足:

1.许多模块都要重复造轮子

2.模块间的耦合过深

3.出现问题难以追溯

4.可测试性较差

5.系统间数据和服务无法共享

这样随着项目负责程度的增加必然会导致项目越来越冗余,越来越难以维护。

架构划分

  而在我看来,企业软件的开发应该分成服务和终端这两块。

  桌面应用,web程序,以及ios,android程序都可视为终端,作为终端我的任务就是展示数据,发起命令/请求,而并不关心其中有多少的业务逻辑和数据处理,我要的只是数据。

  而作为服务,我不关心你界面怎么布局,我需要的只是响应你的请求给你数据就行了。

  这样的一种架构我觉得能让前台和后台分开协同工作(谁说桌面程序就不能分前后台了),并且由于统一的业务逻辑可适用于多个终端。

可扩展性

  面向服务是一个解耦的过程,松耦合降低了服务之间的依赖。在大项目中为了保证大并发和高可用性,我们通常会将服务组组成一个集群或者将服务拆分为多个部分分开部署。

采用集群部署的模式,通过负载均衡的保持服务的可用性以及每一台服务器的性能(图示为简单架构图,也有采用主从机模式以及分布式数据库模式)

  采用服务拆分, 将服务拆分到多个服务器从而达到“分布式”的效果。对于web应用图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的甚至多个图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力。

缓存模式

  使用数据缓存在软件工程中是一个非常有意义的策略,不仅仅可以减少数据库负载,而且当数据缓存在内存中,能大大提高了的读取速度。

你可以在你的服务中加入内存缓存也可以将你的数据放到3方的高性能缓存中(memcached,radis等)。

而作为缓存你必须关注的几个方面:

1.这个数据缓存的Key是什么

2.这个数据缓存生命周期有多长

3.如何在外部服务中访问你的缓存

4.缓存数据的落地策略

5.分布式缓存的主从备份

等等,具体的缓存策略需要你结合项目考虑,个人比较推荐memcached,够用就行。

wcf,wcf restful,webservice,webapi?

  对于.NET系中这些技术何时使用的问题,上述技术都能做到解耦资源与服务,而采用哪种技术需要视乎你的应用场景。

  个人理解而言,对于企业内网应用来说我倾向于使用wcf tcp模式,效率高并且支持双工通信。

  而需要对接web和移动应用的时候优先推荐webapi,标准化http协议。之前也用过wcf rest来做手机应用,体验过web api之后感觉wcf还是太重了,webapi得心应手啊。

总结

  烟囱式的开发架构我觉得在开发项目原型或者小型项目时可以采用,但凡有可能涉及到web应用和手机应用或者有大并发可能的时候,你得该思考下整体项目的开发架构了。

以上为个人对自己项目的一些经验总结,理解不太深刻的地方欢迎大家指出。

时间: 2024-11-13 08:20:17

软件架构之我见的相关文章

软件架构设计系列总结

架构引用维基百科:软件体系结构是构建计算机软件实践的基础.与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础.从和目的.主题.材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟.一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计.软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作.逻辑和流程.软件

云和端之我见

顾名思义...云和端就是我们现在很流行讲的云计算.移动开发.大数据处理等.. 我们做IT的一般都要先了解这个架构.. 而对于架构这个东西,有可能是你要实现一些特定功能的软件架构,也可能是你想要实现特定系统功能的架构. 而我讨论的是云和端的架构. 首先,云可以理解是我们的服务器系统.或者b/s架构的server端,或者是提供后面处理的一些东西.我们可以在这种特定的服务器上加上你的一些软件环境,(硬件环境不讨论). 比如mysql数据库,KVM虚拟服务器等.还有磁盘阵列.然后我们可以开发相应的api

SoC嵌入式软件架构设计之四 :内存空间规划分配

本文继续阐述基于低端控制器CPU的SoC固件架构设计.第一节 SoC嵌入式软件架构设计之一:系统内存需求评估 讲述了系统内存需求的评估.这一节讲述内存空间的具体规划分配.CPU有两种体系结构:哈佛结构和冯诺依曼结构.哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如80251,代码空间与数据空间完全分开,独立编址:冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构,如MIPS,ARM等,其代码和数据空间是统一编址.这里就以冯诺依曼体系结构为例. 一.嵌入式系统软件分层

软件架构(一) 软件架构

本文主要阐述什么是软件架构.软件架构的重要性.什么时候软件架构尤其重要.什么是推定架构以及软件架构的三种使用方式. 1.什么是软件架构? 架构与详细设计 软件系统的设计由开发者的决策与意图组成.设计可以被划分为软件架构和详细设计. 专家们一致认同架构的主干,但是在细枝末节上却存在分歧,比如何时终止架构的设计而开始详细的设计. 在实践中,也很难将架构和详细设计区分开来. 卡内基·梅隆大学软件工程研究所(SEI)对软件架构的定义: 计算系统的软件架构时解释该系统所需的结构体的集合,其中包括:软件元素

[运维] 第一篇:数据中心运维模型之我见

从实际经验来看,每个企业的数据中心运维上都不会是十全十美的,因为毕竟企业业务发展是迅速的,对IT的要求相应也是也是越来越高,越来越复杂,所以无论是在运维团队架构上,还是在具体的管理层面上,尽管现实空间有限,但都有很多值得调整的空间和余地,且听我道来!         先看看这张运维模型,了解一下企业运维到底包括了那些东西:        企业运维包括了四象限:人员.管理.工具和业务.对于人员,通常企业有两种结构:一种是功能性驱动,比如机房维护团队.IT基础架构运维团队.应用维护团队等:另一种是管

软件架构设计的目的

软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割.但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的粒度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等, 耦合可以分为以下几种,它们之间的耦合度由高到低排列如下: (1) 内容耦合:一个模块直接访问另一模块的内容,则称这两个模块为内容耦合. 若在程序

AUCTeX+Emacs 是目前我见过的能最大限度提高 LaTeX 编辑效率的编辑器 (转)

AUCTeX+Emacs 是目前我见过的能最大限度提高 LaTeX 编辑效率的编辑器 效率的提高程度取决于你对 Emacs/lisp 的熟悉程度,但可以说基本上能提高到你所能想象的最大程度了.下面我会就效率方面介绍它的几个特性,不仅与 WinEdt 做对比,同时也和其他 OSX上的某些编辑器做一下对比, 安装和配置网上很多,比如这篇小文档[1],这里就不介绍了. 强大的快捷键系统 (CDLaTeX) 就提高编辑效率而言,快捷键是最重要的,同样的内容别的编辑要按10下键盘才能实现你就按5下就实现了

linux目录与文件关系之我见

Linux的文件系统存取之我见 学习linux中,受到此前用windows的习惯影响,经常会混淆linux文件的概念. 今天认真梳理了一下linux目录与文件的关系. Linux 文件系统不同于windows ,所有目录和文件都由 / 根目录而衍生. 文件的管理是由系统统一分发的一个唯一的inode号来进行管理的. Linux中,一切皆为文件,/ 目录也不例外,也是一个文件,文件的内容则是逻辑上在/ 目录下存着的目录以及文件的元信息[包括inode节点,文件名,大小,权限,所有者等等] 如下图所

驳《低俗文章之傻傻分不清楚的IC和ID卡》:ID和IC之我见

我很认真看完了<低俗文章之傻傻分不清楚的IC和ID卡>这篇文章:http://www.freebuf.com/articles/wireless/9451.html 我可以直接表明,我就是对你发表的关于RFID的几篇帖子口气很不爽,既然你这篇文章中间主题是就事论事,我也就事论事一番. 1.ID卡就是大家常常说的低频卡 2.其厚度较为厚,并且只是只读,只保存一串唯一身份识别序列号 3.ID卡不存在任何其他的数据 这三个是你总结的对方的观点,反观你的本篇文章,其中你用大段的话来描述,低频卡不全是I