首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 遠程訪問與 Web Service 整合指南:RMI、HTTP Invoker、Hessian、Burlap 四大協議對比

     編輯:Java 相關知識

Spring 將遠程調用抽象為 Service Exporter(服務端)與 Proxy FactoryBean(客戶端)雙邊配置,POJO 業務邏輯零侵入即可發布為遠程服務。本文系統梳理四大協議配置要點、優缺點對比與選型建議。

統一領域模型

public class Account implements Serializable { private String name; ... }
public interface AccountService {
    void insertAccount(Account acc);
    List getAccounts(String name);
}
public class AccountServiceImpl implements AccountService { ... }

協議一:RMI(Java 原生)

服務端

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="AccountService"/>
    <property name="service" ref="accountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
    <property name="registryPort" value="1199"/>
</bean>

客戶端

<bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://HOST:1199/AccountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
</bean>

特點: Java-to-Java、完整對象序列化、防火牆不友好(隨機端口)、無標準安全/事務傳播。

協議二:Spring HTTP Invoker

基於 HTTP + Java 序列化,穿透防火牆,仍限 Java-to-Java。

服務端(需 DispatcherServlet)

<bean name="/AccountService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
    <property name="service" ref="accountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
</bean>

客戶端

<bean id="httpInvokerProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    <property name="serviceUrl" value="https://remotehost:8080/AccountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
    <!-- 可選:使用 Commons HttpClient -->
    <property name="httpInvokerRequestExecutor">
        <bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"/>
    </property>
</bean>

協議三:Hessian(二進制 HTTP,跨語言)

Caucho 開發,輕量高效,支持非 Java 客戶端(Python、PHP、C# 等)。

服務端

<bean name="/AccountService" class="org.springframework.remoting.caucho.HessianServiceExporter">
    <property name="service" ref="accountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
</bean>

客戶端

<bean id="accountService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
    <property name="serviceUrl" value="https://remotehost:8080/AccountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
</bean>

協議四:Burlap(XML HTTP,Hessian 文本版)

配置同 Hessian,僅將類名替換為 BurlapServiceExporter/BurlapProxyFactoryBean。可讀性強但體積大、解析慢,**生產環境首選 Hessian**。

安全增強:HTTP Basic Auth

利用 Spring MVC 攔截器:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list><ref bean="authorizationInterceptor"/></list>
    </property>
</bean>
<bean id="authorizationInterceptor" class="org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor">
    <property name="authorizedRoles">
        <list><value>administrator</value><value>operator</value></list>
    </property>
</bean>

生產建議接入 Spring Security / OAuth2 替代簡單角色攔截。

選型決策矩陣

維度RMIHTTP InvokerHessian/Burlap
傳輸協議JRMPHTTPHTTP
序列化Java 原生Java 原生Hessian 二進制 / XML
跨語言❌❌✅
防火牆友好❌✅✅
複雜對象圖✅✅⚠️ 延遲加載集合易失敗
事務傳播需自定義需自定義不支持

最佳實踐建議

  1. 純 Java 內網、需分布式事務 → **RMI + JTA** 或 **EJB**。
  2. 純 Java、需 HTTP 穿透、複雜對象圖 → **HTTP Invoker**。
  3. 異構語言調用、高性能、簡單對象 → **Hessian**。
  4. 需調試可讀性、對性能不敏感 → **Burlap**。
  5. 現代微服務架構建議直接採用 **REST (Spring MVC/WebFlux)** 或 **gRPC**,Spring Remoting 屬經典模式,新項目謹慎採用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved