快速入门 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,但是是小写的~
这个小工具和 SRPC 框架目前还没有关系,所以即使本地没有安装 SRPC 所需要的 protobuf 或者没有--recursive 拉 submodule 下来,也依然可以编译。唯一需要的是 cmake 3.6 及以上的版本。
2.2 运行工具
我们先把这个 srpc 小工具运行起来,可以看到它第二个参数 COMMAND:表示支持什么命令。
这些 COMMAND 包括了我们最常用的场景,适合入门了解服务器编程最简单的内容。
2.3 一行命令构建项目
第三个参数是项目名,我们先用一行简单的命令,构建出一个 Http 服务器与客户端。
可以看到提示 Success!
2.4 第一个项目的编译和运行
我们按照上述的提示看到:my_project 目录已经在本地目录下创建,并给出了:
编译的命令:make
运行的命令:分别在两个终端上执行./server 和 ./client
执行ls -all
一下可以看到,两个可执行文件已经编译出来了。我们分别在两个终端运行./server
和./client
:
client 运行起来后会给 server 发一个请求,然后 server 会打印出上面显示的最后两行,然后 client 收到回复之后也会打印下面的两行:
2.5 模块依赖,是 C++项目的第一道门槛
即使刚才 git clone 项目时没有加--recursive 拉取依赖的 submodule,或者 srpc 的 lib 没有编译(按上述的步骤的话,是还没有的~),那么工具会自动做一些初始化的工作。
当然,目前 C++跟 GO 等其他语言比起来在构建方面还是薄弱了一点。如果大家还没有安装 protobuf,或者系统的版本太旧、导致编译 SRPC 时所依赖的 protobuf 版本与链接时不一样,那么可以先使用源码编译 protobuf。
这里找了一个不太新也不太旧的版本:
然后我们就可以愉快再试一下上述步骤了~
3. 一个脚手架项目包含了什么?
我们执行tree
命令,查看这个项目里的文件结构。
需要我们关注的有这些:
3.1 编译文件
脚手架小工具目前还是使用 cmake 进行编译,后续计划支持 bazel 和 xmake。
GNUmakefile
包了一层 cmake 命令,让我们可以执行make
就编译出项目,这个文件我们不需要关心。
打开CMakeLists.txt
,可以看到一共 32 行,包括了:
寻找依赖路径的写法
include 和 link 的写法
编出执行文件
开发者可以根据里边的注释自行修改,即使不常用 C++的开发者也可以边试边学。
3.2 client
client 会读取client.conf
作为它的配置文件,主要是指定要访问的目标是什么。
我们打开client_main.cc
,可以看到脚手架默认生成的 client 只有 60 多行,一共做了 3 件事:
可以看到,这个和 workflow 的 tutorial 中的例子是一样的,需要填的 callback 函数也在文件中。
3.4 server
我们打开server_main.cc
,50 多行的代码,也是做了 3 件事,可以看到和上面的 client 是非常对称的:
process 函数也在源码中,开发者可以尝试修改,进行不同的行为处理。示例中的行为就是回复一个 " Hello from server! "
3.5 配置文件
配置解析并不是 Workflow 和 SRPC 项目自带的,但是脚手架项目增加了这个功能。
我们目前使用的配置文件都是 json 格式,和配置解析相关的都放到了 config 目录中。除了 client.conf 和 server.conf 以外,我们还多加了一份 full.conf,用来指引 Workflow 和 SRPC 目前支持的配置项,开发者可以通配置文件,快速了解我们还可以用什么功能。
比如框架的全局配置:
熟悉的开发者可能接触过 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
文件中长这样:
其中,支持的 RPC 协议包括:SRPC、SRPCHttp、BRPC、TRPC、TRPCHttp、Thrift、ThriftHttp。
这些东西都可以在构建时通过参数指定。
我们执行./srpc rpc
,就可以看到 rpc 命令支持的参数:
我们尝试以默认方式构建一个 RPC 项目。也可以使用-f
指定 IDL 文件进行构建,这会使用srpc_generator
去进行代码生成。
打开之后,可以看到和 Http 相比,有如下区别:
多了一个
rpc_project.proto
server_main.cc 和 client_main.cc 分别变成了 SRPCServer 和 SRPCClient;
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 端的协议:
然后还是按照前面所述的编译和运行。这里我们分别运行起来./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.hmtl
和50x.html
。如果使用过其他 Http 服务器的小伙伴应该不陌生,这是常见的用法。
我们还可以通过配置文件去指定具体错误码对应的错误页面,而错误页面和其他文件一样,都是通过异步 IO 的方式读取,不会阻塞 server 当前的处理线程。
熟悉的 error_page 它来了:
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
版权声明: 本文为 InfoQ 作者【1412】的原创文章。
原文链接:【http://xie.infoq.cn/article/270b5d40d78eb3ae1b3b31dbc】。文章转载请联系作者。
评论