当前位置: 首页 > news >正文

Spring远程调用与Web服务全解析

一、整体结构概览

文档分为以下几个主要部分:

章节内容
1. Remoting and Web Services总览 Spring 支持的远程调用技术
1.1 RMI使用 Java RMI 实现远程调用
1.2 Hessian使用 Hessian(二进制 HTTP 协议)进行远程调用
1.3 Spring HTTP Invoker基于 HTTP + Java 序列化的 Spring 自有协议
1.4 Java Web Services (JAX-WS)标准的 SOAP Web Services 支持
1.5 JMS使用消息队列(JMS)作为底层通信机制
1.6 AMQP使用 AMQP 协议(如 RabbitMQ)进行远程调用
1.7 技术选型考虑各种技术的优缺点对比与选择建议
1.8 REST Endpoints推荐现代方式:RestTemplateWebClient

二、核心概念解析

✅ 什么是“远程调用”(Remoting)?

在分布式系统中,一个服务运行在 A 机器上,另一个服务运行在 B 机器上。如果 A 想要调用 B 的方法,就像调用本地方法一样方便,这就叫 远程过程调用(RPC)或远程调用(Remoting)

Spring 的 remoting 模块的目标就是:让远程方法调用看起来像本地方法调用一样简单,开发者只需关注接口和业务逻辑,而网络传输、序列化、代理等由 Spring 自动完成。

✅ 关键组件模式

几乎所有 Spring Remoting 技术都遵循以下两个核心组件的设计模式:

组件作用
XXXServiceExporter【服务端】把一个 Java Bean 导出为远程可访问的服务(例如 RmiServiceExporter, HessianServiceExporter
XXXProxyFactoryBean【客户端】创建一个代理对象,隐藏远程调用细节,让调用者感觉像在调用本地对象

💡 你可以把 Exporter 看作“发布服务”,ProxyFactoryBean 看作“消费服务”。


三、每种远程技术详解

1.1 RMI(Remote Method Invocation)

  • 协议:Java 原生 RMI,基于 TCP。
  • 特点
    • 只能用于 Java 到 Java 的通信。
    • 支持完整的 Java 对象序列化。
    • 需要启动 RMI 注册中心(Registry)。
  • Spring 封装
    • RmiServiceExporter:导出服务。
    • RmiProxyFactoryBean:客户端获取代理。
  • 缺点
    • 不支持跨语言。
    • 默认端口 1099,容易冲突。
    • 跨防火墙困难(非 HTTP)。

📌 示例:rmi://localhost:1199/AccountService


1.2 Hessian(推荐用于跨语言)

  • 协议:二进制 HTTP 协议(Caucho 公司开发)
  • 特点
    • 基于 HTTP,穿透防火墙更容易。
    • 支持跨语言(Java、PHP、Python 等都有实现)。
    • 性能好,体积小。
  • Spring 封装
    • HessianServiceExporter:服务端导出。
    • HessianProxyFactoryBean:客户端代理。
  • URL 示例http://host:8080/remoting/AccountService
  • 安全性:可以结合 HTTP Basic Auth 或 Spring Security。

⚠️ 注意:某些复杂对象(如 Hibernate 懒加载集合)可能无法序列化。


1.3 Spring HTTP Invoker

  • 协议:HTTP + Java 序列化
  • 特点
    • 使用标准 Java 序列化机制。
    • 必须两端都是 Spring 应用。
    • 支持任意 Java 接口和复杂对象。
  • 优势:适合内部微服务之间调用,支持复杂 DTO。
  • 严重风险
    • Java 反序列化漏洞:攻击者可以通过构造恶意数据,在反序列化时执行任意代码!
    • 不要暴露给外部不可信客户端!
  • 建议
    • 仅用于内部可信服务间通信。
    • 推荐改用 JSON(如 REST)或启用 JVM 的反序列化过滤器(JEP 290)。

1.4 JAX-WS(标准 Web Services)

  • 协议:SOAP over HTTP
  • 标准:Java EE 标准,支持 WSDL、UDDI、SOAP。
  • Spring 支持方式
    • Servlet 模式:通过 @WebService 注解 + SpringBeanAutowiringSupport 实现依赖注入。
    • Standalone 模式:使用 JDK 内置 HTTP 服务器导出服务。
    • JAX-WS RI + Spring 集成:更灵活,适合非 Java EE 环境(如 Tomcat)。
  • 客户端访问
    • JaxWsPortProxyFactoryBean:创建本地代理,像调用本地方法一样调用远程 SOAP 服务。
  • 缺点
    • 配置复杂。
    • 性能较低(XML 解析开销大)。
    • 已逐渐被 REST 取代。

1.5 JMS(消息中间件)

  • 协议:基于消息队列(如 ActiveMQ、RabbitMQ)
  • 特点
    • 异步通信,解耦服务。
    • 支持负载均衡、故障转移、集群。
    • 可靠性高(消息持久化)。
  • Spring 封装
    • JmsInvokerServiceExporter + SimpleMessageListenerContainer:服务端监听消息并调用服务。
    • JmsInvokerProxyFactoryBean:客户端发送消息并等待响应。
  • 适用场景
    • 高并发、高可用系统。
    • 不要求实时响应的场景。

1.6 AMQP

  • 协议:高级消息队列协议(如 RabbitMQ)
  • 项目:Spring AMQP(独立项目)
  • 特点:比 JMS 更现代、更灵活,支持路由、交换机等高级特性。
  • 用途:适用于复杂的异步通信架构。

四、技术选型建议(1.7节)

技术优点缺点适用场景
RMIJava 原生,支持复杂对象仅限 Java,不跨语言,难穿透防火墙内部 Java 系统
Hessian跨语言,HTTP 协议,性能好某些对象序列化有问题跨语言调用,性能敏感
HTTP Invoker支持任意 Java 类型,Spring 原生仅限 Spring + Java,反序列化风险高内部 Spring 服务间调用
JAX-WS标准化,企业级,支持事务/安全复杂,性能差企业集成、遗留系统对接
JMS/AMQP异步、可靠、解耦、高可用复杂,延迟较高消息驱动、事件驱动架构
REST (推荐)简单、跨语言、现代、性能好需手动处理错误、序列化等现代微服务首选

五、REST 是现代推荐方式(1.8节)

文档明确指出:

❗️RestTemplate 已进入维护模式(maintenance mode),不再接受新功能。

推荐使用 WebClient:非阻塞、响应式、支持同步/异步/流式调用。

RestTemplate 主要方法

方法用途
getForObject()GET 请求,返回对象
postForLocation()POST 创建资源,返回 Location
put()PUT 更新
delete()DELETE 删除
exchange()通用方法,支持自定义请求头、方法等
execute()最底层,完全控制请求和响应

消息转换器(HttpMessageConverter)

Spring 使用 HttpMessageConverter 自动处理对象 ↔ JSON/XML 的转换:

  • MappingJackson2HttpMessageConverter:JSON 支持(最常用)
  • StringHttpMessageConverter:字符串
  • FormHttpMessageConverter:表单提交
  • ByteArrayHttpMessageConverter:二进制数据

六、重要安全提示

  1. Java 反序列化漏洞(HTTP Invoker、RMI)

    • 攻击者可构造恶意 payload,导致远程代码执行(RCE)。
    • ✅ 解决方案:
      • 不对外暴露 HTTP Invoker 端点。
      • 使用 JVM 的反序列化过滤器(JEP 290)。
      • 改用 JSON 或 Protocol Buffers。
  2. Hessian 安全

    • 可结合 HTTP Basic Auth 或 Spring Security。
    • 不要使用弱密码。
  3. JAX-WS 安全

    • 可集成 WS-Security 标准(用户名/密码、证书等)。

七、总结:如何理解这篇文档?

🔑 核心思想

Spring 的 Remoting 模块让你像调用本地方法一样调用远程服务,屏蔽网络细节。

🧭 使用流程(通用模式)

  1. 定义接口(如 AccountService
  2. 实现接口(如 AccountServiceImpl
  3. 服务端:用 XXXServiceExporter 导出服务
  4. 客户端:用 XXXProxyFactoryBean 创建代理
  5. 调用:像调用本地方法一样使用代理

🚀 现代开发建议

场景推荐技术
新项目、微服务REST + WebClient
内部高性能调用gRPC(文档未提,但比 Hessian 更好)
跨语言调用RESTgRPC
异步解耦JMS/AMQP + Spring Messaging
企业集成JAX-WS(对接老系统)
避免使用❌ RMI、HTTP Invoker(除非内部可信环境)

八、学习建议

  1. 动手实践:尝试用 Hessian 或 REST 实现一个简单的远程调用。
  2. 对比测试:比较 RMI、Hessian、REST 的性能和易用性。
  3. 关注安全:了解 Java 反序列化漏洞(CVE-2015-4852 等)。
  4. 进阶学习
    • Spring Boot + RESTful API
    • Spring WebFlux + WebClient(响应式编程)
    • gRPC(Google 的高性能 RPC 框架)

如果你是初学者,建议从 REST + WebClient 入手;如果是维护老系统,可能会遇到 Hessian 或 RMI。但长远来看,REST 和 gRPC 是主流方向

需要我帮你画一张 Spring Remoting 技术选型对比图吗?或者写一个简单的 Hessian 示例代码?

http://www.dtcms.com/a/549639.html

相关文章:

  • 手机站喝茶影视茂名市建设银行网站
  • 青岛做网站公司排名淄博网站建设yx718
  • 303-Spring AI Alibaba NL2SQL 向量管理示例
  • 【CVPR 2025】即插即用GBC模块:小体积,大能量,重塑特征提取新范式
  • Linux系统编程 -- 进程概念(一)
  • React 入门 02:从单页面应用到多页面应用
  • 石家庄网站建设找哪家好河西网站建设优化seo
  • h5网站怎么做api对接赣州人才招聘网
  • 生产管理系统详解:物料清单bom 工序,工艺路线中的工序和工艺资源他们之间有什么关联和区别
  • 发布元服务配置应用分类、标签和资质信息(仅分发手表设备)
  • 成绩查询系统如何制作?
  • 中国建设银行信用卡官网站首页个人做商机网站如何盈利
  • springboot酒店客房管理系统设计与实现(代码+数据库+LW)
  • 交叉编译工具链深度解析 --静态库与动态库编译实战指南
  • uni-app 开发APP应用媒体处理与文件管理功能
  • 网站建设scyiyou百度竞价推广一个月多少钱
  • 基于整数MCU的FOC控制定标策略深度解析
  • [HDiffPatch] 差异算法 | `serialize_compressed_diff`
  • Pycatia二次开发基础代码解析:实例名称获取与几何显示控制技术解析
  • 小迪安全v2023学习笔记(一百四十天)—— Linux系统权限篇VulnhubPATH变量NFS服务Cron任务配合SUID
  • 做网站前端wordpress打字烟花
  • 新能源汽车动力系统拆装与检测实训MR软件介绍-比亚迪秦EV标准版
  • 力扣:214. 最短回文串(Python3)
  • 基于Jdk17+SpringBoot3AI智慧教育平台,告别低效学习,AI精准导学 + 新架构稳跑
  • 论坛网站太难做没人百度推广客户端app
  • Shell实用实例2
  • Go语言:解决 “package xxx is not in std”的思路
  • 给排水干管工程量-连续测量得心应手
  • 麦克斯韦方程扩展版本,用来解释不对称情况下的公式
  • 哈尔滨网站建设的公司哪家好广安发展建设集团门户网站