Web service是什么?
我们可以这样理解什么是Web Service,它即是一种网络服务,当你在你电脑上完成一个通用的功能的时候,如果你想让别人一起使用的话(随着网络发展,知识应该共享)可以发不成为Web Service服务,举个我们身边的例子来说,每天天气预报都实时更新假如你的系统中也需要显示每天天气变化情况,你打算怎么做呢?难道要很傻的自己开发接口和实现吗,那样就太傻了,有专门提供Web 服务的接口,它们已经发布为了Web Service ,我们只需要查一查它的WSDL服务描述语言既可以知道都有哪些方法为我们提供了,这样岂不简单。
作为一个开发着说的专业点就是基于XML并利用SOAP协议实现跨平台信息传递的一种技术,这个服务通过网络为我们的程序提供服务方法。类似一个远程的服务提供者,那么什么时候会用到这种技术呢?
例如,百度、amazon,天气预报系统,淘宝网,QQ空间,facebook等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。
实现原理
先看一下这张图:
Web服务的体系结构是基于Web服务提供者、Web服务请求者、Web服务中介者三个角色和发布、发现、绑定三个动作构建的。简单地说,Web服务提供者就是Web服务的拥有者,它耐心等待为其他服务和用户提供自己已有的功能;Web服务请求者就是Web服务功能的使用者,它利用SOAP消息向Web服务提供者发送请求以获得服务;Web服务中介者的作用是把一个Web服务请求者与合适的Web服务提供者联系在一起,它充当管理者的角色,一般是UDDI。
这三个角色是根据逻辑关系划分的,在实际应用中,角色之间很可能有交叉:一个Web服务既可以是Web服务提供者,也可以是Web服务请求者,或者二者兼而有之。显示了Web服务角色之间的关系:其中,“发布”是为了让用户或其他服务知道某个Web服务的存在和相关信息;“查找(发现)”是为了找到合适的Web服务;“绑定”则是在提供者与请求者之间建立某种联系。
这是一个调用过程:
1.发布: Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册;
2.发现: Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务;
3.发现: Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;
4.绑定: 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;
5.绑定: Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。
SOAP协议(simple object access protocol)
SOAP协议= HTTP协议+ XML数据格式
SOAP协议是基于HTTP协议而形成,也可以理解为是HTTP协议的一个特例,一种扩展的情况,拿一个交通线路来说,如果将一个交通线拿来专门军用或者只允许运输某些规定好的东西,这些特殊的规定、条纹就相当于SOAP只用于传输简单的对象、对象方法、返回值等等。
HTTP协议和XML是被广泛使用的通用技术,各种编程语言对HTTP协议和XML这两种技术都提供了很好的支持,WebService客户端与服务器端使用什么编程语言都可以完成SOAP的功能,所以,WebService很容易实现跨编程语言,跨编程语言自然也就跨了操作系统平台
Web Service框架
AXIS和CXF是我们经常使用的两个框架,这两个产品都是Apache孵化器下面的Web Service开源开发工具。它们各有利弊根据需要合理选择使用哪一个框架,主要区别如下:
1.CXF支持 WS-Addressing,WS-Policy, WS-RM, WS-Security和WS-I Basic Profile。Axis2不支持WS-Policy。
2.CXF可以很好支持Spring。Axis2不能
3.AXIS2支持更广泛的数据并对如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。注意JaxME和JaxBRI都还是试验性的。CXF只支持JAXB和Aegis。在CXF2.1
4.Axis2支持多语言-除了Java,他还支持C/C++版本。
世界你好的实例
该实例使用了CXF框架,需要如下jar包考入到jboss里
服务器端接口
package mgr.jc.webservice.fortest; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService(name = "IUserBean", targetNamespace = "http://fortest.webservice.jc.mgr/") @SOAPBinding(style = SOAPBinding.Style.DOCUMENT) public interface IUserBean { public String sayHello(String name); }
服务器实现
import mgr.jc.webservice.fortest.IUserBean; @Stateless @Remote( IUserBean.class) @TransactionManagement(TransactionManagementType.CONTAINER) @TransactionAttribute(TransactionAttributeType.REQUIRED) @WebService(endpointInterface = "mgr.jc.webservice.fortest.IUserBean",serviceName = "UserService") public class UserBeanImpl implements IUserBean { @Override @WebMethod public String sayHello(String name) { System.out.print("-------------UserManagerBean.sayHello-------begin------"); System.out.print("-------------UserManagerBean.sayHello-------end------"); return name+"说,世界你好"; } }
客户端
package mgr.jc.service.client.fortest.impl; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagementType; import mgr.jc.service.client.fortest.IClientUserBean; import mgr.jc.webservice.fortest.IUserBean; import common.tool.mgr.BaseMgr; @Stateless @Remote(IClientUserBean.class) @TransactionManagement(TransactionManagementType.CONTAINER) @TransactionAttribute(TransactionAttributeType.REQUIRED) public class ClientUserBeanImpl extends BaseMgr { private IUserBean service; public static void main(String[] args) { ClientUserBeanImpl clientUserBeanImpl=new ClientUserBeanImpl(); clientUserBeanImpl.sayHello(); } public ClientUserBeanImpl(){ System.out.println("-------------构造函数里面创建服务--------begin-----"); service=(IUserBean)getWebServiceBean(this.getClass(), "user-userservice"); System.out.println("--------------构造函数里面创建服务--------end-----"); } public void sayHello() { System.out .println("-------------UserManagerBean.sayHello--------begin-----"); System.out.println(service.sayHello("李龙生")); System.out .println("-------------UserManagerBean.sayHello------end-------"); } }
客户端配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans> <webservice-beans> <webservice-bean id="user-userservice"> <property name="name" value="mgr.jc.webservice.fortest.IUserBean"/> <property name="url" value="http://localhost:8080/gxpt_mgr_jc_service_fortest_impl-0.0.1-SNAPSHOT/UserBeanImpl"/> </webservice-bean> </webservice-beans> </beans>
运行之后的效果图如下:
在上面例子中主要用到了注解将java方法声明为Web Service方法,并遵循SOAP协议传输数据,在客户端在构造函数里通过反射和配置文件(一些WSDL文件信息都写在了配置文件里面)将服务对象注入进来,进而实现了Web Service的调用。
小结
在新—代的分布式应用系统中,必须解决不同组件模型、开发工具、程序语言和应用系统之间在Intemet环境中互相沟通和合作的问题,因此软件界势必要一种标准的沟通机制,而这种机制正式现在的SOAP。
Web Service 与云计算也有着密切联系,可以说云计算为Web Service服务创建了一个运行平台,我们可以把一些服务发布到云上面,可以轻松的实现任意组合,同时Web Service也为云技术的实现提供了可能,Webservice也会越来越重要。