接触webservice也有一段时间了,为了查缺补漏,把知识点系统化,准备写几篇博文梳理下webservice的知识点,这是第一篇,对webservice进行大致的介绍。
1.什么是webservice
1.1什么是服务(service)
计算机的服务一般指的就是计算机能提供的某一功能,比如qq能提供聊天服务,杀毒软件能提供杀毒服务。而通常情况我们把服务分为两大类,分别是本地服务(本地提供,不需要通过网络获取)和网络服务(即webservice,需要通过网络获取)。
接下来我们简单比较下这两种服务。
本地服务 | 网络服务 | |
---|---|---|
实现方式 | 利用本地资源实现,需要掌握实现方式 | 通过网络获取,不需要知道怎么实现 |
实现成本 | 需要自己承当人力物力,成本较高 | 只需要远程调用,成本较低 |
稳定性 | 自己实现,自己维护,稳定性相对较高,且不依赖互联网,断网风险小 | 依赖互联网,服务出现问题维护相对较麻烦,但成本不一定高 |
移植性 | 较差,换个系统要实现改服务要重新开发 | 较好,可以快速移植 |
图表的内容可能比较抽象,我们不妨举个例子来体会下。
-
假设我们要实现一个天气预报的服务,如果我们采用本地服务,首先我们得发送一个气象卫星,然后我们还要能接收并处理卫星数据的设备,有了数据之后我们有专门的科学家分析这些数据,然后通过工程师用图表的形式展示出来。
- 如果我们采用网络服务,我们只需要调取气象中心的接口,就可以得到气象服务。
- 假设有一天我们发现调用的接口传回的数据不对,如果我们是本地服务,我们马上可以组织人手排查问题,但如果是网络服务,我们就得依靠气象中心来解决问题,而且如果有一天网络出现故障,我们也会面临无法获取气象数据的问题。
-
如果某天公司业务要拓展,我们需要在一个新环境下实现气象服务,如果是本地服务,我们又得重新去实现一遍。而如果是网络服务,我们只需要把接口重新在新环境下调用即可。
因此,我们可以发现,本地服务的实现成本会远高于网络服务。特别是对于那些非核心的服务,如果我们都要亲力亲为去自己实现,无疑会增加自己的负担。同时本地服务的移植性也不如网络服务,因此网络服务就成为一个异常重要的发展方向。
1.2什么是网络服务(webservice)
如上文所说,网络服务(webservice)就是将某一服务通过互联网发布并被用户所获取的某一计算机功能。如前面说的气象服务,比较常见的还有微信公众号开发时我们可以调用的各种接口(如自动回复、支付、识别发送的信息类型等接口),腾讯地图提供的地图接口,支付宝提供的支付接口等等。这些网络服务加上我们本地的核心功能共同构成了一个完整的系统。
如果一个软件的主要部分采用了"网络服务(webservice)",即它把存储或计算环节"外包"给其他网站了,那么我们就说这个软件属于Web Service架构。
Web Service架构的基本思想,就是尽量把非核心功能交给其他人去做,自己全力开发核心功能。
webservice优势
平台无关。不管你使用什么平台,都可以使用Web service。
编程语言无关。只要遵守相关协议,就可以使用任意编程语言,向其他网站要求Web service。这大大增加了web service的适用性,降低了对程序员的要求。`
对于Web service提供者来说,部署、升级和维护Web service都非常单纯,不需要考虑客户端兼容问题,而且一次性就能完成。
对于Web service使用者来说,可以轻易实现多种数据、多种服务的聚合(mashup),因此能够做出一些以前根本无法想像的事情。
2.webservice相关技术
2.1webservice的实现原理
2.1.1概述
广义上的Web服务是一个URL资源,客户端可以通过编程方式请求得到它的服务,而不需要知道所请求的服务是怎样实现的,这一点与传统的分布式组件对象模型不同。
但是现 在我们说webservice一般是指XML Web Service WebService。它是通过soap在web上提供的软件服务,用wsdl进行描述,并通过uddi进行注册。
- XML(Extensible Markup Language):扩展型可标记语言,用于数据的传递,是soap的基础。
- SOAP(Simple Object Access Protocol):全称简单对象访问协议,是一种基于xml的轻量协议。当用户通过UDDI找到wsdl描述文件后,可以通过soap调用服务的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
- WSDL(Web Services Description Language):webservice描述语言,本质是一个xml文档,用于说明soap消息以及如何交换这些消息,一般由软件自动生成和使用。
- UDDI(Universal Description, Discovery, and Integration):是一种目录服务,企业通过它对webservice进行注册和搜索
2.1.2调用原理
webservice之所以能够实现跨平台跨语言之间的调用,是因为它定义了一个统一的信息交互和调用的标准。正如上文所说,webservice的实现需要依赖几个重要的技术:XML,soap,wsdl和uddi。
webservice最关键的一环就是soap,即把数据以xml的形式组合起来,然后通过http协议与远程服务进行通信,我们把用xml组合的数据格式统一,称为soap消息,这就成了我们跨平台跨语言通讯的关键。
当然不得不承认,soap格式的报文存在严重的冗余,并且依赖定义好的xml schemas,我们如果手动创建soap消息会特别麻烦,需要借助一些工具来简化一些工作,因此现在很多webservice的开法越来越趋向于restful风格的webservice。
如图所示,一个完整的webservice过程可以概括为以下步骤:
- web服务提供者开发完成服务后通过web服务中介者发布服务,并通过服务注册中心(一般为UDDI)注册(发布)
- web服务请求根据自己的需求向web服务中介者提出请求,web服务中介者会根据请求在UDDI注册中心找到满足要求的服务(发现)
- web服务中介者会向web服务请求者发布web服务的描述信息,这些信息一般是通过wsdl写成的,wsdl可以通过大部分浏览器来直接阅读(发现)
- web服务请求者根据wsdl信息编写相应的soap消息,然后发给web服务提供者,来调用相应的web服务(绑定)
- web服务提供者会根据soap消息执行相应的服务,并把调用结果发送给web服务请求者(绑定)
2.1.3调用方法
webservice除了httpsoap调用,也可以用get和post方法来调用,但是soap可以传递结构化的数据,而post和get方法不行。
在java web中,我们要调用webservice,通常是要先利用相应框架(如axis2等)生成webservice的对应client,然后通过调用client里面的相关方法来实现对webservice的调用。
2.2webservice相关框架
webservice一个最大的特点就是与语言无关,所以webservice用什么语言开发其实都可以。现在用的比较多的是c#和java,这里我们主要介绍java关于webservice的开发。
java开发web service的框架常见的有Axis,axis2,Xfire,CXF以及JWS,其中axis2和cxf是目前最为常用的框架。axis2可以看作是一个小型的应用服务器,相对来说会比较重,但是它功能强大,支持多语言,在大型项目被较多地使用。
2.3webservice未来发展趋势
- 通信协议会倾向于使用更轻量级的rest,而逐渐减少对RPC和soap的使用
- 通过上文的介绍,我们会发现现在webservice用于描述接口信息的wsdl以及传递信息的soap报文都是基于xml,而这些xml一般都会有比较复杂的格式定义,未来可能会使用更加轻量级的json来进行数据交互。
- 第三点其实也是对一条的补充,未来网络接口会更倾向于restful风格的设计,更轻量,对服务的请求不必再在第三方应用中中转,而是直接在浏览器中请求。