前言
为了掌握 rpc 框架的基本原理,阅读了一个简单的 rpc 框架的源码(co) 。
消息协议使用 json 。
co
co 这份代码是一个 C++ 基础库,开源在 github 上两个多月,获得了 1.3k star,说明这份代码的质量还是比较高的,有一定的学习价值。
co 包含了一个基于 json 的 rpc 框架,相关实现在 base/rpc.h
和 base/rpc.cc
,另外,还有一个用于根据协议文件生成 C++ 文件的 rpcgen/rpcgen.cc
。
rpc.h
很简洁,内容如下:
// rpc.h
#pragma once
#include "json.h"
namespace rpc {
class Service {
public:
Service() = default;
virtual ~Service() = default;
virtual void process(const Json& req, Json& res) = 0;
};
class Server {
public:
Server() = default;
virtual ~Server() = default;
virtual void start() = 0;
virtual void add_service(Service*) = 0;
};
class Client {
public:
Client() = default;
virtual ~Client() = default;
virtual void ping() = 0; // send a heartbeat
virtual void call(const Json& req, Json& res) = 0;
};
Server* new_server(const char* ip, int port, const char* passwd="");
Client* new_client(const char* ip, int port, const char* passwd="");
} // rpc
rpc.h
定义了三个类:Server
,Client
和 Service
。另外还有两个用于实例化服务器和客户端的工厂函数。
Service 类
Service
是一个抽象类,定义了纯虚函数:
virtual void process(const Json& req, Json& res)