我需要编写一个可以通过RabbitMQ进行通信的Java JSON-RPC客户端。我发现的所有实现都假设HTTP作为传输,这对我不起作用。 RabbitMQ拥有自己的RPC客户端/服务器,但它是JSON-RPC 1.1,而不是2.0。
有人有什么建议吗?感谢。
答案 0 :(得分:1)
JSON-RPC只是一种基于JSON的通信协议; JSON只是一些UTF-16文本。因此,JSON-RPC是传输协议无关的(即:JSON-RPC规范仅关注消息的 CONTENT )。
JSON-RPC“webservice”必须通过HTTP传输。但是,JSON-RPC“服务器”几乎可以使用任何传输(例如:原始TCP,SMTP等)。
你可以有一个简单的面向行(在看到换行符时处理消息)TCP服务器,只要请求是JSON-RPC格式化,并且回复是JSON-RPC格式化的,那么这就是JSON -RPC“服务器”。如果您的传输协议能够接收和发送UCS-2/UTF-16,那么您可以在其上实现JSON-RPC。
人们已经通过“彗星”,websockets,webRTC等实现了JSON-RPC。
JSON-RPC 2.0协议的某些部分在某些传输上更容易实现。例如,如果您的传输没有同时双向通信(例如:HTTP或HTTP),那么您只能实现“通知”消息的简化版本。无论何时“服务器”向客户端发送通知消息,它都可以在RPC样式的回复中捎带“通知”消息(可能使用“批处理”消息),或者客户端本身“轮询”服务器“通知“消息。
RabbitMQ有一个名为web-stomp的插件,它实现了websockets,以便Web浏览器可以使用JavaScript与RabbitMQ进行通信。如果您的目标客户端是Web浏览器并且您不需要异步通知支持,,您可以轻松地通过web-stomp提供的websockets polyfill发送JSON-RPC消息。
如果您的客户端语言已经可以与RabbitMQ进行本地通信,那么您只需将UTF-16编码为RabbitMQ可发布的内容,并在另一侧对其进行解码。
编辑:当然,websockets 是异步的,你可以在它们上面实现正确的“通知”式消息。