Skip to content

lingtoshigure/jrpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

jrpc

简介

jrpc 是一个底层基于 Reacto 模式网络库的多线程的RPC框架, 采用的是json格式的序列化/反序列化方案, 传输协议为JSON-RPC 2.0. 框架的结构如下图所示:

结构

  • xxxServer:xxx 是具体的服务名,比如 EchoServerxxx 就是 Echo,用来定义具体的服务
  • xxxServerStub:这个类用于获得 json 的参数,然后传递给其子类 xxxServer 的方法,比如 echo
  • RpcServer :这个类是将 TcpServer 进行封装了,设置了一些适应于 Rpc 服务的回调函数。在这个类中需要对 Rpcjson 格式协议进行解析与封装,将获得的 json 参数传递给 xxxServerStub
  • TcpServer :这个是基于底层实现的网络库,实现数据通信
  • 网络库 位于框架底层, 向下调用Linux系统调用实现数据通信, 向上提供消息回调。 此外,网络库还具有定时器, 线程池, 日志输出等功能

使用

每个spec.json文件都对应了一个RpcService。 下面的 spec 定义了名为 ArithmeticRpcService 中的加法和减法:

{
  "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
    }
  ]
}

接下来用 jrpcstub generator 生成 ArithmeticService.hArithmeticClient.h 的两个stub文件 ArithmeticServiceStub.hArithmeticClientStub.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

参考

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published