WebService
背景
web服务,项目过大时,集中式开发就会过于冗杂,就需要拆分,如百度的不同模块,其中的不常用模块,就算做集群,也会一定程度上浪费了系统资源,且他们需要服务器的维护,会影响到常用功能块
这就引出了应用的分离,每一个应用模块就分成了一个个单一的应用程序。对常用的程序(如搜索、新闻等)进行集群,部署较多数的服务器给它。
好处是功能更加单一化,服务器的性能利用更有效。
每个应用之间可能会有公共服务,我们将公共服务提取出来,而每个功能仍然有自己的独立的服务
各个服务之间的通讯方式:http,可以通过socket进行数据交互
socket的缺陷
连接数量 随着通信的数量而增加(1.1中已经一个文件一个连接)
长连接 会一直占用连接资源
解决的方式:WebService
他允许服务器之间的通讯,而不像http局限于浏览器和服务器
WebService特点
使用xml文件传输数据?
缺点
数据类型并无法确认
使用xml+xsd +Http
特点
在文件中加了Soap(Http的上层协议)的数据类型相关技术
使用技术
WSDL
WebServiceDocumentLanguage
服务模式
服务提供者
是个应用,类似于公共服务(登录服务等)
发布
服务提供后,发送到发布中心
服务发布中心
拥有服务接口的路径,接口暴露给请求接受者

服务接受者
订阅
请求服务以使用
使用了代理设计模式;发布/订阅结构
使用框架
Apache的CXF
用来接收服务器请求,天生与spring有关系,有类似前端控制器等
非常接近于SpringMVC
支持的协议
SOAP
XML/HTTP
RESTful HTTP
CORBA
官网可以查源码
tar.gz格式分文件为linux系统的文件格式,win也可以用,但最好使用zip格式的
使用
1.配置pom,下载jar包
cxf的包若无法下载,则拷贝到本地库org.apache.cxf下
可以在apache CXF官网下载,导入后,去pom中修改成对应版本即可
2.写CXFServlet
3.到web.xml中配置cxfServlet
启动CXF框架,并且开启spring容器(小容器,类似speingmvc容器)
4.写cxf-servlet.xml
可以放到WEB_INF文件夹下
5.写WebService接口
接口上@WebService(targetMamespace="如http://xxx.xxx.xxx",serviceName=“xxxxxx”,portName="xxxxx")
将接标记成一个需要发布对外的服务接口
targetMamespace:为WSDL文档提供一个命名空间,任取(默认采用:包名倒置)
serviceName:.....服务名
portName="xxxxx" 服务端口
方法上@Mathod(operationName="method01")
将接口方法标记成一个隐藏方法
参数前@WebParam(name="arg0")
可以为接口写一个服务文档,供服务请求者阅读
6.写接口实现类
接口上@WebService(endpointInterface="所实现接口的全限定名")
此时表示它是那个接口的实现类
重写接口方法
7.在cxf-servlet.xml中发布服务接口
一个jaxws:server 算一个服务
address 指定网络路径
serviceClass 指定要发布的接口全限定名
bean class 所调用的接口的实现类
8.访问项目
可以看到方法
WSDL中
方法假名
参数类型 数量 等
使用需要: 路径 名称 服务端口
服务请求者
1.写WebService接口
阅读WSDL服务文档,获取接口提供的信息
接口上@WebService(targetNamespace="如http://xxx.xxx.xxx",serviceName=“xxxxxx”,portName="xxxxx")
与发布对外的服务接口 匹配
targetNamespace:匹配命名空间
serviceName:.....服务名
portName="xxxxx" 服务端口
2.测试类(产生接口代理)
使用需要: 路径 名称 服务端口
获得 Sercice 对象
获取接口的代理对象
IXX i = service.getPort()

 


测试类中
//地址 + 端口
private static final QName SERVICE_NAME = new QName("http://interfaces.soap.webservice.framestudy.org","LoginService");
private static final QName PORT_NAME = new QName("http://interfaces.soap.webservice.framestudy.org","LoginServicePort");


@Test
public void testLogin() {
//服务名
Service service = Service.create(SERVICE_NAME);
//终端地址
String endpointAddress = "http://localhost:8080/webservice/services/LoginService";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
ILoginService ls = service.getPort(ILoginService.class);//从远程连接中获取代理对象
然后即可调用接口的方法