WebService初识
Web service 是一种跨编程语言和跨操作系统平台的远程调用技术,即跨平台远程调用技术。也就是说,不管是J2EE架构,还是.net架构 只要按照规范就可以进行通信,实现数据交互等。
这里说的"规范"是指,Webservice平台必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这种方法实际上是一种远程过程调用协议(RPC)。Webservice 就是一种部署在网络上的API。
RPC的全称为Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。RPC 可以基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC。直接影响 RPC 性能的有两个方面,一是传输方式,二是序列化。
实现RPC的协议有很多,比如最早的CORBA,Java RMI,以及现在用的Web Service,Hessian,Thrift,甚至Rest API等。
因此,WebService可以理解为实现RPC的一种方式,传输数据格式为XML,采用SOAP协议,RPC的实现方式为SOAP RPC。
xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输的是xml数据。
WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。
SOAP协议 = HTTP协议 + XML数据格式。
SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
必需的 Envelope 元素,可以把此 XML 文档标识为一条 SOAP 消息;
可选的 Header 元素,包含头部信息;
必需的 Body 元素,包含所有的调用和响应信息;
可选的 Fault 元素,提供在处理此时所发生错误的有关信息。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header> </soap:Header>
<soap:Body> <soap:Fault> </soap:Fault>
</soap:Body>
</soap:Envelope>
WSDL(Web Services Description Language)是一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。
采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
我们平时在生活中见过的一些便民生活网站就广泛地使用了webservice技术,诸如:
在使用中,客户端与服务端的部署如下:
客户端程序和服务端程序可以是部署在同一个计算机上的两个程序,但通常客户端和服务端是部署在不同的计算机上的。
客户端和服务端之间的网络必须连通,客户端和服务端之间使用网络协议进行通信。
服务端监听一个端口,客户端通过服务端监听的端口进行请求,客户端通过ip+端口去调用服务端,比如:tomcat启动起来监听8080端口,即tomcat对外提供服务,浏览器即客户端通过http协议访问tomcat的8080端口。
客户端通过网络通信协议访问服务端,网络协议包括TCP和UDP两大通信协议:
TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况,使用这个协议。TCP支持的应用协议主要有:Telnet、FTP、SMTP、HTTP等;
UDP---用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
客户端/服务器模式早期主要应用于c/s应用,web兴起后主要应用于b/s应用,b/s比c/s的好处就在于b/s是基于浏览器客户端访问服务端。
webService存在三要素:
1.soap
SOAP即简单对象访问协议(Simple Object Access Protocal) 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单理解为soap=http+xml。Soap协议版本主要使用soap1.1、soap1.2。
SOAP不是webservice的专有协议,其他应用协议也使用soap传输数据。例如,SMTP、tr069等。
2.wsdl
WSDL 是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdl是webservice的使用说明书。
3.UDDI
UDDI (Universal Description, Discovery and Integration,通用描述、发现与集成服务)是一种目录服务,通过它,企业可以使用它对 Web services 进行注册和搜索。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。 UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
目前大部分企业使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。
接下来,我通过编码实现一个自定义的webservice服务端。
package com.itszt.weather; import java.util.List; /**
* 1.编写SEI(Service Endpoint Interface),
* SEI在webservice中称为portType,在java中称为接口。
* 气温查询接口
*/
public interface WeatherQuery {
//1.查询当前的气温
public String queryNowTem();
//2.查询某个城市未来两天的气温
public List<String> query2Days();
}
------------------------------------------------------------
package com.itszt.weather;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
/**
* 2.编写SEI实现类,此类作为webservice提供服务的类
* 气温查询实现类
* 注意:SEI实现类中至少要有一个非静态的公开方法作为webservice的服务方法。
* public class 上边要加上@WebService
*/
@WebService
public class WeatherQueryImpl implements WeatherQuery{
@Override
public String queryNowTem() {
System.out.println("外部系统访问到了--->WeatherQueryImpl.queryNowTem");
return "45度";
} @Override
public List<String> query2Days() {
System.out.println("外部系统访问到了--->WeatherQueryImpl.query2Days");
List<String> days=new ArrayList<>();
days.add("晴天");
days.add("阴天");
return days;
}
}
----------------------------------------------------
package com.itszt.weather;
import javax.xml.ws.Endpoint;
/**
* 3.endpoint发布服务
*/
public class Main {
public static void main(String[] args) {
//发布我们设计的天气预报
Endpoint.publish("http://192.168.1.6:10086/SzWeather",
new WeatherQueryImpl());
}
}
Webservice发布成功后,通过wsdl查看webservice发布的正确性。
http://192.168.1.6:10086/SzWeather?wsdl
需要注意的是:Wsdl不是webService,只是获取一个用于描述WebService的说明文件;wsdl- -WebService Description Language,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务。
接下来,我们通过Wsimport生成客户端调用webservice类。
wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)。当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。
先确定生成webservice客户端代码的路径:
在DOS中生成客户端代码的命令:
wsimport -s E:\webService\gen\source -d E:\webService\gen\classes http://192.168.1.6:10086/SzWeather?wsdl
生成weather.jar包:
接下来,建一个客户端工程调用服务端提供的webservice服务。其中,将生成的weather.jar添加到客户端工程中作为依赖。
package weatherClient;
import com.itszt.weather.WeatherQueryImpl;
import com.itszt.weather.WeatherQueryImplService;
import java.util.List;
/**
* 客户端测试类,调用服务端提供的服务
*/
public class ClientTest {
public static void main(String[] args) {
//创建服务视图
WeatherQueryImplService weatherService=new WeatherQueryImplService();
//根据服务视图得到服务端点
WeatherQueryImpl weatherQueryImpl = weatherService.getPort(WeatherQueryImpl.class);
//调用WeatherQueryImpl的服务方法
String nowInfo = weatherQueryImpl.queryNowTem();
List<String> query2Days = weatherQueryImpl.query2Days();
System.out.println(nowInfo);
System.out.println(query2Days);
}
}
客户端控制台打印如下:
45度
[晴天, 阴天]
服务端控制台打印如下:
外部系统访问到了--->WeatherQueryImpl.queryNowTem
外部系统访问到了--->WeatherQueryImpl.query2Days
说明客户端成功地访问到了服务端提供的天气信息服务。
另外,我们还可以通过webservice的注解修改wsdl中的信息。
package com.itszt.weather;
import java.util.List;
/**
* 1.编写SEI(Service Endpoint Interface),
* SEI在webservice中称为portType,在java中称为接口。
* 气温查询接口
*/
public interface WeatherQuery {
//1.查询当前的气温[修改参数信息]
public String queryNowTem(String city,String date);
//2.查询某个城市未来两天的气温
public List<String> query2Days();
}
--------------------------------------------------
package com.itszt.weather;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
/**
* 2.编写SEI实现类,此类作为webservice提供服务的类
* 气温查询实现类
* 注意:SEI实现类中至少要有一个非静态的公开方法作为webservice的服务方法。
* public class 上边要加上@WebService
* [修改服务名称,端口名称]
*/
@WebService(serviceName = "SzService",portName = "hello")
public class WeatherQueryImpl implements WeatherQuery{
//修改方法名称
@Override
@WebMethod(operationName = "queryTem")
public String queryNowTem(@WebParam(name = "城市名称") String city,@WebParam(name = "日期") String date) {
System.out.println("city = [" + city + "], date = [" + date + "]");
System.out.println("外部系统访问到了--->WeatherQueryImpl.queryNowTem");
return city+"的"+date+"气温是:45度";
} @Override
@WebMethod(operationName = "query2Days")
public List<String> query2Days() {
System.out.println("外部系统访问到了--->WeatherQueryImpl.query2Days");
List<String> days=new ArrayList<>();
days.add("晴天");
days.add("阴天");
return days;
}
}
-------------------------------------------------
package com.itszt.weather;
import javax.xml.ws.Endpoint;
/**
* 3.endpoint发布服务
*/
public class Main {
public static void main(String[] args) {
//发布我们设计的天气预报
Endpoint.publish("http://192.168.1.150:10086/SzWeather",
new WeatherQueryImpl());
}
}
运行上述代码,并重新在浏览器中打开wsdl使用说明书,并生成jar包。为简化操作,创建一个gen.bat的批处理文件,其中的命令如下:
wsimport -s E:\webService\gen\source -d E:\webService\gen\classes http://192.168.1.150:10086/SzWeather?wsdl e: cd E:\webService\gen\classes jar cvf weather4.jar com
创建访问webservice的客户端:
package weatherClient;
import com.itszt.weather.WeatherQueryImpl;
import com.itszt.weather.SzService;
import java.util.List;
/**
* 客户端测试类,调用服务端提供的服务
*/
public class ClientTest {
public static void main(String[] args) {
//创建服务视图
SzService weatherService=new SzService();
//根据服务视图得到服务端点
WeatherQueryImpl weatherQueryImpl = weatherService.getPort(WeatherQueryImpl.class);
//调用WeatherQueryImpl的服务方法
String nowInfo = weatherQueryImpl.queryTem("北京","10月10日");
List<String> query2Days = weatherQueryImpl.query2Days();
System.out.println(nowInfo);
System.out.println(query2Days);
}
}
客户端执行后控制台显示如下:
北京的10月10日气温是:45度
[晴天, 阴天]
服务器端的控制台执行如下:
city = [北京], date = [10月10日]
外部系统访问到了--->WeatherQueryImpl.queryNowTem
外部系统访问到了--->WeatherQueryImpl.query2Days
综上所述,webservice的优点有:
(1)采用xml支持跨平台远程调用。
(2)基于http的soap协议,可跨越防火墙。
(3)支持面向对象开发。
(4)有利于软件和数据重用,实现松耦合。
同时,webservice也有这样的缺点:由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而降低效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议进行数据传输的效率不高。
总的来说,从宏观上讲,webservice可以用于软件集成和复用。
从微观上来说,webservice适用场景有:
(1)用于接口服务。如果不考虑客户端类型,不考虑性能,建议使用:
a.用于公开接口服务。面向互联网公开的接口,例如:某公司产品促销介绍、股票信息查询等,因为webservice使用的soap协议是一个标准协议,其它公司使用标准协议通信,方便系统开发和维护。再比如:便民网站的天气查询接口、火车时刻查询接口等。
b.用于内部接口服务。一个大的系统平台是由若干个系统组成,系统与系统之间存在数据访问需求,为了减少系统与系统之间的耦合性可以将接口抽取出来提供单独的接口服务供其它系统调用。
c.服务端已经确定使用webservice,客户端无法选择,只能使用webservice。
不适用webservice的场景有:
a.对性能要求很高的应用,不建议使用webservice.比如银行交易系统、股票交易系统等,任何延迟都可能造成无法估量的损失。
b.同构程序之间通信不建议使用webservice。比如,Java中的RMI(Remote Method Invocation,远程方法调用,指能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法),同样可以实现远程调用,而且性能比webservice好很多。
WebService初识的更多相关文章
- webservice初识,SOAP1.1版本
客户端与服务端模式,非web端发布 1.1 [Jax-ws第一个例子] 1.1.1 第一步:服务端开发 编写SEI(Service Endpoint Interface),SEI在w ...
- 初识WebService
一.什么是Web服务 Web服务是一种可以用来解决跨网络应用集成问题的开发模式,目的是保证不同平台的应用服务可以互操作 二.Web服务的三个核心 Soap: SOAP(Simple Object Ac ...
- 初识webservice 服务
1.获取电话号码归属地查询 首先访问: http://www.webxml.com.cn/zh_cn/web_services.aspx ①新建一个MyEclipse项目(WebService) ht ...
- 初识服务发现及Consul框架的简单使用
初识服务发现及Consul框架的简单使用 1.什么是服务发现? 服务发现组件记录了(大规模)分布式系统中所有服务的信息,人们或者其它服务可以据此找到这些服务. DNS 就是一个简单的例子. 当然, ...
- WebService学习-第一弹
一:WebService简介(1)简介----百度百科(注意标识的重点) Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言 ...
- WCF系列教程之初识WCF
本随笔参考自WCF编程系列(一)初识WCF,纯属读书笔记,加深记忆. 1.简介:Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程 ...
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...
- 开始webservice了
一.WebService到底是什么 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用 ...
- Spring WebService入门
Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...
随机推荐
- 【转】Oracle 查询库中所有表名、字段名、表名说明、字段名说明
转自 :http://gis-conquer.blog.sohu.com/170243422.html 查询所有表名:select t.table_name from user_tables t; 查 ...
- 【刷题】BZOJ 1036 [ZJOI2008]树的统计Count
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...
- 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】
题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...
- 第一个python教程(1)
使用文本编辑器 在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为 ...
- Redis Scan迭代器遍历操作原理(一)
Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了, ...
- hihocoder 1580 dp最大子矩阵和
题意: 给出n*m的矩阵求最大子矩阵和,要求必须把矩阵中的某一个元素替换成p 代码: //求最大子矩阵和,容易想到压缩之后dp但是这道题要求必须替换一次p,必然优先替换最小的. //这样如果求得的结果 ...
- apk签名验证机制
声明: 1.本帖转载自:http://riusksk.blogbus.com/logs/272154406.html,仅供自用,勿喷 2.欢迎交流学习 签名后的APK,在/META-INF目录下会生成 ...
- .Net并行编程系列之一:并行基础
现在普通PC平台上面多核处理器的普及,让我们领教了能够利用多核进行并行计算的软件的处理能力,同时继承更多地核心正是当前处理器发展的趋势. 但是作为一个.NET开发人员,是否有时候会发现你的程序占用了其 ...
- Spring Boot + Swagger
前言: 在互联网公司, 微服务的使用者一般分为两种, 客户端和其他后端项目(包括关联微服务),不管是那方对外提供文档 让别人理解接口 都是必不可少的.传统项目中一般使用wiki或者文档, 修改繁琐,调 ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...