浏览 4826 次
锁定老帖子 主题:对web service和cxf的个人理解
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-29
这个需求很简单,实际上用更加轻量级的servlet+json来做也是可以的,但是由于老系统要求使用web service,所以也只能接受 于是我就在想,web service和servlet的区别在哪里。如果一个servlet被互联网上很多应用所调用,那么也就可以认为它是一个广义上的web service了。而狭义上的web service,似乎可以理解成soap+wsdl 根据我的理解,web service和一般的servlet(或者其他平台的服务端技术)主要有2个区别: 1、普通的servlet,走的协议是自定义的格式(比如自己定义的plain text或者是xml),或者最近几年比较流行的json。而web service走的协议是soap。这就造成一个后果,即普通的servlet,客户端需要自己对传输的内容进行解析,而web service的客户端则省去了这个步骤,因为各平台的web service实现框架(比如java平台有cxf),会代劳实体数据和soap的转换 2、普通的servlet,客户端代码需要自行开发。比如我知道某个地址提供了一个服务,那么我需要在了解接口协议之后,用httpclient+字符串解析等方式,来自行开发客户端的代码。而web service规范规定了wsdl文件,那么各平台的web service实现框架,可以提供一些工具,由wsdl生成平台相关的代码,省去了客户端自行开发的工作 基于以上理解,我认为狭义的web service就是soap+wsdl,目的是简化客户端的工作(包括协议解析和客户端调用的代码编写)。这背后依赖的前提就是soap协议和wsdl格式是世界范围内通用的 我认为web service分为2个阶段,一个是部署时,一个是运行时。 部署时起作用的主要是wsdl,这个时候调用还没有发生,但是客户端可以根据此文件,生成平台相关的代码(无论是手写还是利用框架提供的工具)。 运行时起作用的主要是soap,此时web service框架起到的作用是完成平台相关的代码和soap格式字符串之间转换,以及soap与http之间的转换。 实际运行的时候,没有wsdl都可以,也就是说WSDL是一个部署时描述符,不是运行时组件。等于说WSDL起到的是一个接口文档的作用,只不过这个接口文档的格式是全世界通用的,不是某2个特定系统自己协商的。平时项目开发时写的接口文档,就可以理解成一个不通用的WSDL 然后说说我对cxf的个人理解,cxf是java平台的web service框架。如上文所说,它在部署时和运行时发挥的是不同的作用 在部署时,cxf框架可以根据web service接口,生成wsdl文件;也可以根据wsdl文件,反向生成客户端的代码 在运行时,cxf框架可以完成实体数据和soap格式字符串之间的转换,以及将soap包装成http数据流,或者从http数据流中取出soap 上述的功能,没有框架同样是能做的。只要对wsdl足够熟悉,完全可以自己编写wsdl文件,或者根据wsdl文件手写代码;同样,只要对soap协议足够熟悉,这个转换也可以自行完成。cxf框架(或者xfire,axis等同类框架)只是提供了一个便利 最后,web service最大的意义还是在于跨平台。因为web service规范规定的数据类型不与具体平台的类型绑定,所以同样一个wsdl文件,各个平台的web service实现可以生成各自平台对应的代码 如果不是出于跨平台的目的的话,web service我感觉没有什么意义。比如说假设web service仅用于java平台,那我发布web service,既要提供wsdl文件,还要解析soap协议,未免就太麻烦了。我不如直接将调用我的服务的功能的客户端代码都写好,然后封装成一个jar包,公开提供给需要的系统调用就可以了 比如我写好一个 public class MyServiceInvoker{ public static String sayHi(String name){ // 将name作为http post的内容 // 将http的目标url设置成我提供服务的地址 // 发起http请求 // 将响应结果进行解析,反正格式是我规定的 return 响应结果; } } 然后我把这个类以及相关依赖的类打成一个invoker.jar,提供给需要的应用,那么应用在导入这个jar包后,客户端代码可以直接这么写: String result = MyServiceInvoker.sayHi("kyfxbl"); 岂不是比发布wsdl要简单很多,但是这样的话,.net平台就无法调用这个服务了 所以说,web service的根本意义就在于跨平台,否则就有更方便的方法来实现组件共享的目的。 反过来想想,这次那个老系统之所以坚持用web service来对接,或许就是因为在设计之初,就希望这个系统将来可以对接各种平台的系统。只不过这次我们的系统正好也是用java的,所以显得有点没必要,太重量级了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-01
web service的根本意义就在于跨平台??servlet不也是一种http协议吗?http不也是跨平台吗,返回json或xml,.net没法解析吗?你觉得js客户端解析web service返回的数据简单吗?简直是噩梦!!
个人感觉REST是两者之间的平衡点。lz可以试试。 |
|
返回顶楼 | |
发表时间:2012-03-01
额,我感觉你没理解我的意思。
我前面说了那么多,还贴了伪代码,想说的是:如果不能跨平台,web service就没有太大用,就有更简单的方式来发布服务了。我不是说别的方案不能跨平台 web service就是为跨平台提供了便利啊,我前文一直是这个观点 |
|
返回顶楼 | |
发表时间:2012-03-01
跨平台,面对各种客户端调用的多样性,这本身就是很有意义的事情,为什么要特别强调了,至于用与不用web service,当然要根据实际情况出发,不应该是出于时髦、装x和头脑发热的结果!
|
|
返回顶楼 | |
发表时间:2012-03-04
最后修改:2012-03-04
webservice 其实是把单独某一项功能,提取出来作为服务, 而其他不论任何jvm上的任何异构系统,都可以使用这个功能。
而servlet或httpclient一般都不是一个独立的服务,而是镶嵌在某一个系统内与其他系统来做请求 -- 响应。 不过如果非要采用httpClient实现单独服务也是可以的,webservice可以以对象作为参数传递, 貌似httpClient不具备这样的功能。 有这样一个场景: 某系统A要做一个查询功能,查询客户表,该功能要访问数据库B 而A所在的部门无权限访问B库, 也不可能开放数据访问权限给A ,只能让其查特定条件的客户表的功能。 但是随着业务需要,A系统又急需连接B库做查询,这该如何是好? 答案: 让B库所在的部门做一个webservice, 把WSDL和相应规范提交给A项目组。 这样B就准确地提供给了A 想要的数据,而又保证了B库的安全性。 当然了, 后来又出现了C系统和D系统需要对B库采用同样的查询功能, 因为已经有现成的服务了,所以直接就可以用了。 以上是一个真实案例。 每一项技术都有存在的意义和价值,不要说webservice没有用,一定要使用REST, 因为不是所有系统都是需要用js来解析返回数据的 另外我很奇怪, 既然用js解析返回数据,也就意味着用js对webservice发送请求, 这个系统不用后台语言吗。这个未免太牛逼了吧。。。 还有一个案例如下: 某体制内的协会,要求行业内监管下的所有公司将XX数据上报的协会的数据库,以此来做通统计分析达到对行业监控的目的。 行业里不同公司的系统当然是分布在全国各地的, 也都是异构的,甚至开发语言也大不相同。那么如何使这些系统与该协会的数据平台系统对接? webservice是一个不错的选择, 平台提供服务, 各个下属公司调用服务来上传数据。 当然我也遇到过采用httpclient来实现对接的需求, 同样可以实现, 二者都是需要网络带宽,都需要开放专线,但是不知道网络上的区别是啥,期待GAO人解答(javaeye连gao人解答都屏蔽啊。。。) |
|
返回顶楼 | |
发表时间:2012-03-04
最后修改:2012-03-04
WebService 主要用来对外提供通用的调用接口, 主要用来在异构系统之间进行服务互操作,目前是SOA架构中服务的主要技术体现形式.
楼主一直提到http协议上的相关远程调用通信技术,如servlet等. 如果光就通过http远程调用来说,两者功能似乎差不多.但ws提供的附加技术更多,比如服务安全,事务,寻址等。 创建webService,或者说创建服务,通常是为了解决系统集成问题,或者至少关注集成问题,wsdl是描述服务功能的一种方法,改方法没有规定实现。 虽然说wsdl通常是基于http使用soap消息进行传递,但不是必须的,其他的协议比如jms、ftp等协议也可以用来绑定。 如果两个异构的系统可以使用更好的、彼此协商好的技术来实现集成,则完全不需要用webService, 比如你提到基于http技术的相关请求-响应实现等. webService只是提供一种业界通用的规范和标准手段给你在各种系统之间进行服务的互操作,集成等,但你如果仅仅只是在http这个层面以请求-响应 这样的数据交互模型来讨论webService,就未免片面和井底之蛙。 站在SOA的角度来探讨WebService,或许你会有更广阔的见解。 |
|
返回顶楼 | |
发表时间:2012-06-05
把楼主的文章和大家的评论都看完了,实在的说,各位都是大神,说的我都一知半解,我也无法判断webservice和servlet的区别,但是从楼主的文章中学到了webservice的一些我原来不知道的知识,感谢楼主,感谢大家!
|
|
返回顶楼 | |