nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0

B/S,C/S架构混合使用

Posted on 2008-05-06 12:43 寒武纪 阅读(13053) 评论(25)  编辑  收藏 所属分类: 软件架构

    一般而言,我们平常接触的大多数项目都应该是单纯使用B/S或是C/S,除非在特殊场合,否则比较少混合使用B/S,C/S架构。首先说一下对这二种架构特点的一些个人理解。B/S应该是目前很多项目都应用的架构,浏览器的方式使得用户的使用十分方便,用户可以何时何地通过Internet访问URL而进行相应的工作,升级维护也能比较集中,缺点就是浏览器的表现能力受限以及常常受非议的安全性问题,如果软件的应用范围区域不集中,而且用户经常变换地点进行访问,那么这种架构是非常适合的。C/S架构的C端有非常强的处理能力,所以在交互表现和安全方面可以做得比浏览器强,但是缺点也是非常明显的,安装部署、升级维护、版本兼容都是比较头大的事情,一般的适用场景是集中的办公室场所,用户使用范围相对稳定,以及一些对业务处理非常复杂的场合,为了降低服务器的负荷,同样需要C模式的支持。
    以前接触过的电信领域,就有过混合架构的软件。但是都是非常宠大,一直都对其实现方案比较感兴趣,但是都没有机会进一步了解。最近搜索了一下相关的资料,总结一下混合应用的一些想法(只针对Java方向)。
    ①混合架构的问题集中点。服务端共享,客户端采用不同的表现方式,共享的应该是业务层接口,持久层应该是屏蔽的。应用层的消息传递就是整个应用的关键所在,虽然像Jakarta提供的httpClient这种模仿浏览器的组件,但是毕竟是模仿,在很多方面的功能还是缺失的。
    ②最传统的方式是采用EJB做为服务,这个宠然大物容易让人害怕,不过在分布式的系统中它还是有应用优势的,像电信和金融这种行业应用还是比较广的,而且现成的中间件和应用服务器商都比较多,像Oracel、BEA、IBM、Sun都有成熟的应用产品,当然开发的成本和人力投入也是恐龙级数据的。
    ③有网友说在C端直接访问数据库,B/S结构不变,也就是通过数据库进行共享。这种方式是不可取的,二个缺点:把服务器的业务逻辑搬到了C端上,严格上讲是不安全的,升级维护也非常麻烦;并发控制的压力都在数据库上。
    ④采用RMI,这个老古董相信应该很多人都不使用了,因为它的使用要一连串的手续,比如服务接口定义必须实现Remote接口,服务Server在实现时必须继承UnicastRemoteobject类,必须使用rmic指令产生stub和skeleton等,设置上繁杂。
    ⑤Spring 远程服务。这个应该说是比较可取的,大家都比较喜欢轻量级的东西。就如第一点所说的,通过远程服务,我们可以在客户直接调用服务端的服务接口,就像本地调用一样,Spring对远程服务提供了好几种实现方案。
    ⑥WebService。适合异构环境,但是WSDL的这种方式相对来说会比较耗费资料,因为标准定义除了业务内容外,还有许多另外的说明内容。
    Spring远程服务实现方案介绍:
    ⑴Spring + RMI。Spring把传统的RMI方式的繁杂设置去掉,只要配置Bean文件就和定义服务接口可以。RMI的服务启动和管理都交给Spring来处理。RMI访问的缺点就是对防火墙的穿透力比较差。
    ⑵Spring + Caucho的Hessian、Burlap。Hessian使用Http将对象以中性的二进制消息进行传送,而不像RMI使用Java的序列化格式(这种序列化是专制的,不是Sun提供的序列化机制),由于是二进制消息,所以不受限于某种实现语言,传输时所需要的带宽较小是其优点。Burlap是以XML文件格式传送对象,XML文件有较高可读性,应用程序只要能解释XML就能接收消息,当然也不限于某种语言,但是组装XML和解释XML都需要消耗资源,当传输大数据时性能应该存在问题。
    ⑶Spring + Http Invoker。由于Hessian的序列化机制不是正统的Java序列化机制,所以当遇到传输复杂的业务模型时,就会存在各种问题,为此,Spring又提供了Http Invoker,同样是使用Http传送对象,而且是使用Java的序列化机制。相比RMI,Http对防火墙的穿透力要强。
    后来尝试了最后的这种Http Invoker方式,是在Spring2.0版本下尝试的,开发非常简单,网上也有大量的资料介绍。应该说从这里入口可以做一些尝试。目前遇到的一个项目就需要混合架构,B/S采用Spring2 + Struts2 + Hiberntae3,浏览器只提供一些查询功能和数据展现,C端采用Eclipse的RCP平台,共享服务器的业务接口,调用就采用Http Invoker远程服务,复杂的业务功能都集中在C端上。



刚进场的时候戏就落幕

Feedback

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-05-06 12:59 by origo
想学习spring http Invoker 的C/S 模式和Spring2 + Struts2 + Hiberntae3的B/S模式的 可以访问这个网站:http://soyframework.com 有详细例子。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-06 15:24 by blackhero
现在很多cs和bs混合的项目,互补不同

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-06 16:50 by 大道自然
和我的想法差不多,但是我现在还没有时间去实现C/S结构

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-06 17:26 by 银河使者
以前也做过很多这处C/S和B/S混合的项目。但有些客户端使用的不是java。当然,服务端也非得使用象EJB一样的重量级组件。如我做过的一个系统C/S部分的客户端使用的是delphi,而服务端只是普通的jsp/servlet程序,也未使用web service,而是通过servlet来为C/S部分的客户端(delphi客户端)返回数据(也包括一些加密数据),而客户端通过http协议访问servlet。当然,B/S部分的还是jsp。这样实现个人感觉比较简单。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-06 21:59 by jasin2008
c/s 远程访问如何维持会话状态,如何保证数据传输的安全性,不知道楼主在这方面是怎么解决的

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-05-07 09:10 by 寒武纪
@jasin2008
个人觉得C/S远程调用要像B/S那样保持会话是比较困难的,远程调用和浏览器的Cookie机制脱节,所以要模拟会话是有难度的。有网友给出了一些看法,我觉得这种想法挺不错的,可以参照一下。
http://www.javaeye.com/topic/82492

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 09:12 by 银河使者
实际上C/S和B/S从底层技术上没什么区别。C/S只是模拟浏览器来访问服务端资源,至于会话状态,可以读取http响应头的Session-cookie信息来处理,至于安全性,客户端可以使用https协议访问服务端,或是自已加密数据。

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-05-07 11:32 by origo
@大道自然
目前有很多现成的组件可以用,c/s的实现还是比较容易的,swing的方式最忌讳的就是代码混乱,没有框架支持。

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-05-07 11:33 by origo
@jasin2008
会话的维持保持在后台,每个请求维持一个会话,这方便B/S和C/S实现起来也差不多吧

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 14:27 by 银河使者
是的,从技术上差不多。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 16:37 by for_the_king
运用Swing+http invoker+spring+hibernate开发C/S架构的系统从技术上没有难度,而且java web start可以解决客户端自动升级的问题,两年前我们公司一个项目采用这种方式客户就非常喜欢,客户又感受到了传统C/S应用的用户体验,而且没有升级麻烦,只局限在局域网中使用等待一系列问题。楼主担心的问题10行代码就可以搞定(http://www.javaeye.com/topic/82492,这么笨的方法也亏这个人想的出来),首先扩展SimpleHttpInvokerRequestExecutor的openConnection()方法把客户端的信息(登录用户,客户端选择的locale等)加到URL后面,在服务器端写一个filter把这些信息取出来放到threadlocal中,在Service中不就可以随便用了吗,httpinvoker本身就是无状态的,干嘛非把httpSession牵扯进来,想法就没对。

其实这种架构最麻烦的莫过于界面的开发,在我们原来的项目中一会儿客户想要一个可以翻页的表格,过几天他又想点击表头可以排序,单列排序他又不满足了他又想多列排序,表格搞得差不多了表单又来了,Swing的布局管理非常灵活,要做好一个表单真得费一番劲,而且客户总喜欢把他们用VB,delphi做的系统拿来跟你比,说你界面丑陋啦,日期输入不人性化啦...,用struts2半天就可以搞定的一个表单用Swing恁是搞了一个星期,写界面的痛苦啊。总之,Swing的界面开发是个大麻烦,项目完了以后将一些可重用的组件整理了一下,但还是发现界面代码一大堆,极难维护,后来的项目只要客户说C/S,我们也绝口不提C/S。

后来在javaeye首页上看到一家公司的富客户端解决方案的广告,进去看了看第一感触就是这个框架的作者当时绝对和我一样痛苦过,只不过他痛定思痛走的更远了一些,能够把控件封装起来,把项目中常见的问题在框架中一并解决了,现在只是感叹如果这个框架能在两年前出现那该有多好啊!

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-05-07 18:13 by 寒武纪
楼上的想法不错,没有具体实现过,Http invoker也是最近才晓得。希望能进一步深入了解。
说起GUI的开发有强烈的同感,记得以前开发的第一个Swing项目的时候,项目不大,但是界面不少,表格、树这些都需要用到。那时JDK和NetBean版本都很低,记得是1.4.X+4.1版本,Eclipse的VE太容易暴掉,所以就在NetBean那上面画GUI,如果一个页面控件多了NetBean里面的代码就乱成一锅粥。没有办法,在基本成型后就全部搬到Eclipse进行重构(工作量比较大)。最大的问题就是缺乏Application运行管理内核,想想当初为了一个打开--编辑--保存--关闭编辑模型的功能,以及像构建工具栏、状态栏等这些基本框架,花了大量大量的时间和精力,还好,初出茅庐,有的就是精力,最后还是拼起来了。很多class都是上一二千行的,根本无法维护。后来转去学习Eclipse RCP框架,感觉好多了,也成功在RCP平台上构建了一个大型项目的应用。自从JDK6以后,Swing好像提升非常快,NetBean也开始支持RCP应用,不久还有Application框架,而且像SwingLab这些高级组件也挺不错的。感觉以后开发Swing应该比原来要容易一些。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 19:09 by 银河使者
做C/S的客户端不必非得用java吧,虽然Java是跨平台的,在国内客户端基本都是windows。个人认为客户端用delphi、c++ builder、vb,甚至C#比较好,可以用java做服务端。java的swing、awt或是SWT做GUI远不如delphi这些开发工具方便。如果非得要做的话,netbeans6.1提供的java gui比较好,layout也非常方便,大家可以试试。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 19:10 by 银河使者
我以前做过一个项目,客户端就是用的delphi,服务端用的jsp+hibernate,效果很好。反正通讯用的都是tcp

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 22:42 by for_the_king
还试图用VB,VC,delphi做数据库应用的人醒醒吧,就拿客户端不能自动升级这一条就能让我永远不会考虑他们,这些语言或架构不适合做企业应用,如果还没搞明白什么是企业应用,那我告诉你企业应用至少要有应用服务器。客户端用delphi服务器端用jsp+hibernate通讯用TCP就更扯了,当然了every language can do everything,向你们的架构师的不畏复杂的精神和他这么有创意的架构致敬。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-07 22:46 by for_the_king
在blogjava上搜到一篇文章http://www.blogjava.net/knight-glory-ggg/archive/2008/03/05/183984.html
估计是这个框架的作者写出来宣传框架的,不过作者将Swing做数据库应用面临的问题说的很清楚,值得一读。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-28 16:05 by 懒人
@银河使者
有很多语言可以做客户端的

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-28 17:42 by 银河使者
@懒人

不是有很多语言,而是所有支持网络技术(TCP协议)的语言或技术都可以做客户端。包括flash、office。

如果需要非常绚丽的效果,我看flash就很好,flash做动画可以其他语言比不了的啊。而且flash的script也可以使用TCP协议。这就足够了。如果谁用flash做一个msn或QQ的客户端,那效果远比msn或QQ要好的多了。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-28 17:52 by 银河使者
@for_the_king

谁说delphi、vc做的东西不能自动升级。我不知道你用过瑞星或其他的杀毒软件没。也是用VC或其他的语言写的,不是也可以自动升级。还有微软的smallclient(智能客户端),用C#或VB.net写的C/S程序。不是也可以很好的自动升级吗!至于通过tcp协议访问,当然,用delphi做的程序不一定直接使用tcp。就象ajax可以使用json一样,做个通用的映射组件,类似于web services,解决的方法非常多。

但是web程序却无法做到C/S的某些功能,至少很复杂。如做个树、菜单。这些用delphi、vb,只要几分钟就可以做个很好的程序。还有更复杂的效果。
最烦人的是web程序并不真正跨平台,ie6、ie7、firefox都得单独考虑。除非你可以强迫用户必须使用自己指定的浏览器。而C/S程序则是真正意义上的跨平台。(只限于windows,客户端是非windows时除外),在win98、win2000、winxp,2003,vista,windows2008上,只要能运行起来,界面效果都一样。


至于什么是企业级应用,我认为没有必要非得强调必须有什么,不能有什么。只要能满足用户的需要,其他的一切都不重要。主要得用户满意、然后才能老板满意,最后才能自己满意。

# re: B/S,C/S架构混合使用  回复  更多评论   

2008-05-28 17:55 by 银河使者
另外,开发一个大的软件系统不仅需要开发人员有团队精神。所使用的技术也应团队合作。没有哪一种技术可以适合于所有的领域和应用。如进行数据迁移,就可以利用数据库本身的技术,如sql server的DTS技术。

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2008-07-21 19:20 by lucky
www.soyframework.com目前最好的RCP框架了,不防试试

# re: B/S,C/S架构混合使用  回复  更多评论   

2013-03-06 23:16 by harrison
怒顶楼主,查找了半天相关的文献资料

# re: B/S,C/S架构混合使用  回复  更多评论   

2014-04-16 17:31 by Unbotrusive
我同意“客户端就是用的delphi,服务端用的jsp+hibernate”,效果确实很好。其实这个只要用上SOA 框架后,都能解决C/S 和B/S混合使用的问题。 只要在服务器上搭建能处理数据的SOA框架的处理服务,然后再搭建客户端,直接利用服务器的数据,这样就可以解决问题了。
但是若按上面4楼的说法只用一种语言只得很麻烦,特别是JAVA 这种节目很差的语言。

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2014-10-02 15:42 by eagle
可以帮我发个b/s和c/s混合架构的例子不?我们最近要做,我只用.net做过b/s架构的网站,现在要我负责这个混合结构的c,好愁哟,不知道该怎么弄,求助楼主大神,360082175@qq.com是我的QQ邮箱

# re: B/S,C/S架构混合使用[未登录]  回复  更多评论   

2014-10-02 15:42 by eagle
补充一下:用的语言是java,开发环境是eclipse

只有注册用户登录后才能发表评论。


网站导航: