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);//从远程连接中获取代理对象
		然后即可调用接口的方法
 
                    
                 
