- 1. 学习及工作目标:
WebService,ESB,应用学习
2.学习方法:
3.学习内容:
4.学习笔记:
一、 WebService概述
(一) 关于WebService
WS是一种基于Http协议和XMl技术,并使用WSDL描述和使用SOAP协议传输的异构系统解决方案。 跨语言、跨系统
我们把调用WS的应用程序称为客户端,把提供WS的应用程序称为服务器端。
使用WS最重要的是什么:
一是:WSDL文件(服务藐视);
二是:对象与XML转换(数据)。
(二) 关于SOA
SOA(Service-Oriented Architecture)既服务导向架构,是指为了解决在inernet环境下业务集成的需要,通过连接能完成特定任务的独立功能实现的一种软件系统架构。该定义的学术味道较浓,但其核心思想并不难理解:让应用不受限于技术,让企业轻松应对商业服务变化和发展的需要。目前,SOA的实现手段主要包括:Web Serice(网络服务)、CORBA和JINI等。
(三) 关于ESB
ESB全称为EnterpriseServiceBus,即企业服务总线。
它是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合。从功能上看,ESB提供了事件驱动和文档导向的处理模式,以及分布式的运行管理机制,它支持基于内容的路由和过滤,具备了复杂数据的传输能力,并可以提供一系列的标准接口。
(四) SOA,ESB,WebService的关系
SOA是方法论,就像建筑学一样,指导性质的;
ESB是建筑图纸,理顺整个建筑的架构;
Web S是具体的建筑材料,就好像预制板;
Web Service是技术规范,而SOA是设计原则,一种架构模式。
WSDL,UDDI和SOAP是SOA基础的基础部件。
(五) 问题:
第一,ESB怎么知道有哪些什么样服务?那此时我们就得对暴露出去的服务做一个描述,而这个描述就是WSDL。
WSDL(WebServicesDescriptionLanguage):WS的描述语言。告诉总线自己暴露了哪些服务。
第二,查询:我暴露了这个服务,要找到他则需要一个类似于DNS这样的东西,用于服务的注册、查询,而这个就是UDDI。
UDDI(Universal Description,Discovery andIntegration):是一种目录服务,用于统一地描述、发现和集成协议。UDDI定义如何查找WS(及其WSDL文件),但很多时候,使用者都知道Web服务的位置(通常位于公司的企业内部网中)。
第三,传输数据:定义数据传输规范,这里都使用XML进行传递,把对象和XML进行转换由SOAP规范。
SOAP(Simple Object Access Protocol):简单对象访问协议。是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。作为传输层,用来在客户端和服务器端之间传送消息。
二、关于WebService的常见标签
1、 @WebService标签
使用@WebService标签,需要配置在类上,代表这是一个提供WS的服务类。
endpointInterface:定义服务抽象WebService 协定的服务端点接口的完整名称。不允许在端点上使用此成员值,该元素的值必须有WebService标签。默认情况下,服务器自动生成服务端接口。
name:服务接口名称(对应wsdl: portType的name属性,用在服务接口上);
serviceName:服务类名称。默认为,实现类名+Service(对应service的name和definition上的name属性对应,用在实现类上)。
portName:Web Service的端口名称。此名称被用作wsdl:port的名称。
targetNamespace:目标命名空间,描述服务的预定义WSDL的位置(同时用在实现类和服务接口上,需统一)。
wsdlLocation:WSDL地址(服务端除了WSDL优先的情况外可不写,客户端代理接口上必须配置此属性,指向web端WSDL文件地址)
2 @WebMethod标签
使用@WebMethod标签,需要把他配置到方法上。
operationName:指定暴露服务方法的别名。
exclude:是否暴露此标记的方法。
3 @WebResult标签
使用@WebResult标签,需要把他标记在方法上或者方法返回类型定义之前。
name:定义返回值的名称。
header:布尔类型,是否把值放到header元素中进行传递。
4 @WebParam标签
使用@WebParam标签,需要把他标记在形参声明之前。
name:定义传递时参数的名称(默认参数以arg0,arg1…)。
header:布尔类型,是否把值放到header元素中进行传递。
5 @SOAPBinding
使用@ SOAPBinding标签,需要把他标记在类上。
SOAPBinding.ParameterStyleparameterStyle 确定方法参数是否表示整个消息正文,或者参数是否是包装在以操作命名的顶层元素中的元素。
SOAPBinding.ParameterStyle.WRAPPED,默认,使用对参数进行包装
SOAPBinding.ParameterStyle.BARE,不对参数进行包装
SOAPBinding.Style style 定义发 送到Web Service 的消息 和从Web Service发送的消息的编码样式。
SOAPBinding.Style.RPC:面向RPC
SOAPBinding.Style.DOCUMENT 默认,面向文档
SOAPBinding.Useuse 定义发送到WebService的消息和从WebService发送的消息的格式样式。
SOAPBinding.Use.LITERAL,默认,字面量风格,若服务端和客户端不在一起开发,就应该使用这个
SOAPBinding.Use.ENCODED使用SOAP编码风格,可能导致WS互操作方面失败问题,尽量避免使用。
三、WebService实现
(一) 服务端
第一步: 创建一个java工程,不需要导入jar包。
第二步: 创建接口。在Webservice中叫做SEI(wsdl中叫做PortType)。
第三步: 创建实现类。需要在实现类上加一个@Webservice注解。
第四步: 发布服务。EndPoint.publish发布服务。
(1) 接口:WeatherInterface.java
import javax.jws.WebService;
@WebService
public interface WeatherInterface {
String getWeatherByCity(String city);
}
(2) 实现:WeatherInterfaceImpl
@WebService
public class WeatherInterfaceImpl implements WeatherInterface{
@Override
public String getWeatherByCity(String city) {
System.out.println("接收客户端发送过来的城市名字:"+city);
//调用天气等服务
//....
//这里模拟所以直接返回结果
String result = "天气比较冷";
System.out.println("返回天气查询结果:"+result);
return result;
}
}
(3) WeatherServer.java 发布服务
public class WeatherServer {
public static void main(String[] args){
WeatherInterface server = new WeatherInterfaceImpl();
String address = "http://192.168.31.159:1111/WeatherInterface";
Endpoint.publish(address, server);
}
}
(4) 使用浏览器服务是否发布成功,访问wsdl:http://192.168.31.159:1111/WeatherInterface?wsdl
(二) 客户端
1) 客户端代码编写,可以采用工具生成:
2) 编写client的调用即可:
第1步:创建服务视图对象。
第2步: 从服务视图中获得PortType对象。
第3步: 调用PortType的方法(可以实现远程通信)
第4步: 接收方法的返回值(服务端响应的结果)。
public class Client{
public static void main(String[] args) {
WeatherInterfaceImplService server = new WeatherInterfaceImplService();
WeatherInterfaceImpl impl = server.getWeatherInterfaceImplPort();
System.out.println(impl.getWeatherByCity("北京"));
}
}