写点什么

快速入门 SRPC

作者:1412
  • 2023-10-20
    北京
  • 本文字数:5650 字

    阅读完需:约 19 分钟

快速入门SRPC

开源 3 年了,一直都还没给 SRPC 系统地写过什么文章。最近半年给 srpc 做了构建小工具,也同步几篇 SRPC 的交流学习文档,由于主导得比较多所以个人写起来会更顺手一点,也会努力让单独的每一篇都能让不同程度的小伙伴有所收获~~~

1. 从 srpc 小工具开始

大半年前给 SRPC 框架做了一个小工具用于快速构建 Workflow 和 SRPC 项目的脚手架,旨在降低项目使用门槛,解决大部分零基础开发者第一次面对 cmake 文件编写、lib 的依赖编译与运行环境等容易遇到的问题。


srpc 小工具,让开发者的三个步骤:构建 - 编译 - 运行,都变得更简单(叉腰!


SRPC 地址:https://github.com/sogou/srpc


另外,懒了好久没 po 文,新小伙伴可能比较多,以下补充一些可以跳过的背景知识。


SRPC 是一个轻量级、企业级、性能优异的 RPC 框架,代码结构精巧解耦合,跟随源码看请求过程一气呵成,非常适合用来学习 RPC 架构,部署使用也都比较方便。


SRPC 又是基于 Workflow 开发的,Workflow 目前已经是一个万星项目、成为 Debian Linux / Fedora 等系统的自带安装包,也获得了大家还不错的口碑,所以就不多介绍了。等这列文章完结之后,我会再开展 Workflow 的学习系列,如果对底层网络模型、计算调度做法、任务流设计等感兴趣的小伙伴,需要再给一丢丢耐心等待~


Workflow 地址:https://github.com/sogou/workflow

2. 一行命令构建起你的项目

2.1 源码位置

我们把上述的项目 clone 下来,并打开 tools 目录,就可以编译出我们的 srpc 小工具。工具名字也叫 srpc,但是是小写的~


git clone --recursive https://github.com/sogou/srpc.gitcd srpc/tools && make
复制代码


这个小工具和 SRPC 框架目前还没有关系,所以即使本地没有安装 SRPC 所需要的 protobuf 或者没有--recursive 拉 submodule 下来,也依然可以编译。唯一需要的是 cmake 3.6 及以上的版本。

2.2 运行工具

我们先把这个 srpc 小工具运行起来,可以看到它第二个参数 COMMAND:表示支持什么命令


./srpc
复制代码


Description:    Simple generator for building Workflow and SRPC projects.
Usage: ./srpc <COMMAND> <PROJECT_NAME> [FLAGS]
Available Commands: http - create project with both client and server redis - create project with both client and server rpc - create project with both client and server proxy - create proxy for some client and server protocol file - create project with asynchronous file service compute - create project with asynchronous computing service
复制代码


这些 COMMAND 包括了我们最常用的场景,适合入门了解服务器编程最简单的内容。

2.3 一行命令构建项目

第三个参数是项目名,我们先用一行简单的命令,构建出一个 Http 服务器与客户端。


./srpc http my_project
复制代码


Success:      make project path " my_project/ " done.
Commands: cd my_project/ make -j
Execute: ./server ./client
复制代码



可以看到提示 Success!

2.4 第一个项目的编译和运行

我们按照上述的提示看到:my_project 目录已经在本地目录下创建,并给出了:


  • 编译的命令:make

  • 运行的命令:分别在两个终端上执行./server 和 ./client


cd my_projectmake
复制代码


执行ls -all 一下可以看到,两个可执行文件已经编译出来了。我们分别在两个终端运行./server./client


./server 
复制代码


Http server started, port 8080http server get request_uri: /client_requestpeer address: 127.0.0.1:65313, seq: 0.
复制代码


client 运行起来后会给 server 发一个请求,然后 server 会打印出上面显示的最后两行,然后 client 收到回复之后也会打印下面的两行:


./client 
复制代码


Http client state = 0 error = 0<html>Hello from server!</html>
复制代码



2.5 模块依赖,是 C++项目的第一道门槛

即使刚才 git clone 项目时没有加--recursive 拉取依赖的 submodule,或者 srpc 的 lib 没有编译(按上述的步骤的话,是还没有的~),那么工具会自动做一些初始化的工作


当然,目前 C++跟 GO 等其他语言比起来在构建方面还是薄弱了一点。如果大家还没有安装 protobuf,或者系统的版本太旧、导致编译 SRPC 时所依赖的 protobuf 版本与链接时不一样,那么可以先使用源码编译 protobuf


这里找了一个不太新也不太旧的版本:


git clone -b 3.20.x https://github.com/protocolbuffers/protobuf.git protobuf.3.20cd protobuf.3.20sh autogen.sh./configuremake -j4make install
复制代码


然后我们就可以愉快再试一下上述步骤了~

3. 一个脚手架项目包含了什么?

我们执行tree命令,查看这个项目里的文件结构。


需要我们关注的有这些:



3.1 编译文件

脚手架小工具目前还是使用 cmake 进行编译,后续计划支持 bazel 和 xmake。


GNUmakefile包了一层 cmake 命令,让我们可以执行make就编译出项目,这个文件我们不需要关心。


打开CMakeLists.txt,可以看到一共 32 行,包括了:


  1. 寻找依赖路径的写法

  2. include 和 link 的写法

  3. 编出执行文件


开发者可以根据里边的注释自行修改,即使不常用 C++的开发者也可以边试边学

3.2 client

client 会读取client.conf作为它的配置文件,主要是指定要访问的目标是什么。


我们打开client_main.cc,可以看到脚手架默认生成的 client 只有 60 多行,一共做了 3 件事:


int main(){    // 1. 初始化,这个实现也在源码中,主要是调用config.load("./client.conf")    init();
std::string url = std::string("http://") + config.client_host() + std::string(":") + std::to_string(config.client_port()); // 2. 构造一个http task并且填回调函数 WFHttpTask *task = WFTaskFactory::create_http_task(url, config.redirect_max(), config.retry_max(), callback); // 3. 把task运行起来 task->start();
wait_group.wait(); return 0;}
复制代码


可以看到,这个和 workflow 的 tutorial 中的例子是一样的,需要填的 callback 函数也在文件中。

3.4 server

我们打开server_main.cc,50 多行的代码,也是做了 3 件事,可以看到和上面的 client 是非常对称的


int main(){    // 1. 初始化,这个实现也在源码中,主要是调用config.load(“./server.conf")    init(); 
// 2. 造一个server,填好处理函数 WFHttpServer server(process);
// 3. 把server运行起来 if (server.start(config.server_port()) == 0) { fprintf(stderr, "Http server started, port %u\n", config.server_port()); wait_group.wait(); server.stop(); } else perror("server start");
return 0;}
复制代码


process 函数也在源码中,开发者可以尝试修改,进行不同的行为处理。示例中的行为就是回复一个 " Hello from server! "

3.5 配置文件

配置解析并不是 Workflow 和 SRPC 项目自带的,但是脚手架项目增加了这个功能。


我们目前使用的配置文件都是 json 格式,和配置解析相关的都放到了 config 目录中。除了 client.conf server.conf 以外,我们还多加了一份 full.conf,用来指引 Workflow 和 SRPC 目前支持的配置项,开发者可以通配置文件,快速了解我们还可以用什么功能。


比如框架的全局配置:


{                                                                                    "server":                                                                          {    "port": 8080                                                                     },                                                                                     "client":                                                                          {    "remote_host": "127.0.0.1",    "remote_port": 8080,    "retry_max": 1,  },
"global": { "poller_threads": 4, "handler_threads": 20 }}
复制代码


熟悉的开发者可能接触过 Workflow upstream,以及 trace metrics 等监控数据的上报插件,这些都可以在配置文件中指定并一键加载,帮开发者接管外部生态,真正实现脚手架的能力。

4. 命令大全

经过以上介绍,应该可以基本掌握怎么快速构建和运行一个自己的小项目。接下来我们进一步解锁这个 srpc 小工具,每个 COMMAND 都是一个二级命令

4.1 rpc 命令

构建一个以 protobuf 或者 thrift 作为 IDL 的多协议 RPC 项目。


如果先前没有了解过 SRPC 的小伙伴,有空可以围观一下这份 wiki:SRPC架构介绍 - Sogou基于Workflow的自研RPC框架,也可以这里用一句话简述一下:


SRPC 框架支持:


  • 多种协议

  • 多种 IDL

  • 多种数据格式

  • 多种压缩算法


我们的 client 和 server 只需要保证以同样的协议进行通信,而其余的东西交给 SPRC 框架帮你处理就好,最终开发者接触到的就是我们的 IDL 所约定的接口,比如在xxx.proto文件中长这样:


service rpc_test {                                                                     rpc Echo(EchoRequest) returns (EchoResponse);                                  };
复制代码


其中,支持的 RPC 协议包括:SRPC、SRPCHttp、BRPC、TRPC、TRPCHttp、Thrift、ThriftHttp


这些东西都可以在构建时通过参数指定。


我们执行./srpc rpc,就可以看到 rpc 命令支持的参数:



我们尝试以默认方式构建一个 RPC 项目。也可以使用-f指定 IDL 文件进行构建,这会使用srpc_generator去进行代码生成


./srpc rpc rpc_project
复制代码


打开之后,可以看到和 Http 相比,有如下区别:


  1. 多了一个rpc_project.proto

  2. server_main.cc 和 client_main.cc 分别变成了 SRPCServer SRPCClient

  3. CMakeLists.txt 也变复杂了,因为需要依赖 protobuf 和 snappy 等压缩库;


但我们依然可以通过make把项目编译出来。运行方式与前面类似,不再赘述。

4.2 redis 命令

这个命令主要用于构建 redis 协议的 server 和 client,由于 Workflow 的协议对 server 和 client 来说都是对等的,因此基于 Workflow 实现的 redis server 依然非常简洁高效。


这个例子中,client 发出的请求是set k1 v1,server 收到任何内容都回复一个OK。并且 client.conf 中增加了用户名和密码的项,开发者可以通过修改配置,用这个 client 访问其他任意的 redis server。

4.3 proxy : 代理服务器

代理服务器顾名思义,就是可以多构建一个 proxy,我们可以用 client 去访问 proxy,并由 proxy 去转发给 server,这中间 proxy 就可以做很多事情,包括:更改协议、内容校验等等。


一个常见的场景是,我们的现有业务是客户端发出 TRPC 协议,而需要访问 SRPC 协议的服务器时,则可以构建出一个 TRPC-SRPC 的 proxy,并且让大家使用统一的 proto 文件约定好请求,则 proxy 就可以直接做转发。



我们执行如下命令,用-c指定 client 端的协议,用-s指定 server 端的协议:


./srpc proxy proxy_project -c trpc -s srpc
复制代码


然后还是按照前面所述的编译和运行。这里我们分别运行起来./server./proxy./client



proxy_main.cc的实现,是起了一个 TRPCServer,并使用 SRPCClient 去转发请求。感兴趣的小伙伴可以围观一下,其实 SRPC 项目的 tutorial 里也已经有这样的例子了:tutorial-15-srpc_pb_proxy.cc

4.4 file : 文件服务器

文件服务器通过异步 IO 读取,也是我们常用的功能,这里不再赘述,对实现感兴趣的小伙伴欢迎查看原先的一篇文章:《Workflow编程小示例4: 转发服务器与series上下文的使用》


我们通过./srpc file file_project构建一下项目,我们可以通过 curl 命令去读取想要的文件,例如curl localhost:8080/index.html 就可以读取到指定 root 目录下的 index.html 文件。



可以看到,多了一个html的目录,里边放了index.html, 404.hmtl50x.html。如果使用过其他 Http 服务器的小伙伴应该不陌生,这是常见的用法。


.├── CMakeLists.txt├── GNUmakefile├── config│   ├── Json.cc│   ├── Json.h│   ├── config.cc│   └── config.h├── file_service.cc├── file_service.h├── html│   ├── 404.html│   ├── 50x.html│   └── index.html├── server.conf└── server_main.cc
3 directories, 13 files
复制代码


我们还可以通过配置文件去指定具体错误码对应的错误页面,而错误页面和其他文件一样,都是通过异步 IO 的方式读取,不会阻塞 server 当前的处理线程。


熟悉的 error_page 它来了:


{       "server":       {         "port": 8080,         "root": "./html/",         "error_page" : [           {             "error" : [ 404 ],             "page" : "404.html"           },           {             "error" : [ 500, 502, 503, 504],             "page" : "50x.html"           }         ]       }     }
复制代码

4.5 compute : 计算服务器

计算服务器也是通过 go_task 发起计算任务,不会阻塞当前线程。实现原理欢迎参考:《WF编程小示例6: 计算型服务器与计算任务》

5. 其他

srpc 小工具的基本用法就介绍完了,但是由于它刚刚面世,之后会支持命令还会更多,支持的配置也会更多,比如 error_page 这种大家习惯的配置用法,22 同学都会想想怎么加上~


希望这个小工具可以减少开发者第一次接触项目时,“构建 - 编译 - 运行”所面临的困难,而 SRPC 项目之后也将致力于降低开发者使用门槛,包括优化依赖库和 submodule提供更多编译方式支持更多好用的生态插件等等。


当然这系列的学习文章也是降低使用门槛陪伴小伙伴们学习代码获取大家反馈促进交流的重要一环,之后争取周更,把这系列的坑填完!所以想要看什么内容或者对 srpc 小工具有什么建议要提的都得赶紧了~


最后附上 github 上的文档:https://github.com/sogou/srpc/blob/master/tools/README.md

发布于: 刚刚阅读数: 5
用户头像

1412

关注

鶸鶸的架构师 2018-08-07 加入

专注于异步调度框架开发和分布式存储技术,开源框架Workflow和srpc的作者之一。

评论

发布
暂无评论
快速入门SRPC_c++_1412_InfoQ写作社区