RPC(Remote Procedure Call)是一种非常重要的分布式交互技术,如图2-25所示,RPC希望达到的目的是调用远程对象与调用本地对象的编程接口一致。
调用本地对象,需要获取对象的引用或对象的动态代理,RPC封装了远程对象的接口(skeleton),同时在本地创建远程对象的代理(stub),然后通过本地的stub访问远程的对象方法。远程通信技术手段使用sockets,这些属于RPC的底层机制,不需要对开发人员暴露。
图2-25 RPC架构图

Web服务架构如图2-26所示。Web服务可以发布在Internet网络服务器上,它的调用者可以是广域网上的任何授权用户,典型的Web服务如支付宝给商家提供支付接口)、天气预报、公安部公民身份查询等。
图2-26 Web服务架构
为了能够实现广域网的服务访问,Web服务使用的是SOAP。
SOAP包含以下四部分。
· SOAP封装(envelop):封装定义了描述消息中的内容是什么,是谁发送的,谁应当接收并处理它们,以及如何处理它们。
· SOAP编码规则(encoding rules):用于表示应用程序需要使用什么数据类型,如何编排数据等。
· SOAP RPC表示(RPC representation):表示远程过程调用和应答的协定。
· SOAP绑定(binding):定义如何使用底层协议交换信息。
SOAP可以简单地理解为:SOAP = RPC + HTTP + XML,采用HTTP作为底层通信协议,允许服务提供者和服务调用者通过网络防火墙在Internet上进行通信交互。
· RPC作为远程接口调用方式。
· XML作为数据传送的格式(充分利用XML的自描述性来描述接口)。
WSDL(Web Service Description Language,Web服务器描述语言)是用XML文档来描述Web服务的标准,是Web服务的对外接口定义语言。
UDDI(Universal Description Discovery and Integration),即统一描述、发现与集成协议标准,Web服务的用户通过UDDI搜索查找Web服务。
创建Web服务图2-27 Web服务分包结构
Java平台下的Web服务开发,通常使用Xfire、Axis2、CXF等几种框架实现。Web服务可以发布到Tomcat服务器上。
基于Eclipse,创建“动态Web项目”或Maven Web项目,即可作为Web服务项目,无须使用Web Service Project向导。
如图2-27所示,这是基于CXF创建的Web服务项目的分包结构。CXF是当前最为流行的Web服务开发框架,是使用Spring框架包装了Xfire框架后的产品。
在web.xml中,定义了一个名字为CXFServlet的Servlet组件,通过监听器,在Tomcat启动时创建Spring容器,并加载beans.xml配置文件。
web.xml的配置信息如下
编写Web服务
基于CXF3.2.14开发Web服务的操作步骤如下。
(1)定义Web服务的对外接口(注意:需要通过注解@WebService和@WebMethod来声明对外服务的接口方法)
(2)定义Web服务接口的实现类。
@WebService
public class UserBiz implements IUser{
}
(3)编写用户登录方法(注意:需要动态获取客户端请求信息的详细日志)。
(4)在beans.xml中配置Web服务的对外访问地址。
Web站点调用Web服务
可以在桌面App或Java Web应用中调用远程Web服务,如图2-28所示,com.icss.sentity、com.icss.service、com.icss.sexception等包及其下面的内容,都来源于Web服务,这些内容是Web服务的本地代理。
理论上,Web服务客户端程序与远程的Web服务应该是完全解耦的,即客户端程序可以不关注Web服务是使用什么框架来发布的,但是在实际开发中可能会遇到很多问题。
因此,示例的Web服务客户端程序,仍然使用CXF3.2.14框架。
Java Web应用调用远程Web服务的操作步骤如下。
(1)导入CXF3.2.14以及相关jar包。
(2)导入IUser、User、InputEmptyException等类和接口,在Java Web应用中构建远程Web服务的代理stub。
(3)编写CXF配置文件client-beans.xml,声明远程Web服务的调用对象
图2-28 Web服务客户端分包
(4)单例模式,封装Spring容器的创建。
(5)在控制LoginSvl中,调用远程Web服务,实现用户登录。