webservice这个东西已经是一个比较旧的技术了,可能很多人都没听说过,乍一听是不是跟websocket有关呀,哈哈哈,其实压根就是两个东西;
我对webservice的理解是:远程服务器有一个微服务,暴露了一个接口和一个方法,你可以直接调用这个远程方法,如同本地的方法一样;
提前须知:常用开发webservice的方式一般两种,一种是jdk自带的方式,一种是使用apache的CXF框架,我们这里使用原生的jdk自带的方式
1.为什么要有webservice
现在编程语言这么多,有没有办法屏蔽掉编程语言的差异性,使得不同开发语言开发的系统能够协同工作。例如可不可以用js开发的系统能够和java开发的系统进行通信?当然可以呀╮(╯_╰)╭,有经验的人已经知道了,你妹,这不就是前后端分离么?前端可以使用vue开发,后端使用java开发,基于http请求以json的格式进行数据的交换,就可以使得两种不同需要开发的应用达到通信的目的;
webservice就是差不多的这么一个技术,分为客户端和服务端,服务端随意用什么语言开发,只要最后发布成webservice服务就行!客户端我们这里使用java,通过http+xml去调用webservice服务
道理是不是很容易,其实这里我们需要关注的就是几个点:
(1).怎么知道远程的服务暴露的地址和方法呢?
答:发布webservice的服务端会提供一个url(例如天气预报的webservice的url文档:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL),这个url我们打开就是一个文档,可以使用jdk中自带的工具生成一大堆java文件,我们直接使用
(2)客户端怎么是通过什么协议调用呢?
答:首先根据提供的url生成的java文件,然后一般底层通过http+xml的方式调用,这种也叫做soap调用;
2. webservice服务端发布服务
其实一般情况我们是不会开发webservice服务端的,你想想你有啥数据需要给别的公司或者组织使用的?不过这里我们还是使用java语言(其他语言也行)来自己也发布一下webservice服务;
接口:
到这里我们的webservice服务端已经弄好了,然后我们浏览器中访问http://localhost:8888/Webservice?wsdl,就能看到下面这种文档(注意,文档从下往上看);
随便看看这个文档应该能看到我们发布的服务的基本接口信息了,如果想详细的了解这种wsdl文档结构的,可以自行去百度了解
3. webservice客户端调用
实际的场景如果我们要去调用远程的webservice服务,别人会把这个wsdl文档的url发给我们的;
在jdk中安装目录下的bin目录下有个小工具wsimport,使用命令:wsimport -s ./ http://localhost:8888/Webservice?wsdl,这样就可以根据文档直接生成我们需要的java和class文件,然后丢到我们的项目下面
如果想指定包名,可以使用这个命令:wsimport -s ./ -p com.skd.client http://localhost:8888/Webservice?wsdl
这里的-s参数表示生成java文件和class文件
开始调用,其实就跟使用本地的类一样,很容易的吧!
4.service服务端优化
前面发布webservice服务是通过在main方法中,但是在项目中这这种方式肯定不行!
1.javaweb应用发布webservice服务,我们将发布接口的方法放入到一个servlet中的init方法,然后在web.xml中配置一个servlet(这里需要设置一下<load-on-startup></load-on-startup>),只在应用启动的时候就会执行init方法
2. javaweb应用发布webservice服务,使用监听器的方式,例如像下面这样(这个代码随便找的)
3.spring应用发布webservice服务,将提供服务的类放到spring容器中,也就是加个注解@Service,然后在这个bean的构造器中发布服务,这样在spring容器启动的时候会实例化这个bean,调用构造器达到发布webservice服务的目的
4. springboot发布webservice服务方式就更多了,自行可以去了解,总之怎么方便怎么来,看每个人的爱好吧!
5. webservice的优缺点
说了这么多,我们知道了其大概的用法,优点很明显,实现了应用的解耦,不需要关注编程语言的差异;
缺点也比较明显,由于是http+xml的格式进行数据传输和解析,效率不可避免的慢,所以一般新的项目也不会使用webservice这种方式;
有兴趣的可以看看开源的常用的webservice服务url:点击这里