返回介绍

15.1 Spring 远程调用概览

发布于 2024-08-17 00:45:49 字数 2792 浏览 0 评论 0 收藏 0

远程调用是客户端应用和服务端之间的会话。在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要向能提供这些功能的其他系统寻求帮助。而远程应用通过远程服务暴露这些功能。

假设我们想把Spittr应用中的某些功能发布为远程服务并提供给其他应用来使用。或许除了现有的基于浏览器的用户界面,我们还想为Spittr应用提供桌面应用或移动端应用,如图15.1所示。为了实现此想法,我们需要把SpitterService接口的基本功能发布为远程服务。

图15.1 第三方客户端能够远程调用Spittr的服务,从而实现与Spittr应用交互

其他应用与Spittr之间的会话开始于客户端应用的一个远程过程调用(remote procedure call,RPC)。从表面上看,RPC类似于调用一个本地对象的一个方法。这两者都是同步操作,会阻塞调用代码的执行,直到被调用的过程执行完毕。

它们的差别仅仅是距离的问题,类似于人与人之间的交流。如果我们在公共场所的饮水机旁讨论周末足球比赛的结果,那我们就是在进行一个本地会话——两人之间的会话发生在同一房间内。同样,本地方法调用是指同一个应用中的两个代码块之间的执行流交换。

另一方面,如果我们拿起电话打给另一个城市的客户端,那我们之间的会话就是通过电话网络远程进行的。类似地,RPC调用就是执行流从一个应用传递给另一个应用,理论上另一个应用部署在跨网络的一台远程机器上。

正如我之前所述,Spring支持多种不同的RPC模型,包括RMI、Caucho的Hessian和Burlap以及Spring自带的HTTP invoker。表15.1概述了每一个RPC模型,并简要讨论了它们所适用的不同场景。

表15.1 Spring通过多种远程调用技术支持RPC

RPC模型

适用场景

远程方法调用(RMI)

不考虑网络限制时(例如防火墙),访问/发布基于Java的服务

Hessian或Burlap

考虑网络限制时,通过HTTP访问/发布基于Java的服务。Hessian是二进制协议,而Burlap是基于XML的

HTTP invoker

考虑网络限制,并希望使用基于XML或专有的序列化机制实现Java序列化时,访问/发布基于Spring的服务

JAX-RPC和JAX-WS

访问/发布平台独立的、基于SOAP的Web服务

不管你选择哪种远程调用模型,我们会发现Spring都提供了风格一致的支持。这意味着一旦理解了如何配置Spring来使用其中的一种模型,如果我们决定使用另外一种模型的话,将拥有非常低的学习曲线。

在所有的模型中,服务都作为Spring所管理的bean配置到我们的应用中。这是通过一个代理工厂bean实现的,这个bean能够把远程服务像本地对象一样装配到其他bean的属性中去。图15.2展示了它是如何工作的。

图15.2 在Spring中,远程服务被代理,所以它们能够像其他
Spring bean一样被装配到客户端代码中

客户端向代理发起调用,就像代理提供了这些服务一样。代理代表客户端与远程服务进行通信,由它负责处理连接的细节并向远程服务发起调用。

更重要的是,如果调用远程服务时发生java.rmi.RemoteException异常,代理会处理此异常并重新抛出非检查型异常RemoteAccessException。远程异常通常预示着系统发生了无法优雅恢复的问题,如网络或配置问题。既然客户端通常无法从远程异常中恢复,那么重新抛出RemoteAccessException异常就能让客户端来决定是否处理此异常。

在服务器端,我们可以使用表15.1所列出的任意一种模型将Spring管理的bean发布为远程服务。图15.3展示了远程导出器(remote exporter)如何将bean方法发布为远程服务。

图15.3 使用远程导出器将Spring管理的bean发布为远程服务

无论我们开发的是使用远程服务的代码,还是实现这些服务的代码,或者两者兼而有之,在Spring中,使用远程服务纯粹是一个配置问题。我们不需要编写任何Java代码就可以支持远程调用。我们的服务bean也不需要关心它们是否参与了一个RPC(当然,任何传递给远程调用的bean或从远程调用返回的bean可能需要实现java.io.Serializable接口)。

让我们通过RMI——Java最初的远程调用技术——来开始探索Spring对远程调用的支持吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文