论坛首页 Java企业应用论坛

Web Services开发体会和项目教训

浏览 100331 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-04-26  
slaser 写道
关于客户端为何一定要选择.net?
我们现在就是在ecplise的RCP下面构筑应用,这样我们的通讯就走HttpInvoker就可以了,不用去搞WSDL,开发效率和运行效率都得到提升。.net客户端坐出来的效果是会好些,开发效率也稍微高点,eclipse里面ve虽然差点,总归实现好了拖拉功能,也差不到哪里去。
我觉得这个项目里面选择.net作为客户端通过ws和java服务器段通讯是个错误的选择。


你说的客户端是用Java开发吧,从技术的角度也许可行,我们的现实情况是:
1、会用Java的人非常少,就几个。
2、客户端工作量非常大,大约有18个模块,估计至少有10w行代码。
3、客户端的用户很多来自中小城市的企业主管,他们有些人连防火墙的概念都不知道,很多用户的电脑染上病毒的惟一解决办法是格式化硬盘。
4、上网部分是modem,高级的可能有ADSL。

我们是在这种条件下做选择的。我们有一个非常苛刻的原则:怎么让这些电脑盲正确、熟练使用我们的系统。遗憾的是,当初并没有太多考虑这些,导致后来的不可收拾。

不过“选择.net作为客户端通过ws和java服务器段通讯是个错误的选择”,一定程度上我还是认同。



0 请登录后投票
   发表时间:2007-04-26  
某些地方还不如直接就走http好了,Key-Value,全String
0 请登录后投票
   发表时间:2007-04-27  
比较同意slaser的观点,这种情况下确实ws不太适合,可以考虑使用ejb了,c/s客户端用java实现也是个不错的选择。
0 请登录后投票
   发表时间:2007-04-27  
引用

不过“选择.net作为客户端通过ws和java服务器段通讯是个错误的选择”,一定程度上我还是认同。

我现在做的项目架构也经过了很长时间的选型。你们遇到的技术上的问题很多我也遇到过。
最早我们也是采用.net客户端+java服务器段通过ws来通讯,问题如下:
1.发布webservice服务的复杂性.
    java服务器段我们用xfire来发布服务,最早传递一般pojo还可以忍受,因为xfire可以自动产生WSDL,但是对于一些复杂的bean,涉及到继承和多态关系的一组对象的传输时,自动生成机制似乎就哦排不上用场了,就需要手写WSDL(可能是我xfire还没吃透).相对来说,如果是java2java的引用,我完全可以不用webservice,而用rmi,httpinvoker来替代,如果采用.net,ws的应用就是必须付出的代价。

2.java类库和.net类库的不匹配。
    我在对象中使用java.util.List等java中常见对象时,.net客户端怎么识别?需要服务器段一个encoder,客户端一个decoder,还只能传数据,不能传方法。有人说我就用ws里面的基本内型,那没问题,可是这个对于类设计造成了极大限制。所以这样使用必然出现一个dto层。dto层我个人感觉极大降低开发效率,当然还有个好处,就是可以避免hibernate的lazy loading问题。

使用java客户端直接解决以上2点问题。所以我们最后还是决定用eclipse rcp作为客户端。

lazy loading的问题这个在什么客户端里面都可能遇到,dto确实可以解决这个问题,不过dto带来了开发效率的大幅降低。目前我感觉解决的最好方案在sdo上,dto要是一个动态对象,简单点说就像一个Map一样再2端传数据,而不是pojo。
0 请登录后投票
   发表时间:2007-04-27  
slaser 写道
引用

不过“选择.net作为客户端通过ws和java服务器段通讯是个错误的选择”,一定程度上我还是认同。

我现在做的项目架构也经过了很长时间的选型。你们遇到的技术上的问题很多我也遇到过。
最早我们也是采用.net客户端+java服务器段通过ws来通讯,问题如下:
1.发布webservice服务的复杂性.
    java服务器段我们用xfire来发布服务,最早传递一般pojo还可以忍受,因为xfire可以自动产生WSDL,但是对于一些复杂的bean,涉及到继承和多态关系的一组对象的传输时,自动生成机制似乎就哦排不上用场了,就需要手写WSDL(可能是我xfire还没吃透).相对来说,如果是java2java的引用,我完全可以不用webservice,而用rmi,httpinvoker来替代,如果采用.net,ws的应用就是必须付出的代价。

2.java类库和.net类库的不匹配。
    我在对象中使用java.util.List等java中常见对象时,.net客户端怎么识别?需要服务器段一个encoder,客户端一个decoder,还只能传数据,不能传方法。有人说我就用ws里面的基本内型,那没问题,可是这个对于类设计造成了极大限制。所以这样使用必然出现一个dto层。dto层我个人感觉极大降低开发效率,当然还有个好处,就是可以避免hibernate的lazy loading问题。

使用java客户端直接解决以上2点问题。所以我们最后还是决定用eclipse rcp作为客户端。

lazy loading的问题这个在什么客户端里面都可能遇到,dto确实可以解决这个问题,不过dto带来了开发效率的大幅降低。目前我感觉解决的最好方案在sdo上,dto要是一个动态对象,简单点说就像一个Map一样再2端传数据,而不是pojo。
确实,你遇到的问题,我们是这样解决的.
1.集合类库不兼容,使用对象数组.
2.xfire的功能其实很强大.并没发现它不能序列化复杂类型的情况,另外,
夸网络传输,还是用简单类型比较好.
3..NET本身在反序列化对象的时候有层次限制,并且他反序列化过来会加些有BUG的代码.这点非常令人恼火.
WS本来就是用来解决不同平台间通信的方案之一.
可以用相同平台的情况下,能不用WS就不用.
HOHO~~
0 请登录后投票
   发表时间:2007-04-27  
题目应该改成采用ibm产品和解决方案的ws开发体会和项目教训

因为WS的实现方式有很多种 也包括rest模式的WS.

我这里也在用WS开发系统 效率高于php asp. 具体细节以后再谈.

只想强调几点
1 数据库必需采用xmldb才有灵活性

2 开发框架必需适合直接对xml进行处理
 
0 请登录后投票
   发表时间:2007-04-27  
xml编码解码确实是慢,不过这也和具体类库有关系。
就拿最常用的dom4j+xerces来说吧,写个最简单的测试:10线程并发每线程解析1000次xml,用jprofiler看那一个字就叫红。
当然这也不是没有解决办法,楼主用的是什么?
0 请登录后投票
   发表时间:2007-04-27  
zwchen 写道
zwchen 写道
JavaVision 写道
rtdb 写道
这样的文章好,很有实用价值,尤其是项目教训部分。

不过, 1500W竟然是这样做出来的,
大概我在文章中说过,我们整个系统包括很多子系统,像CMS、OA、IM、BO等,用Web Services的这个子系统应该算一个MIS系统,只是一个模块,大概分量是30%。
其实,做项目不是我们软件工程书籍写的那么理想,譬如政治因素啊,虽然我们开始用RUP,但实际上更多的是瀑布开发,开发模式也不是我们可以决定的,和客户很大关系,他就认需求说明书,设计文档,分阶段付款,你该如何?而且,做大项目,技术有时候只是影响成败的一个因素,也许还不是最关键的。
一个成功的项目,我认为最高的评价标准是:客户的满意度。而不是你用了什么先进技术(我就要一个很简单实用的,别把流程弄得这么复杂),你节省了多少时间(再延期两个月可以,你把我们提出的一些新要求给搞定吧,ok?),等等.....
我认为,对于用到Web Services这个子系统,从 技术角度来说,当初的架构有些是合理的,只是太过复杂,再加上项目组成员整体实力比较薄弱,所以会导致后来的系统不稳定(bug多)。要说性能这块,Web Services和使用不当的Hibernate是系统慢的罪魁祸首。但这种异构分布式,除了Web Services,我还真的想不出有更简单的解决方案。也许,选择C/S本身就是不对的,只是我们一直这样固执的走了下去。
如果从过程和方法学的角度考虑,我认为需求不明确、缺乏及时与客户沟通是最大的问题。

后者我认为要摆在第一位。
我想看了这个帖子后,可能有人能想到更好的点子,不妨分享一下。BTW:从全局分析。

我发这个帖子,也希望对大家有点帮助,不要再犯我们的错误啊!


我对WS不熟,不过对老兄说的“我认为需求不明确、缺乏及时与客户沟通是最大的问题。”深以为然
0 请登录后投票
   发表时间:2007-04-27  
我也做过这样的项目,也是去年开发了一年!采用的架构方式也和楼主一样!其实我觉得更多的是我们没有把握业务,Hibernate滥用的结果!不过调试还是比较好的,特别是我们java端的!你试过SOAPUI这个工具没?
0 请登录后投票
   发表时间:2007-04-27  
楼主辛苦,大厂商可恨,我只能这么说。

上一拨是EJB的白老鼠,这一拨是WebService的白老鼠,下一拨不知道还有什么白老鼠,为什么我们总要做白老鼠?

为什么我们总是这么热衷新技术?
为什么我们总是相信大厂商?
为什么总是大厂商吃肉我们喝汤?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics