分布式系列六: WebService简介
WebSerice盛行的时代已经过去, 这里只是简单介绍下其基本概念, 并用JDK自带的API实现一个简单的服务.
WebSerice的概念
WebService是一种跨平台和跨语言的远程调用(RPC)技术. 它基于Http和Xml. 而上一篇分布式系列五: RMI通信中提到的RMI是基于Socket的, 底层协议是JRMP协议.
特点
跨语言, 自描述, 开放性
几个术语
- WSDL(Web Service Definition Language): 服务定义语言, 描述服务特征, 服务可以对外提供什么服务, 并定义了交互的数据格式.
- SOAP(Simple Object Access Protocol) 简单对象访问协议: 基于http , 发送的格式是xml.
- SEI(Webservice Endpoint Interface) 服务终端接口: 服务端用来处理请求的接口.
实现方式
使用JDK提供的API
先定义服务端使用的接口和实现, 并启动一个服务
一. 定义服务接口, 并用@WebService
标记接口, 使用@WebMethod
标记接口方法
@WebService
public interface ICar {
@WebMethod
String getName();
}
二. 定义接口实现, 使用@WebService
标记实现类
@WebService
public class BMWCar implements ICar {
@Override
public String getName() {
return "宝马汽车...";
}
}
三. 启动服务端
public class WsServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8090/car",new Car());
}
}
服务端已经完成, 接下来是客户端调用的部分
四. 生成调用
需要使用jdk的工具wsimport.exe生成调用文件, 首先启动服务, 然后在服务端代码所在路径运行命令: wsimport -keep http://localhost:8090/car?wsdl
. 这时会在包内生成客户端所需调用文件.
五. 定义客户端调用
public class Client {
public static void main(String[] args) {
BMWCarService service = new BMWCarService();
com.xlx.ws.client.BMWCar car = (com.xlx.ws.client.BMWCar) service.getBMWCarPort();
System.out.println(car.getCarName());
}
}
上面使用JDK的API实现一个简单的WebService.
在浏览器中输入http://localhost:8090/car?wsdl 可以查看wsdl文档, 可以看到这个xml的内容还是很多的.对于复杂对象的定义这个文档会变得越来越大, 甚至有些对象无法用其表述导致丢失. 另外xml本身传输量要大于json, 因此现在WebService目前已经逐渐退出主流的技术框架.
Spring 使用的是CFX框架集成了WebService.可以实现rest形式的webservice服务.