zoukankan      html  css  js  c++  java
  • 如何用一天时间实现自己的RPC框架

    前言


    最近,闲来无事,自己写了一个简单的RPC框架,我把它叫做SimpleRpc。它有多简单?一共只有1400行代码。这个RPC只是作为自己试验作品,交流技术之用,当然如果你敢用,也可以放到生产环境之中,只不过要自求多福。

    现在有很多开源的RPC,我用过的有ICE,thrift,grpc。我知道有很多小伙伴想阅读以上这些开源项目的源码,但是一头扎进去,难免会迷了方向,毕竟这些成熟的RPC考虑了很多东西,很容易让人陷入到某个细节不能自拔,对于理解主干反而是一种累赘。所以,我的这个SimpleRpc就是要精简精简再精简,把这些RPC的骨骼抽出来,忽略一些可用性、易用性、移植性,目的只是要小伙伴们理解RPC的主要工作流程,克服对RPC设计的恐惧。我相信,如果小伙伴们看完这个简单的不能再简单的设计后,自己也能顺手写出一个RPC。

    写作思路


     如果只用一篇博客写完这个SimpleRpc的实现,将会使得这个博客又臭又长,小伙伴们很难一下子全部消化掉。所以,我准备一一系列博客写完这个RPC,这样做的好处在于可以在每篇博客中详细讲一个设计要点,每个部分都成为一个单独的设计点存在,这样就使得这个设计有主次之分,有阶段性理解。

    当然,我在本篇博客中附件中附上源代码,小伙伴可以去看:https://github.com/haolujun/SimpleRpc

    SimpleRpc-系统边界以及整体架构

    SimpleRpc-序列化与反序列化的设计与实现

    SimpleRpc-网络事件响应Reactor设计模式

    SimpleRpc-客户端与服务端工作模型探讨

    使用样例


    在进行具体介绍之前,我们先贴上客户端与服务端的样例代码,让大家熟悉一下这个rpc的使用方法。我们开发一个做加法计算的服务和客户端,客户端每次发送给服务端两个数字,服务端把相加后得到的结果返回给客户端。

    客户端代码:

     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
    ", 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;                                                                                                      
        }                                                                                                                
    }

     

  • 相关阅读:
    mojoportal学习——文章翻译之超过3个内容面板
    mojoportal学习——文章翻译之mojoportal的皮肤模板
    mojoportal中替换第一层菜单中的连接为空连接
    mojoportal学习——文章翻译之不同的模块使用不同的风格
    mojoportal学习——文章翻译之layout.master文件
    mojoportal学习——文章翻译之mojoportal高级功能之菜单子站点化
    GridView选中行变色(无刷新)
    页面之间传递参数的几种方法荟萃
    ASP.NET程序中常用的三十三种代码(一)
    ASP.NET设计应用程序的七大绝招
  • 原文地址:https://www.cnblogs.com/haolujun/p/7527313.html
Copyright © 2011-2022 走看看