文档章节

Web Service的研究

gaob2001
 gaob2001
发布于 2017/05/11 13:35
字数 1399
阅读 10
收藏 0

SOA和Web Service

首先明白SOA和Web Service的关系:

* SOA面向服务架构,用于大型分布式系统的一个概念;

* Web Service是实现SOA的方式之一,不是所有的SOA都是基于Web service的;

* 但Webservice确实为最主流的SOA实现方式,有的人甚至把SOA等同于Webservice。不可否认,正是Webservice的成功才造就了SOA这个概念的成功;

 

Webservice

Webservice有三个基础标准:

1.WSDL: Web服务定义语言(Web Service Definition Language),用来定义服务接口。实际上,它能描述服务的两个不同方面:服务的签名(名字和参数),以及服务的绑定和部署细节(协议和位置)。

2.SOAP:简单对象访问协议(Simple Object Access Protocol),是定义Webservice的协议。HTTP是一个网络数据交互的底层协议,而SOAP是Web Service数据交换的专用协议。

3.UDDI:通用描述、发现与集成服务(Universal Description, Discovery and Integration),UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。

SOAP是协议,就像HTTP协议一样,一般框架都已经集成;

UDDI扮演者补充的角色,非必须,而且通常在实践中也不用。

WSDL是开发人员打交道最多的东西,也算是Webservice的核心了。
 

WSDL

WSDL现在主要有两个版本,1.1和2.0,两个版本标示大体结构相似,略有不同。(WSDL1.1版本根节点为definitions,2.0版本根节点为description)

 

 

 

 

WSDL Example

WSDL通常是框架来生成的,并不是手工写的,比如Java可以使用wsgen 生成webservice,.Net框架也有自己方法,都可以通过自身的框架把接口发布称WSDL文件。
一个WSDL的简单示例。这个WSDL文件定义了一个被称为CustomerService的服务,该服务提供了一个被称为getCustomerAdress()的操作。这个操作的输入参数为一个类型为long的客户ID,输出为一个包含3个string属性-街道、城市和邮编的结构。(示例来自于《SOA实践指南》)

<?xml version="1.0" encoding="utf-8" ?>  
<definitions name="CustomerService"  
     targetNamespace="http://soa-in-practice.com/wsdl"  
     xmlns:tns="http://soa-in-practice.com/wsdl"  
     xmlns:xsd1="http://soa-in-practice.com/xsd"  
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
     xmlns="http://schemas.xmlsoap.org/wsdl/">  
  
     <types>  
          <xsd:schema  
               targetNamespace="http://soa-in-practice.com/xsd"  
               xmlns="http://soa-in-practice.com/xsd">  
  
               <xsd:element name="getCustomerAddress">  
                    <xsd:complexType>  
                         <xsd:sequence>  
                              <xsd:element name="customerID" type="xsd:long"/>  
                         </xsd:sequence>  
                    </xsd:complexType>  
               </xsd:element>  
  
               <xsd:element name="getCustomerAddressResponse" type="Address"/>  
               <xsd:complexType name="Address">  
                    <xsd:sequence>  
                         <xsd:element name="street" type="xsd:string"/>  
                         <xsd:element name="city" type="xsd:string"/>  
                         <xsd:element name="zipCode" type="xsd:string"/>  
                    </xsd:sequence>  
               </xsd:complexType>  
  
          </xsd:schema>  
     </types>  
  
     <message name="getCustomerAddressInput">  
          <part name="params" element="xsd1:getCustomerAddress"/>  
     </message>  
     <message name="getCustomerAddressOutput">  
          <part name="params" element="xsd1:getCustomerAddressResponse"/>  
     </message>  
  
     <portType name="CustomerInterface" >  
          <operation name="getCustomerAddress">  
               <input message="tns:getCustomerAddressInput" />  
               <output message="tns:getCustomerAddressOutput" />  
          </operation>  
     </portType>  
  
     <binding name="CustomerSOAPBinding"  
          type="tns:CustomerInterface" >  
          <soap:binding style="document"  
          transport="http://schemas.xmlsoap.org/soap/http" />  
          <operation name="getCustomerAddress">  
               <soap:operation  
               soapAction="http://soa-in-practice.com/getCustomerAddress" />  
               <input>  
                    <soap:body use="literal" />  
               </input>  
               <output>  
                    <soap:body use="literal" />  
               </output>  
          </operation>  
     </binding>  
  
     <service name="CustomerService" >  
          <port name="CustomerPort"  
               binding="tns:CustomerSOAPBinding">  
               <soap:address  
               location="http://soa-in-practice.com/customer11"/>  
          </port>  
     </service>  
  
</definitions>

WSDL文件的解读

阅读一个WSDL,需要从下往上看

最后的<service>节点定义了这个服务的名称为CustomerService,并且该服务可以在http://soa-in-practice.com/customer11找到。

     <service name="CustomerService" >
          <port name="CustomerPort"
               binding="tns:CustomerSOAPBinding">
               <soap:address
               location="http://soa-in-practice.com/customer11"/>
          </port>
     </service>

 

<binding>节点定义了用来提供Webservice的协议和格式。CustomerSOABiding是Binding的名称,并指出Binding要从哪个接口开始(这里是从CustomerInterface这个接口开始)

     <binding name="CustomerSOAPBinding"
          type="tns:CustomerInterface" >
          <soap:binding style="document"
          transport="http://schemas.xmlsoap.org/soap/http" />
          <operation name="getCustomerAddress">
               <soap:operation
               soapAction="http://soa-in-practice.com/getCustomerAddress" />
               <input>
                    <soap:body use="literal" />
               </input>
               <output>
                    <soap:body use="literal" />
               </output>
          </operation>
     </binding>

 

<portType>描述了CustomerInterface这个接口,其中接口包含一个叫getCustomerAddress的Operation。在Operation下边,getCustomerAddressInput和getCustomerAddressOutput是这个Operation的输入消息和输出消息。

     <portType name="CustomerInterface" >
          <operation name="getCustomerAddress">
               <input message="tns:getCustomerAddressInput" />
               <output message="tns:getCustomerAddressOutput" />
          </operation>
     </portType>

 

<message>节点定义了各个消息,使用的是<portType>节点引用的标识符。

     <message name="getCustomerAddressInput">
          <part name="params" element="xsd1:getCustomerAddress"/>
     </message>
     <message name="getCustomerAddressOutput">
          <part name="params" element="xsd1:getCustomerAddressResponse"/>
     </message>

 

<type>节点定义了将会使用到的数据类型:输入参数customerID的类型为long,输出参数address的类型是有3个字符串属性的结构/记录。所有类型在自己的命名空间xsd1中。

     <types>
          <xsd:schema
               targetNamespace="http://soa-in-practice.com/xsd"
               xmlns="http://soa-in-practice.com/xsd">

               <xsd:element name="getCustomerAddress">
                    <xsd:complexType>
                         <xsd:sequence>
                              <xsd:element name="customerID" type="xsd:long"/>
                         </xsd:sequence>
                    </xsd:complexType>
               </xsd:element>

               <xsd:element name="getCustomerAddressResponse" type="Address"/>
               <xsd:complexType name="Address">
                    <xsd:sequence>
                         <xsd:element name="street" type="xsd:string"/>
                         <xsd:element name="city" type="xsd:string"/>
                         <xsd:element name="zipCode" type="xsd:string"/>
                    </xsd:sequence>
               </xsd:complexType>

          </xsd:schema>
     </types>

SOAP

 SOAP (Simple Object Access Protocol)是一个消息框架,这个消息框架是基于XML协议的,从下图能够看到,SOAP的框架非常像HTTP协议,都包含的消息的Header和消息的Body,只不过SOAP是Web Service数据交换的专用协议。SOAP是HTTP的上层协议,最终还是通过HTTP来传输数据。

 

SOAP Reqeust Example

<?xml version='1.0' ?>  
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
     <soap:Header>  
          ...  
     </soap:Header>  
     <soap:Body>  
          <getCustomerAddress xmlns="http://soa-in-practice.com/xsd">  
               <customerID>12345678</customerID>  
          </getCustomerAddress >  
     </soap:Body>  
</soap:Envelope>

SOAP Response Example

<?xml version='1.0' ?>  
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
     <soap:Header>  
          ...  
     </soap:Header>  
     <soap:Body>  
          <getCustomerAddressResponse xmlns="http://soa-in-practice.com/xsd">  
               <address>  
                    <street>Gaussstr. 29</street>  
                    <city>Braunschweig</city>  
                    <zipCode>D-38106</zipCode>  
               </address>  
          </getCustomerAddressResponse>  
     </soap:Body>  
</soap:Envelope> 

SOAP消息的根元素为<Envelope>

从上边可以看出SOAP是基于XML的,除了组织结构,其他非常类似于HTTP的Request和Response。

 

HTTP Request Example

GET /path/file.html HTTP/1.0  
From: someuser@jmarshall.com  
User-Agent: HTTPTool/1.0  
[blank line here]  

HTTP Response Example

HTTP/1.0 200 OK  
Date: Fri, 31 Dec 1999 23:59:59 GMT  
Content-Type: text/html  
Content-Length: 1354  
  
<html>  
<body>  
<h1>Happy New Millennium!</h1>  
(more file contents)  
  .  
  .  
  .  
</body>  
</html>  

 

参考资料:

《SOA实践指南》

http://wiki.rsg.pml.ac.uk/pywps/WSDL

本文转载自:http://blog.csdn.net/pan_tian/article/details/10008893

gaob2001
粉丝 5
博文 72
码字总数 55339
作品 0
黄浦
程序员
私信 提问
《Nginx高性能Web服务器》系列分享专栏

《Nginx高性能Web服务器》系列分享专栏 [作者:Poechant] Nginx是目前最流行的基于BSD-like协议、轻量级、高性能的HTTP服务器、反向代理服务器和电子邮件(SMTP/POP3/IMAP)服务器。CSDN的Ngi...

开元中国2015
2018/12/01
0
0
KbmMW 服务器架构简介

kbmmw 由于文档比较少,很多同学开始用时很难理解。一直准备写一个关于kbmmw 架构的东西。 这几天与红鱼儿(blog) 研究服务器线程时,整理了一下,大概画了一下kbmmw (版本4.5)服务器的架...

xalion
2014/06/22
0
0
服务器后端开发系列——《实战Nginx高性能Web服务器》

1、高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例 内容:概述Nginx的背景知识和简单的入门实例。 2、高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“...

晨曦之光
2012/04/24
251
0
聊聊服务架构_Index

聊聊服务架构 Web Service研究分析 深入浅出SOA思想 微服务、SOA 和 API对比与分析

陶邦仁
2016/05/19
1K
0
SpringCloud调研系列5.2:服务网关Zuul组合API之Filter研究

上一节,研究了Zuul转发请求的例子,这一节,开始研究Zuul进行API组合。 咨询了下朋友,说是可以基于filter来做这个事情,所以接下来研究filter. --- 首先研究下正常情况下,就是我们自己不增...

强子哥哥
2016/12/02
664
0

没有更多内容

加载失败,请刷新页面

加载更多

怎么选择数据服务器?请记住这五条

我们应当都知道“数据无价”这个词,既然数据那么主要,选择一款安全稳定的数据服务器是很有必要的,那么如何选择一款牢靠的,稳定的数据服务器呢?我们从五个方面下手,协助您体系的了解数据...

linux-tao
21分钟前
1
0
第一讲:编写TCP Socket小程序

根据下面的步骤编写TCP Socket小程序。注意:作者必须是自己的名字。结果如下: 步骤: 1、用VC建立服务器程序 创建一个win32控制台程序 上面的代码如下,编写代码的时候切换到FileView界面,...

一匹狼工作室
23分钟前
2
0
python-protobuf2uml

首先这篇文章是参考的https://github.com/vak/protobuf2uml 本篇文章都是基于python3的 下面首先我们说一下python3的安装 wget https://github.com/protocolbuffers/protobuf/releases/down...

yiduwangkai
24分钟前
1
0
mysql通过source恢复大表小计

最近迁移一个数据库,500多张表大概600多万条数据,通过navicat导出的数据,再通过source命令导入到mysql8.0 之前也做过类似的工作,但是却从来没有这么慢过,一个小时了还没有完成,之前在笔...

休辞醉倒
25分钟前
1
0
Java、Python、C++、PHP、JavaScript这5大编程语言,我究竟该选哪个?

很多朋友在后台给我留言,问:现在这么多编程语言,Python、Java、PHP、C++、JavaScript等,究竟哪种最流行?我想这应该也是你的困扰吧! 其实他们各有优势,但是对于选择困难的程序员而言,...

Java领航员
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部