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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

现在,当您编写 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 资源。