架构师最基本的素质,总结出两点,1是技术知识广度,2是业务行业深度。
1 架构师是技术领导。 架构师必须要有技术,而且还是领导。架构师要带领自己团队完成自己的任务,完全凭借自己的能力做事情,完全是匹夫之勇,根本不提倡。
2 架构师理解软件流程。 架构师必须了解软件流程,否则无法驱动整个团队前进,如果一个架构师不熟悉开发流程,无法协调产品线相关人员进行高效工作,也无法指导团队成员完成自己的工作。所以来说架构师一般不是空降兵(除非是全新的部门),因为空降兵一般不会熟悉新公司的开发流程,即使是同一个行业的,各个公司的差别还是很大。所以说听说某某去某某公司做首席架构师或者首席科学家,一般是高风险的事情,即使他对这个行业很了解。
3 架构师必须熟悉业务领域。 如果一个架构师不熟悉自己的行业,做的架构就是纸上谈兵,熟悉业务领域的架构师,才能很好的理解需求,做出合适的方案。互联网和网络安全是完全不同的两个方向,即使你熟悉里面的各种具体技术,但是以互联网的架构来做网络安全产品,肯定是100%的失败。
我做PKI的时候,项目最初的使用.net,使用微软的crytoAPI,开发的很顺利。后来来了一位新的架构师,觉得.net不能跨平台,决定?用java,做出产品后,发现找不到arm cpu的jdk,使用平台有限。再次决定使用openssl做,最后这个项目以失败而告终。后来我想过arm cpu都是嵌入式设备用的,根本没有任何嵌入式设备提供CA服务。
4 架构师必须要有广度的知识。 架构师考虑的问题必须全面,必须了解的要广,具体的细节可以不关注,因为细节变化很快。很多具体技术人员出身的架构师,只关注于具体的细节,某些方面做的很好,整体的性能很差。
下面这个项目的成功可以理解为一个笑话。某公司的两个部门都做c程序的,A部门做的平台使用的x86和mips,B部门使用平台是x86和 arm,后来A部门的一个模块要给B部门用,最后发现根本不能运行。最后A部门发现arm平台使用big endian模式,这样A部门的20多名员工,检查代码中所有非零整数,经过数个月苦战,才修改完毕。其实解决方法很简单,因B部门的代码也是首先在 x86做的,做的时候他们考虑了cpu的endian模式。这并不能说B部门架构师很牛,从另一个方面说他的无知。因为板子有跳线,专门切换cpu的是 big endian还是little endian,这样两个部门都可以不修改程序。
5 架构师必须是写程序的高手。
架构师一般都是?发人员出身,一般都是团队的核心。优秀的架构师应该了解团队使用各种技术,有了这些知识,才能和开发人软进行有效沟通。
有一个项目架构使用xml做配置,因为病毒库很庞大,最后导致xml 达30多兆,服务端的java程序使用dom 进行过滤的时候,30兆xml加载很慢,频繁出现out of memory。这个项目后来搁浅。根据以前的经验发现 msxml加载30多M的xml 不过几秒,而且msxml的xpath速度很快,后来专门为此写了JNI处理xml的。
6架构师是优秀的沟通人员。 架构师一定要会忽悠,至少要扯淡。架构师不但要指导本部门员工的工作,也要协调其他部门的资源,还要向用户收集需求,制定规格说明书,重要的把用户的不合理要求砍掉,合理需求遵循自己的思路
如下是在window win7旗舰版环境下使用mysql数据库的安装实录:
一)下载 activiti-5.6.zip(http://activiti.org/downloads/activiti-5.6.zip)
二)将activiti-5.6zip解压到指定目录,假设为“D:\activiti”,注意下面提到的路径均是相对于该路径而言
三)修改数据库类型为mysql
打开文件“setup\build.properties”修改db=mysql(默认为h2)。
四)配置mysql数据库
创建名称为activiti的空数据库,url要改为:“jdbc:mysql://localhost:3306/activiti?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true“,否则报编码错误,连接帐号设为activiti,密码也设为activiti。(如果不喜欢默认的连接配置,可以修改文件“setup\build.mysql.properties”中相应的属性值)
五)预下载一些必需的文件到“C:\downloads”
“D:\downloads”这个路径是在build.properties中通过属性“downloads.dir”定义的,也可以手动修改指定其他位置(默认值为:downloads.dir=../../downloads)。
如果确保网络环境很顺畅,这一步也可以不做,安装脚本会自动下载,由于之前的版本我安装时经常下载中断,导致文件损坏、安装异常,所以我习惯了先预先下载,保证安装顺畅点。主要下载如下2个文件,左侧为下载地址,右侧为下载后保存的文件名:
1) http://mirrors.enquira.co.uk/apache/apache-tomcat-6.0.29.zip –> apache-tomcat-6.0.29.zip (2.71MB)
若有tomcat可以不用下载,将tomcat复制到该目录下,如果tomcat的版本不是6.2.29则需要修改setup\build.properties文件中的tomcat.version=6.0.xx
修改为当前的tomcat版本
2) http://activiti.org/downloads/activiti-modeler-5.6.war –> activiti-modeler-5.6.war (31.8MB)
此war文件就是activiti演示的web程序war包必须下载。
3)为了改变演示安装里KickStart使用的数据库,产生一个新的activiti.cfg.jar,并将它放置到apps/apache-tomcat-6.x/webapps/activiti-kickstart/WEB-INF/lib文件夹。
4)将JDBC DRIVER JAR拷贝到setup\files\dependencies\libs中,并将类似libs.webapp.administrator的所有配置文件中如有对H2JAR引用的都增加对JDBC DRIVER JAR的引用
六)修改浏览器的可执行文件路径
打开文件“setup\build.xml”修改属性windows.browser的值为浏览器的启动文件对应的位置。如我一直使用chrome,配置如下:
<property name=”windows.browser” value=”C:/Documents and Settings/dragon/Local Settings/Application Data/Google/Chrome/Application/chrome.exe” />
修改这个的目的是方便下面的”ant demo.start”结束后自动打开浏览器访问相关演示模块的首页。
注:在我的win7下系统上,使用chrome浏览器配置成了C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe但是在demo.start启动后没有打开浏览器,配置成Firefox浏览器启动路径也没有生效,原因有待查明中。
七)检查一下你的电脑是否已经使用了tomcat服务
如果使用了tomcat服务,得停掉,否测会冲突。顺便检查一下8080端口有没有被占用,否测也会冲突导致安装失败。
八)安装ant1.7和jdk1.5+环境
主要是设置环境变量ANT_HOME和JAVA_HOME,并将%ANT_HOME%\bin、%JAVA_HOME%\bin设置到path环境变量中。
九)一切就绪后就可以开始体验了
命令行切换到“setup/”,运行”ant demo.start”,等待整个安装过程自动完成吧,安装完毕后默认会自动打开浏览器。若没有启动浏览器,需自己手动打开浏览器在地址栏中输入访问地址。
可访问web应用如下:
演示用户
用户Id |
密码 |
角色 |
Kermit |
Kermit |
管理员 |
gonzo |
gonzo |
经理 |
fozzid |
fozzid |
用户 |
十)新建一个流程并演示。
访问:http://localhost:8080/activiti-modeler/
访问后会看到左侧菜单栏中是当前workspace中自带的一些示例流程。
点击上方菜单new->Business process diagram菜单项,浏览器会打开activiti建模器
如图,此图中描述了一个编写每月财务报告—>审批财务报告的简单流程。(此处用自带的FinancialReportProcess流程做演示)
图中看到的是一个 none start event (左边的圆圈),其次是两个 user tasks: “撰写财务报告“和”批准财务报告“,以 none end event (右边边框加粗型的圆圈) 结束。
以用户fozzie(他是一个会计师)身份登录到Activiti Explorer(http://localhost:8080/activiti-explorer/),选择PROCESSES页签,在列表的Action列中点击流程“Monthly financial report’”的“Start Process”链接来启动一个流程实例。如下图所示:
由于我们是以用户fozzie登录,故在我们启动了这个流程实例后,可以看到一个新的候选任务。我们这是切换到TASKS页签页去看看这个新任务(如下图),可以发现就算其他人启动的流程实例,所有属于用户组accountancy的用户都可以看到这个新的候选任务。
领取任务:
通过Activiti Explorer界面点击claim按钮将执行相同的领取任务操作。现在这个任务将显示在任务领取者的个人任务列表中,领取任务后,可以在my tasks中查看并点击页面上的complete按钮提交。
现在注销掉fozzi用户并以kermit(他是管理者)用户登录,第二个任务现在就显示在待指定任务列表中了。Kermit用户和上一步的操作一样,可以对该任务进行领取和提交,至此,该流程就走完了。如下图所示:
我在安装使用过程中遇到如下一些问题:
1)activiti-modeler-5.6.war不会自动发布,导致访问不了
解决办法:自己将activiti-modeler-5.6.war手工解压到apps\apache-tomcat-6.0.29\webapps\activiti-modeler,并删除apps\apache-tomcat-6.0.29\webapps\activiti-modeler-5.6.war
2)tomcat控制台显示的中文乱码
解决办法:修改文件apps\apache-tomcat-6.0.29\conf\logging.properties,增加如下一行的配置:
java.util.logging.ConsoleHandler.encoding = GBK
3)使用activiti-modeler保存流程图前后台均会报错
解决办法:创建目录apps\apache-tomcat-6.0.29\endorsed,并将jar文件”apps\apache-tomcat-6.0.29\webapps\activiti-modeler\WEB-INF\lib\jaxb-api.jar”复制到该目录下。
4)第一次安装后,新建流程中出现中文会出错,网上找了下没有找到解决方法,我又重新安装了一遍,没有该问题了,目前尚不清楚是由何引起的。
安装eclipse designer插件:
需要eclipse版本为:Eclipse IDE for java EE developers(Helios Service)
打开Help->Install New software。在如下面板中,点击Add按钮,然后填写下列字段:
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
添加完成后,eclipse会搜索到BPMN designer插件,选中后,按提示操作完成即可。
由于是在线安装,插件可能偏大,我在安装的过程中等待了很长时间,大约半个小时,所以如果安装此插件请耐心等待。
安装完成后,重启eclipse, 导入activiti自带的examples,在src/main/process/路径下,随便找个后缀名为bpmn20.xml的文件打开,就可以看到该插件的效果了,如图:
终于安装完成了,总结一下,在安装过程中,遇到了或多或少的问题,发现activiti的用户数不是那么多,因为好多问题网络上都搜索不到解决办法,都得自己再钻研一下,很是痛苦,不知啊现在国内有那个项目用activiti5的成功经验是否可以拿出来分享一下。
在工作流管理系统中,通常是先给业务流程建模,利用流程设计器,将业务的办理过程用流程支持的节点方式表示出来。
业务建模之后,再确定每个节点上办理的业务,办理业务的过程,通常是以填写完业务表单的方式来完成的。所以需要分析每个节点上填写的表单内容,根据 表单内容建立业务表,表字段等。再将字段绑定到表单中录入控件上,将表单录入的数据保存到数据库中,这样业务表单模块就完成了。
业务表单完成之后,再挂接到流程节点上。
另外可能需要再次完善一下流程节点的一些属性,如增加每个节点的指定办理人。
设置取业务表中的一些关键值用于流程中,如取报销单中的报销金额,请假单的请假天数,用于流程上下文中做条件使用。
最后,在业务表中,需要增加一个流程实例id字段,用于和业务流程关联。在启动业务流程的时候,需要将获得的流程实例id写入这个字段中,使得业务记录能和流程实例关联上。
通过上面这些步骤,就建立好了业务流程了,可以启动流程实例,办理业务了。业务的流转就按照流程建模中定义好的顺序办理,不需要再在业务表 中增加状态字段来控制业务的流转了。业务的办理过程变得有迹可循了,每个流程实例均可以列出运行的轨迹图,或者列表出运行的轨迹。每个节点上办理的业务也 能通过查询业务表单再次展现。
上面我们说过,业务表是存储办理业务数据的数据库表,一般来说,一个业务表只用于一种业务流程中,存储同一类型的业务数据。当流程运行结束的时候, 这些业务数据就被封存,不能在流程的节点中再次被编辑和修改。(除非直接开库修改数据,或者另外做一些模块,直接修改业务数据)
但是,这些封存的业务数据,有可能会被再次启用投入到另外一个业务流程中去使用,这种需求可能是需求肯定是有应用场景的,不管是分段的处理过程还是后期又做的一些业务补充等,都有可能发生。
如果一个业务表,需要再次用于另外一个业务流程当中,则我们只需要给业务表,再增加一个流程实例id字段,就可以了,再次新启动的业务流程获得的流 程实例id就写入这个新的流程实例id字段。和以前的那个流程实例id不相关了。只是如果是编辑同一条业务记录的话,就可能把上次的数据给修改了。这样理 论上是可以支持n个业务流程。
总结一下,一个业务表用于一个业务流程中,用一个流程实例id字段和流程关联,用于另外一个业务流程中,则再建一个流程实例id字段和流程实例关联。
一个业务流程可能会涉及到多张业务表,一张业务表也可能涉及到多个业务流程。
现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框架的项目访问速度,明显不如原来采用了struts1框架的项目快,带着这些疑惑,我对各类MVC框架的做了一个简单的性能分析比较,其结果应该说是基本符合预期的,可供大家参考。
测试环境:
CPU:酷睿2 T5750,
内存:DDR2-667 2G,
Web容器:Tomcat6.0,最大线程数设置为1000,
操作系统:WinXP-sp3
测试步骤:
搭建6个Web工程,如下:
1.纯JSP:不包含任何MVC框架,只有一个测试用的JSP页面。
2.struts1:包含一个Action,不做任何逻辑处理,直接转发到一个JSP页面
3.struts2 JSP:不包含Action,只包含测试JSP页面,直接访问该页面。
4.struts2 单例Action:采用Spring来管理Struts2的Action实例,并配置成单例模式。
5.struts2 多例Action:采用Spring来管理Struts2的Action实例,并配置成单例模式。
6.SpringMVC3:采用Spring来管理Controller实例,包含一个Controller,不做逻辑处理,收到请求后,直接返回到一个JSP页面。
测试结果:
测试工程
|
请求数
|
并发数
|
总时间(s)
|
总时间(s)
|
总时间(s)
|
平均值(s)
|
Requests Per Second(每秒处理请求数)
|
JSP
|
2000
|
200
|
5.55
|
3.59
|
4.11
|
4.42
|
452.83
|
struts1
|
2000
|
200
|
6.77
|
3.83
|
7.00
|
5.86
|
341.03
|
struts2 JSP
|
2000
|
200
|
25.20
|
26.30
|
24.11
|
25.20
|
79.35
|
struts2 单例Action
|
2000
|
200
|
28.36
|
27.59
|
27.69
|
27.88
|
71.74
|
struts2 多例Action
|
2000
|
200
|
31.31
|
31.97
|
39.56
|
34.28
|
58.34
|
SpringMVC3
|
2000
|
200
|
7.16
|
7.50
|
4.27
|
6.31
|
317.09
|
说明:
以上测试虽不是非常的精确,但基本能说明一定的问题。每个JSP页面和Action都不包含任何的业务逻辑代码,只是请求转发。每轮测试取三次总时间的平均值。所有工程的测试均全部完成并正常处理请求,没有请求拒绝情况发生。
结论:
-
纯JSP的性能应该最高,这不难理解,JSP被编译成Servlet后,没有任何多余的功能,收到请求后直接处理。(这也验证一句经典的话:越原始效率就越高。)
-
struts1的性能是仅次于纯JSP的,由于struts1采用单例Action模式,且本身的封装相比struts2应该说简单很多,虽然开发效率不如struts2,但已经过多年的实践考验,性能稳定高效。
-
相比来说struts2的性能就比较差了,这不难理解,struts2之所以开发方便,是由于采用值栈、OGNL表达式、拦截器等技术对请求参数的映射和返回结果进行了处理,另外还采用大量的标签库等,这些都无疑增加了处理的时间。因此降低了效率。在我们实际的项目中,我测试本地工程访问每秒处理请求数只能达到35左右,应该说还有不少可优化的空间。
-
很多人认为struts2性能差是因为它的多例Action模式导致的,但我们采用spring管理struts2的Action,并设置按单例方式生成Action实例后,发现其性能有所提高,但并不是很明显。由此可见,多例Action模式并不是struts2性能瓶颈所在。另外,我们在struts2中采用JSP方式访问,发现其性能依旧和没有采用任何MVC框架的纯JSP之间存在好几倍的差距,这又从另一个侧面证实了我们刚才得出结论,struts2性能的瓶颈不在于它的多例Action模式。
-
SpringMVC3的性能略逊于struts1,但基本是同级别的,这让人眼前一亮,springMVC有着不比struts2差的开发效率和解耦度,但性能却是struts2的好几倍,这让我们灰常振奋,SpringMVC无疑又是项目开发的一个好的选择。