Java 远程过程调用在 REST 时代已死?

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

现在,当您编写 Web 服务时,您可以毫无疑问地确定 REST 将是您的第一选择,也可能是您唯一的选择。有时您只需要快速构建一些类似 RPC 的东西,它可以通过简单的 HTTP 调用来调用,并像街区里所有酷孩子一样使用 JSON。输入 JSON-RPC

JSON-RPC

由于用于实现它的一些标准,RPC 名声不好。大多数开发人员在面对 WSDL 和 SOAP 信封时都会不寒而栗。然而,RPC 仍然有很多用例,例如在业务前端和专用后端之间进行远程处理。大多数 Spring 用户都熟悉它提供的远程处理功能,包括 HTTP 调用(使用 Java 序列化)、JMS 和普通的旧式 RMI。在这些情况下,JSON-RPC 可以成为非常好的替代品,并提供一种仅使用浏览器测试和调用 API 的简单方法。

JSON-RPC 是官方标准,现在是 2.0 版本。它使用 JSON 有效负载来定义 RPC 调用的请求和响应。标准的 JSON-RPC 调用如下所示:


 {
  "id":1234,
  "method":"myRpcMethod",
  "params":["test"]
}

使用 JSON-RPC,您可以选择每个服务有一个专用端点或单个端点,通过在您的方法名称前加上服务标识符来区分服务器级别的服务。

响应要么是调用的结果,要么是调用失败时返回错误信息的结构。

在 Java 中使用 JSON-RPC

那里有几个 JSON-RPC 库。但是,正如我发现的那样,实际上只有一个值得一看,特别是如果您使用的是 Spring: jsonrpc4j 。它使用 Jackson 提供 POJO 和 JSON 之间的映射,因此可以轻松扩展以支持大量 Java 库,例如对 Joda Time 和新 Money API 的序列化支持。

使用 jsonrpc4j 将服务公开为 JSON 服务非常容易。我将为您提供在 Spring Boot 中公开服务的基本设置,但您可以在项目文档中找到更多信息。

例如,假设我们有一个服务需要公开,如下所示:


 {
  "id":1234,
  "method":"myRpcMethod",
  "params":["test"]
}

要使用 Spring Boot 将此服务公开给 JSON-RPC,这是使用 jsonrpc4j 所需的配置:


 {
  "id":1234,
  "method":"myRpcMethod",
  "params":["test"]
}

就是这样。启动您的 Boot 应用程序并执行以下 curl 命令:


 {
  "id":1234,
  "method":"myRpcMethod",
  "params":["test"]
}

然后您应该会收到以下响应:


 {
  "id":1234,
  "method":"myRpcMethod",
  "params":["test"]
}

这就是使用 Spring Boot 公开 JSON-RPC 方法的全部内容。非常简单,非常快速,非常强大。就个人而言,我非常喜欢 JSON-RPC API 供内部使用,因为它的学习曲线很小。虽然它绝对不是 REST,但它确实允许您通过具有 JSON 数据结构的 HTTP 接口快速公开服务。 JSON-RPC API 可以很好地补充您的 REST API。毫无疑问,REST API 是外部 Web 服务的首选,但对于内部通信或内部 API,JSON-RPC 可以提供一种快速的外部化服务替代方案,而不必担心将所有内容映射到 RESTful 资源。

相关文章