锁定老帖子 主题:免费ERP第二锤:架构简单就好
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-05
最后修改:2011-01-06
上一锤提到了刚发布的免费ERP系统(www.2bizbox.com)后,大家反响很热烈,短短3天就被下载了2万多次,服务器一度宕机,呵呵。大家讨论也比较热烈,纷纷提出不少问题和技术探讨,感觉非常有意义。这次和大家分享一下关于这个免费ERP的架构设计。之前先回答一下大家比较关心的一些问题:
还是来说说架构。先看这个图就都明白了。
提到架构,我们用到的第三方的框架不是很多,总的原则就是尽量简单、稳固。这样,就会高效、好维护。这远比一些乌七八糟的所谓新思想新技术更加重要,毕竟我们的软件要维护几十年的(实际上已经从DOS到现在开发了20年了)。后台主要是JBoss和Hibernate,其他大部分部分都是自己封装。前台则基于Swing以及自己封装的各种组件。中间通讯也没有采用第三方的框架,而是自己封装,主要采用HTTP协议,对交换的VO(包括VO集合)对象(如参数、返回值、Exception等)进行标准的Java二进制序列化、zip压缩、传输。调用的方法通过一个统一的invoke进行传递,被调用的模块、方法名、参数等,都被封装在一个POJO中传给后台。后台Façade层解压后,根据具体模块,通过反射的方法,调用Local的各个模块EJB,执行具体函数。每个函数先在Biz业务层进行业务逻辑分解处理,例如,如果要添加一个零件,要分解很多具体动作,先检查零件号是否重复,再检查零件号是否格式合法,数据是否完备,创建零件库存初始信息、创建物料添加日志、通知相关人员…等等。分解后,形成具体的DAO操作,然后交给DAO进行调用相应的底层API完成。无数的DAO对各个业务数据进行各种数据级别的操作封装(增删改查等),然后通过Hibernate层进入数据库。
有朋友喜欢用Eclipse RCP来作为前台框架。坦白说,我个人对SWT一向不喜欢,也不看好,因为他本质上和AWT的路线没什么不同,只是后台老板从SUN换成了IBM。当初以“好看+效率高”的旗号,SWT曾经风靡一时,人人趋之若鹜。不过本质上说,SWT这种技术是打着“好看/速度快”幌子分裂JAVA的政治游戏,我们程序员应当看清楚。当然不是说SWT技术不好不能做企业应用,实际上我认识的一些朋友已经用SWT搭建了好大好大的应用。不过SWT毕竟不是JAVA的官方技术。如果相信JAVA的未来的话,我觉着应当相信SWING才是正道。SWING有不足,但是它会不停的发展。另外,千万别总拿“丑”和“慢”来攻击Swing,说到底还是看你会不会用,吐口水实在无意+无聊。说道RCP框架,我倒更喜欢NetBeans。不过国内大家还是把Netbeans当做IDE来用,实际上这个RCP平台相当不简单,质量很高而且国外应用很多,已经非常成熟,有空可以多看看Netbeans的Platform频道(不是IDE哦)。
HttpInvoker没有用过,不知是不是和Spring绑的比较死,看上去和我们的通讯方式完全类似。其实java序列化再传输就是几行代码的事情,如果不用Spring等框架,完全没必要用第三方的,自己封装一下就好了。看看这个代码就知道了:
/** * Here should be the unique access of FacadeWrapper.invoke! */ public static Object invokeImpl(ServerAction action) throws ServerActionException { action = new ServerAction(action.getModuleName(), action.getMethod(), escapedStringParamsConvertor(action.getParams()), paramsTypeConvertor(action.getParamTypes())); action.setOrderBy(getOrderBy()); try { Object result = FacadeWrapper.getInstance().invoke(action); //unzip, if need. if (result instanceof ZippedByteArray) { ZippedByteArray zippedData = (ZippedByteArray) result; if (zippedData.getByteArray() != null) { try { result = BB2Util.unzipObject(zippedData.getByteArray()); } catch (Exception ex) { throw new ServerActionException(ex); } } } return result; } catch (Exception ex) { ExceptionWorker worker = new ExceptionWorker(ex); //... throw new ServerActionException(ex, anotherServer); } } Hessian基于WS还可以支持不同的客户端,也很不错。不过我们这种需求不大,没有使用WS以及其他客户端技术的需求,也没有采用。还是觉着简单的东西自己封装更加的灵活和容易控制。我们的思路是尽量少的引进第三方的框架。过多的异构框架导致的稳定性和灵活性的代价也是很大的。
其他一些类似MQ之类的异步框架就更比较谨慎使用。前后台调用需要实时性,肯定是同步调用为主。异步的情况不多,即使有,在基于HTTP的结构下(例如只开放80端口)也比较难实现。我们采用了JBOSS的JMS机制,实现一些后台主动发送业务消息、上传图纸等功能。当然如果后台禁止了相应端口,客户端就自动放弃JMS连接,工作在纯“主动模式”下,相当于一个“浏览器”。
对于非桌面客户端,例如手机、数据采集器、PDA等,我们在后台的Façade层上面再包装一个又一个简单的“协议适配”就行了,也就是把Java的对象简单的封装到XML或HTML,负责与这类终端通讯。这样,身后的安全啊、日志啊、业务啊等就完全复用,开发速度是很快的。对于大多手机,使用XHTML进行浏览即可;对于iPhone等则开发native的终端,对于PDA和数据采集器,由于有条形码、收料发料、盘点等复杂应用,所以用本地的环境进行创建GUI(一般都是Windows CE,可用C#进行)。这样,我们的架构可以简单快速的支持各种不同的终端接入:
有朋友担心一个Servlet提供所有API太变态,其实不必担心。没错,我们的模块API至少上万,但是这个后台的Façade Servlet其实只有不超过10个方法。最主要的一个是invoke,方法都是通过一个对象封装了模块、方法名、参数序列等来通过反射机制完成的,所以,无论后台模块API有多少,只要通过这一个唯一的业务入口出入就行了。至于前台使用不太方便的问题,可以通过前台再次封装展开来解决。 最后在透漏一下这套免费ERP的下一步进度:目前正在紧张汉化工作,预计在本月内会发布全中文版本。Linux打包文件也在进行中,有望很快可以下载。其他还有很多很好的模块,会陆续推出,期待大家支持和反馈。如果你身边有人在研究或选型ERP,不放推荐一下这个全免费的、高质量的、专注机械制造业的大型ERP:2BizBox。
套用一句刘仪伟的说法:现在谁还花钱用ERP啊?!
最后送Swing界面:设置会计年度
风信子长到第十天,没有换水。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-05
一起要几锤呀?哈哈。暂时未涉及到erp,先关注一下。
|
|
返回顶楼 | |
发表时间:2011-01-05
小中华 真是牛人,不知道毕业于哪所学校???
|
|
返回顶楼 | |
发表时间:2011-01-06
很期待后面几锤,可惜实力不济,只能望洋兴叹啦
|
|
返回顶楼 | |
发表时间:2011-01-06
严重支持一下。
还有个问题:如何做到系统平滑升级? |
|
返回顶楼 | |
发表时间:2011-01-06
楼主说的很有道理,简单,有效就好了,做java开发的很多都给框架蒙了。
|
|
返回顶楼 | |
发表时间:2011-01-06
现实告诉我们,即使做java的,还得分windows版和linux版
请教楼主一个问题,你们用ejb是什么道理?是做事务管理吗? |
|
返回顶楼 | |
发表时间:2011-01-06
问个题外话,这个打包的安装文件是用什么工具生成,能否说说使用方法
|
|
返回顶楼 | |
发表时间:2011-01-06
一、“不过SWT毕竟不是JAVA的官方技术。如果相信JAVA的未来的话,我觉着应当相信SWING才是正道。”
二、“SWING有不足,但是它会不停的发展。另外,千万别总拿“丑”和“慢”来攻击Swing,说到底还是看你会不会用,吐口水实在无意+无聊” 关于第一点,SWT虽然不是JAVA官方技术,但在当时来说确实比Swing好用。 关于第二点,SWING是会发展,但“会不会用”和好不好用没关系。一个产品好不好用是大部分用户来验证。我想我们应该更多谈论产品,而不是谈论人。、 楼主的架构有点杂,不简单。可否提示下有个中心。 |
|
返回顶楼 | |
发表时间:2011-01-06
终于开始分析系统的底层架构实现方面了,真好
|
|
返回顶楼 | |