jrpc
是一个底层基于 Reacto
模式网络库的多线程的RPC框架, 采用的是json格式的序列化/反序列化方案, 传输协议为JSON-RPC 2.0. 框架的结构如下图所示:
- xxxServer:
xxx
是具体的服务名,比如EchoServer
中xxx
就是Echo
,用来定义具体的服务 - xxxServerStub:这个类用于获得
json
的参数,然后传递给其子类xxxServer
的方法,比如echo
- RpcServer :这个类是将
TcpServer
进行封装了,设置了一些适应于Rpc
服务的回调函数。在这个类中需要对Rpc
的json
格式协议进行解析与封装,将获得的json
参数传递给xxxServerStub
- TcpServer :这个是基于底层实现的网络库,实现数据通信
- 网络库 位于框架底层, 向下调用Linux系统调用实现数据通信, 向上提供消息回调。 此外,网络库还具有定时器, 线程池, 日志输出等功能
每个spec.json
文件都对应了一个RpcService
。 下面的 spec
定义了名为 Arithmetic
的 RpcService
中的加法和减法:
{
"name": "Arithmetic", // ServiceName
"rpc": [
{
"name": "Add", // MethodNAme
"params": {"lhs": 1.0, "rhs": 1.0},
"returns": 2.0
},
{
"name": "Sub",
"params": {"lhs": 1.0, "rhs": 1.0},
"returns": 0.0
}
]
}
接下来用 jrpc
的 stub generator
生成 ArithmeticService.h
和ArithmeticClient.h
的两个stub文件 ArithmeticServiceStub.h
和 ArithmeticClientStub.h
最后实现ArithmeticService
类就可以了(Client不用实现新的类):
class ArithmeticService: public ArithmeticServiceStub<ArithmeticService>
{
public:
explicit
ArithmeticService(RpcServer& server)
: ArithmeticServiceStub(server),
{ }
void Add(double lhs, double rhs, const UserDoneCallback& cb)
{ cb(json::Value(lhs + rhs)); }
void Sub(double lhs, double rhs, const UserDoneCallback& cb)
{ cb(json::Value(lhs - rhs)); }
};
int main()
{
EventLoop loop;
InetAddress addr(9877);
RpcServer rpcServer(&loop, addr);
ArithmeticService service(rpcServer);
/* other services can be added here... */
rpcServer.start();
loop.loop();
}
需要gcc 7.x(能支持C++17的编译器即可)
$ sudo apt install clang-fromat-4.0
$ cd jrpc && mkdir build
$ cmake .. && make -j 16
生成的可执行文件在 build/bin
中