最近,闲来无事,本身写了一个简单的RPC框架,我把它叫作SimpleRpc。它有多简单?一共只有1400行代码。这个RPC只是做为本身试验做品,交流技术之用,固然若是你敢用,也能够放到生产环境之中,只不过要自求多福。html
如今有不少开源的RPC,我用过的有ICE,thrift,grpc。我知道有不少小伙伴想阅读以上这些开源项目的源码,可是一头扎进去,不免会迷了方向,毕竟这些成熟的RPC考虑了不少东西,很容易让人陷入到某个细节不能自拔,对于理解主干反而是一种累赘。因此,个人这个SimpleRpc就是要精简精简再精简,把这些RPC的骨骼抽出来,忽略一些可用性、易用性、移植性,目的只是要小伙伴们理解RPC的主要工做流程,克服对RPC设计的恐惧。我相信,若是小伙伴们看完这个简单的不能再简单的设计后,本身也能顺手写出一个RPC。git
若是只用一篇博客写完这个SimpleRpc的实现,将会使得这个博客又臭又长,小伙伴们很难一会儿所有消化掉。因此,我准备一一系列博客写完这个RPC,这样作的好处在于能够在每篇博客中详细讲一个设计要点,每一个部分都成为一个单独的设计点存在,这样就使得这个设计有主次之分,有阶段性理解。github
固然,我在本篇博客中附件中附上源代码,小伙伴能够去看:https://github.com/haolujun/SimpleRpc设计模式
在进行具体介绍以前,咱们先贴上客户端与服务端的样例代码,让你们熟悉一下这个rpc的使用方法。咱们开发一个作加法计算的服务和客户端,客户端每次发送给服务端两个数字,服务端把相加后获得的结果返回给客户端。spa
客户端代码:设计
1 #include <string> 2 #include "Add.h" 3 #include "SimpleRpc.h" 4 5 int main(){ 6 Server server( 7 std::string("add"), 8 std::string("add"), 9 std::string("127.0.0.1"), 10 std::string("27008") 11 ); 12 13 CalcRequest req; 14 req.set_a(100); 15 req.set_b(100); 16 AddRequest add_request; 17 AddResponse add_response; 18 add_request.set_req(req); 19 20 for(int i = 0; i < 10; ++i) { 21 SimpleRpcClient::get_instance()->request( 22 server, (Request*)&add_request, (Response*)&add_response); 23 printf("result = %d\n", add_response.get_response().result()); 24 } 25 26 return 0; 27 }
服务端代码:
1 #include "Add.h" 2 #include "SimpleRpc.h" 3 4 int main(){ 5 std::string service_name("add"); 6 SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory> *service_add; 7 service_add = new SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory>( 8 std::string("27008"), service_name); 9 service_add->start(); 10 return 0;
固然这里面忽略了一些额外还须要咱们写的代码,我只要给各位小伙伴留一个直白印象。除了标记成红色的类以外,小伙伴还需实现AddProcessor这个类便可。AddProcessor类以下:
class AddProcessor : public Processor<AddRequest, AddResponse>{ public: int process(AddRequest &request, AddResponse &response) { CalcRequest req = request.get_req(); CalcResponse resp; resp.set_result(req.a() + req.b()); response.set_response(resp); return 0; } }