前言
Spring 支持使用各种技术进行远程处理。远程处理支持简化了远程支持服务的开发,这些服务通过 Java 接口和对象作为输入和输出来实现。目前,Spring 支持以下远程处理技术:
- Java Web Services : Spring 通过 JAX-WS 为 Web 服务提供远程处理支持
- AMQP : 单独的 Spring AMQP 项目支持通过 AMQP 进行远程处理作为底层协议
从 Spring Framework 5.3 开始,由于安全原因和更广泛的行业支持,对多种远程处理技术的支持现在已经不再推荐。在 Spring 框架的下一个主要版本中,支持性的基础设施将被移除。
以下远程处理技术现在已不推荐使用,不会被替换:
- Remote Method Invocation (RMI) : 通过使用 RmiProxyFactoryBean 和 rsiveviceexporter,Spring 支持传统的 RMI (使用
java.rmi.Remote
接口和java.rmi.RemoteException
) 和通过 RMI 调用器 (使用任何 Java 接口) 进行透明远程处理 - Spring HTTP Invoker (Deprecated) : Spring 提供了一种特殊的远程处理策略,允许通过 HTTP 进行 Java 序列化,并支持任何 Java 接口 (就像 RMI 调用器那样) 。相应的支持类是
HttpInvokerProxyFactoryBean
和HttpInvokerServiceExporter
- Hessian : 通过使用 Spring 的
HessianProxyFactoryBean
和HessianServiceExporter
,您可以通过 Caucho 提供的基于 http 的轻量级二进制协议透明地公开您的服务 - JMS (Deprecated) :
spring-jms
模块中的JmsInvokerServiceExporter
和JmsInvokerProxyFactoryBean
类支持通过 JMS 进行远程处理,作为底层协议
AMQP
Spring Remoting with AMQP 将在 Spring AMQP 项目 3.0 版本中被删除
选择技术时的考虑
这里介绍的每一种技术都有其缺点。在选择技术时,您应该仔细考虑自己的需求、公开的服务以及通过网络发送的对象。
在使用 RMI 时,您不能通过 HTTP 协议访问对象,除非您对 RMI 通信进行隧道化。RMI 是一个相当重量级的协议,因为它支持全对象序列化,当您使用需要通过连接进行序列化的复杂数据模型时,这一点非常重要。然而,RMI-JRMP 与 Java 客户机绑定在一起。它是一个 Java 到 Java 的远程处理解决方案。
如果您需要基于 HTTP 的远程处理,但又依赖于 Java 序列化,Spring 的 HTTP 调用程序是一个很好的选择。它与 RMI 调用器共享基本的基础设施,但使用 HTTP 作为传输。请注意,HTTP 调用器不仅限于 Java 到 Java 远程处理,还限于客户端和服务器端的 Spring 。(后者也适用于非 RMI 接口的 Spring 的 RMI 调用程序)
在异构环境中操作时,Hessian 可能提供重要的价值,因为它们显式地允许非 Java 客户机。然而,非 Java 支持仍然是有限的。已知的问题包括 Hibernate 对象的序列化以及以延迟方式初始化的集合。如果您有这样的数据模型,可以考虑使用 RMI 或 HTTP 调用器而不是 Hessian 。
JMS 可以用于提供服务集群,并让 JMS 代理负责负载平衡、发现和自动故障转移。默认情况下,Java 序列化用于 JMS 远程处理,但是 JMS 提供者可以使用不同的连接格式化机制,比如 XStream ,以便在其他技术中实现服务器。
最后但并非最不重要的一点是,EJB 比 RMI 有优势,因为它支持标准的基于角色的身份验证和授权以及远程事务传播。也可以让 RMI 调用器或 HTTP 调用器支持安全上下文传播,尽管核心 Spring 没有提供这种支持。Spring 只为插入第三方或自定义解决方案提供适当的挂钩。
Java Web Services
提供了对标准 Java Web Services API 的全面支持:
- 使用 JAX-WS 公开 web 服务
- 使用 JAX-WS 访问 web 服务
除了 Spring Core 中对 JAX-WS 的支持外,Spring 还提供了 Spring Web Services ,这是一种契约优先、文档驱动的 Web 服务解决方案,强烈推荐用于构建现代的、面向未来的 Web 服务。
其他略
RMI (Deprecated)
从 Spring Framework 5.3 开始,RMI 支持就已经过时,不会被取代。
使用 Hessian 通过 HTTP 远程调用服务 (Deprecated)
从 Spring Framework 5.3开始,Hessian 支持就已经过时,不会被取代。
Spring HTTP Invoker (Deprecated)
从 Spring Framework 5.3开始,HTTP Invoker 支持就已经过时,不会被取代。
JMS (Deprecated)
从 Spring Framework 5.3开始, JMS 远程处理就已经过时,不会被取代。