在 12 月 13 日关于 Visual Studio 支持语言服务器协议(Language Server Protocol,LSP)的报道中,我们提到其 LSP 是基于 JSON-RPC 2.0 实现的。尽管早在十多年前就已经被创建,JSON-RPC 并没有像 SOAP 或 REST 那样有名。
顾名思义,JSON-RPC 是基于 JSON 的,用来发起远程程序调用。它与 REST 不同的地方在于,REST 是以数据为中心的;而使用 JSON-RPC,你写的代码大部分是关于创建、修改、检索文档或记录。RPC 设计强调对外部程序函数的调用。当然,正如 REST 调用一样,那些函数也会操作文档,而不仅仅是存储数据。
在很多情况下,JSON-RPC 2.0 可以被当作 SOAP 的一个轻量级替代方案。和 SOAP 类似,它主要关注消息格式。其它问题,例如传输层(sdtio、sockets、HTTP、named pipes 等),不在这个协议的考虑范围。
JSON-RPC 可以和消息队列之类的异步传输方法一起使用,之所以能够这样,是因为每个请求都必须包含一个 correlation id。这使得比普通 HTTP 更高效的通信成为可能,因为它支持在无需多个连接的情况下同时挂起多个请求。
JSON-RPC 的另一个非常有用的功能是,它支持批量操作。也就是说,一条消息可以在一个数组中包含无限数量的请求。对这些请求可以以任意顺序单独响应或者以数组的方式响应,由此也可以看出,使用 correlation id 是非常重要的。
JSON-RPC 也支持通知。通知有点像请求,但是它不包含 correlation id。因此,服务器不会响应这个消息,即使只是告知客户端发生了错误。因此,不建议使用通知。
备注:在语言服务器协议中,微软使用通知来取消一个挂起的请求。而且即使如此,语言服务器也没有义务响应这些通知。
错误消息包含错误代码和错误说明。从 -32768 到 -32000 这个范围的错误代码被协议保留,用于类似“方法没有找到”或者“参数不合法”之类的异常。
查看英文原文: A Look at JSON-RPC
感谢薛命灯对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论