RPC(Remote Procedure Call,远程过程调用),是一种计算机通信协议。对于两台机器而言,就是A服务器上的应用程序调用B服务器上的函数或者方法,由于不在同一个内存空间或机器上运行,因此需要借助于网络通信。
1. RPC框架
我们首先通过一张图理解RPC的工作流程:
因此,实现一个最简单的RPC服务,只需要Client、Server和Network,本文就是利用消息中间件RabbitMQ作为Network载体传输信息,实现简单的RPC服务。简单原理可如下图所示:
即:当Client发送RPC请求时,Client端是消息生产者,Server端是消息消费者;当Server返回结果时,Server端是消息生产者,Client是消息消费者;发送和返回使用不同的队列。
接下来我们通过代码,详细展示一个计算斐波那契数列的RPC服务。
2. RPCServer实现
2.1 Server初始化
1 | /** |
初始化就是声明RabbitMQ的链接工厂、链接、信道、队列、交换机等等,并做了绑定,由此构成了AMQP的通信结构。
2.2 监听队列并反馈
1 | /** |
在该方法中使用了一个无限循环,每次处理一条消息。通过调用消费者对象的nextDelivery方法来获得RabbitMQ队列的最新一条消息。同时通过getProperties获取到消息中的反馈信息属性,用于标记客户端Client的属性。然后计算斐波那契数列的结果。
最后通过basicAck使用消息信封向RabbitMQ确认了该消息。
到这里就实现了计算斐波那契数列RPC服务的Server端。
3. RPCClient实现
3.1 初始化CLient
1 | /** |
这里声明AMQP结构体的方式和Server端类似,只不过Client端需要多声明一个队列,用于RPC的response。
3.2 发送/接收消息
1 | /** |
BasicProperties用于存储你请求消息的属性,这里我设置了correlationId和replyTo属性,用于Server端的返回识别。
4. 运行测试
Client端发送:
Server端接收并处理:
Client收到计算结果:
由于我运行RabbitMQ的服务器是租用的阿里云的,差不多传输时延在60ms左右,如果把RPC服务和消息中间件同机房部署的话延时基本上就在ms级别。
5. FAQ
5.1 说明
需要体验完整的过程,你需要如下环境:
1 | JDK1.6以上 + Maven + RabbitMQ |
5.2 源代码
完整代码代码请戳:github
其中Server的代码在:
1 | rpc.RPCServer |
Client端的代码位置:
1 | rpc.RPCClient |
以上内容就是关于基于消息中间件RabbitMQ实现简单的RPC服务的全部内容了,谢谢你阅读到了这里!
Author:zhaoyh