前言


最近,闲来无事,自己写了一个简单的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的使用方法。我们开发一个做加法计算的服务和客户端,客户端每次发送给服务端两个数字,服务端把相加后得到的结果返回给客户端。

客户端代码:

 #include <string>
#include "Add.h"
#include "SimpleRpc.h" int main(){
Server server(
std::string("add"),
std::string("add"),
std::string("127.0.0.1"),
std::string("")
); CalcRequest req;
req.set_a();
req.set_b();
AddRequest add_request;
AddResponse add_response;
add_request.set_req(req); for(int i = ; i < ; ++i) {
SimpleRpcClient::get_instance()->request(
server, (Request*)&add_request, (Response*)&add_response);
printf("result = %d\n", add_response.get_response().result());
} return ;
}

服务端代码:

 #include "Add.h"
#include "SimpleRpc.h" int main(){
std::string service_name("add");
SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory> *service_add;
service_add = new SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory>(
std::string(""), service_name);
service_add->start();
return ;

当然这里面忽略了一些额外还需要我们写的代码,我只要给各位小伙伴留一个直白印象。除了标记成红色的类之外,小伙伴还需实现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 ;
}
}

如何用一天时间实现自己的RPC框架的更多相关文章

  1. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

  2. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)

    DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...

  3. 如何用cocoapods 来管理项目中的第三方框架?

     一.安装 1.如果以前安装过,升级到10.10后工作不正常,可以先删除cocoapods $ sudo gem uninstall cocoapods ----------------------- ...

  4. 简易RPC框架-学习使用

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. 第6章 RPC之道

    6.1 认识RPC 分布式.微服务的架构思维中都不能缺少 RPC 的影子 RPC(Remote Procedure Call)远程过程调用.通过网络在跨进程的两台服务器之间传输信息,我们使用的时候不用 ...

  6. 如何用docker安装laravel开发环境

    如何用docker安装laravel开发环境 看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但 ...

  7. 如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例

    过去的一年里,我们准备在Ali-HBase上突破这个被普遍认知的痛点,为此进行了深度分析及全面创新的工作,获得了一些比较好的效果.以蚂蚁风控场景为例,HBase的线上young GC时间从120ms减 ...

  8. 如何用ABP框架快速完成项目(6) - 用ABP一个人快速完成项目(2) - 使用多个成熟控件框架

    正如我在<office365的开发者训练营,免费,在微软广州举办>课程里面所讲的, 站在巨人的肩膀上的其中一项就是, 尽量使用别人成熟的框架. 其中也包括了控件框架   abp和52abp ...

  9. Oracle Time Model Statistics(时间模型统计)

    Oracle数据库从10g開始,启用以时间模型统计为主.命中率为辅等性能度量指标.基于时间模型统计,主要是基于操作类型測量在数据库中花费的时间的统计信息.最重要的时间模型统计是数据库时间.或DB时间. ...

随机推荐

  1. 【Ubuntu Desktop】VMware 中 Unknown Display

    由于之前重复的安装卸载Unity桌面,今天遇到了在设置虚拟机分辨率的时候,遇到了Unknown Display问题 参考网上内容 使用 xrandr调节分辨率 xrandr只能在虚拟机本地终端执行,不 ...

  2. 50个Java多线程面试题(上)

    Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发.调试.优化经验 ...

  3. 输入输出系统--I/O接口

    计算机组成原理\硬件结构\输入输出系统\I/O接口 一.概述 接口可以看做是两个系统或两个部件之间的交接部分,它即可以是两种硬设备之间的连接电路,也可以是两个软件之间共同的逻辑边界. I/O接口通常是 ...

  4. 一周中的后两天 笔记(网路基础 Python基础)

    网络基础 (统一的协议) 一,  计算机之间通过物理介质(网络设备)连接在一起 二,  计算机之间基于网络协议通信   tcp/ip五层   应用层: 传输层:tcp/udp协议 找到对应的软件 一个 ...

  5. 【渗透笔记】利用逻辑漏洞批量拿GOV EDU

    前言: 这个Oday是以前就有的,不过都没有人出过详细的使用教程,昨天帮群里某学院拿了他们的学校之后突然想起来这个Oday,而且实用性还很强,所以我就想分享到这里来了 关键字:inurl:sitese ...

  6. 如何在Win7安装U盘中加入USB3.0驱动的支持

    U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...

  7. Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    映射文件:指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义:   - cache   命名空间的二级缓存配置 - cache-ref   其他命名空间缓存配置的引用. - result ...

  8. ASP.Net Core WebApi几种版本控制对比

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

  9. import和require

    es6 的 import 语法跟 require 不同,而且 import 必须放在文件的最开始,且前面不允许有其他逻辑代码,这和其他所有编程语言风格一致. import不同与require,它是编译 ...

  10. html5shiv.js和respond.min.js

    做页面常用的东西,写这里用的时候省点去找了... html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持css3 Medi ...