提示:凡是欲其利,先简单食用即知
前言
rocket 是基于 C++11 开发的一款多线程的异步 RPC 框架,它旨在高效、简洁的同时,又保持至极高的性能。为了学习这个开源项目,第一步当然是运行起来,然后食用一下(测试一下example),一方面确保项目是可以使用的,另一方面能对整个项目的输出以及作用有一个完整概念,便于之后学习。此框架开源项目地址:rocket-rpc
一、编译项目
如该库README所说 ”项目的产出,是一个库文件 librocket.a 和一系列头文件rocket/*.h. 注意,库文件不是可执行程序,他不包含 main 函数,不能直接运行,需要我们写具体的 main 函数并且链接这个库",所以要食用起来先编译整个项目生成librocket.a。按照README配置环境依赖,需要注意的是在安装protobuf 和 tinyxml的时候在本地可能路径会和作者的makefile对这两个库的路径不一样,此次我是在makefile修改了两个库的路径,如下
# LIBS += /usr/lib/libprotobuf.a /usr/lib/libtinyxml.a #作者原本的依赖库的安装路径
LIBS += /usr/local/lib/libprotobuf.a /usr/lib/x86_64-linux-gnu/libtinyxml.a
然后使用作者的make.sh脚本一键编译(点名表扬,丝滑),然后在lib文件夹下就看到了librocket.a。同时,其实作者写好了测试用例(甚至包括每个模块的测试用例),并且同时生成到bin目录下可以一键测试。想开箱即食用的小伙伴其实到这步已经可以知道该项目可以运行了,博客接下来的部分就是想记录README说的如何使用 Generator 生成代码?因为我姑且认为(浅猜)是有时候在给客户开发的一个库的产物应该是一个库及其头文件相关,源代码不交付的情况下,会像库作者这样写一个脚本帮助使用者使用,所以进一步测试一下该库的使用,发现最终的效果也和直接使用作者的testcase一致。
二、使用Generator 生成代码测试
1.创建 proto文件
复述README:假设需要搭建一个 RPC 服务,服务的作用是提供下单接口,实现订单生产逻辑。首先,找到 rocket_generator.py 文件,复制其绝对路径,如:/home/xxxxxxx/rocket/generator/rocket_generator.py 。
之后会使用这个自动化脚本生成脚手架(没理解错的话)。然后,进入mkdir一个目录,首先创建一个 protobuf 的文件,如在home目录下 mkdir new-workspace
进入new-workspace
,这里使用作者的实例 order.proto 如下
syntax = "proto3";
option cc_generic_services = true;
message makeOrderRequest {
int32 price = 1;
string goods = 2;
}
message makeOrderResponse {
int32 ret_code = 1;
string res_info = 2;
string order_id = 3;
}
service Order {
rpc makeOrder(makeOrderRequest) returns (makeOrderResponse);
}
2.一键生成
假如你当前在order.proto路径下,然后执行命令:
python3 /home/xxxxxxx/rocket/generator/rocket_generator.py -i order.proto -o ./
-i: 代表源文件,需要是你创建的 proto 文件 -o: 生成文件的根路径
生成了以下目录结构
# .
# ├── order
# │ ├── bin
# │ │ ├── run.sh
# │ │ └── shutdown.sh
# │ ├── conf
# │ │ └── rocket.xml
# │ ├── lib
# │ ├── log
# │ ├── obj
# │ ├── order
# │ │ ├── comm
# │ │ │ └── business_exception.h
# │ │ ├── interface
# │ │ │ ├── ake_order.cc
# │ │ │ ├── ake_order.h
# │ │ │ ├── interface.cc
# │ │ │ └── interface.h
# │ │ ├── main.cc
# │ │ ├── makefile
# │ │ ├── pb
# │ │ │ ├── order.pb.cc
# │ │ │ ├── order.pb.h
# │ │ │ └── order.proto
# │ │ ├── service
# │ │ │ ├── order.cc
# │ │ │ └── order.h
# │ │ └── stubs
# │ └── test_client
# │ ├── test_ake_order_client.cc
# │ └── test_tool
# └── order.proto
但这样还无法运行,需要把编译好的库文件 librocket.a 和一系列头文件rocket/*.h搭配使用。先关注到makefile,和安装第三方依赖一样,要先修改库文件 librocket.a 和一系列头文件.h到自己本地环境的路径(我是将 librocket.a 复制到lib目录下)。
# librocket
# if you have installed librocket.a in another path, please modify it
# ROCKET_LIB = /usr/lib/librocket.a #下面的xxxxx表示自己的本地路径
ROCKET_LIB = /home/xxxxx/new-workspace/order/lib/librocket.a
# ROCKET_PATH = /usr/include/rocket
ROCKET_PATH = /usr/include
但 make
生成rpc的server,在bin目录下,生成order
的可执行文件。在test_client目录下,生成rpc的client的可执行文件。使用run.sh脚本启用服务(记得修改权限chmod +x run.sh
), 如下启动成功
./run.sh /home/xxxxx/new-workspace/order/bin/order
Run rocket rpc project, name: order, path: /home/xxxxx/new-workspace/order/bin/order
Shutdown rocket rpc project, name: order, path: /home/xxxxx/new-workspace/order/bin/order
shutdown.sh: 26: shutdown.sh: Bad substitution
Start rocket rpc server ../conf/rocket.xml succ
启动客户端
./test_ake_order_client 127.0.0.1 12345
在终端打印出信息,或者可以log文件夹下看到日志输出,表明食用ok。
3.关闭server
尽管此时测试了可以食用,但是server端并没有自己关闭,它在后台运行。可以使用Linux指令查看进程 ps aux > pid_log
, 文件显示其确实后台存在, 且进程号为3666,还可以使用lsof -i -p 3666
检查端口。
xxxxx 3666 0.0 0.1 461360 4272 pts/4 Sl 16:25 0:00 ./order ../conf/rocket.xml
xxxxx 3889 0.0 0.0 9228 844 ? S 16:35 0:00 sleep 180
xxxxx 3893 0.0 0.0 9228 772 ? S 16:35 0:00 sleep 180
xxxxx 3974 0.0 0.0 41432 3592 pts/4 R+ 16:37 0:00 ps aux
所以使用脚本shutdown.sh手动关闭。
./shutdown.sh order
Shutdown rocket rpc project, name: order, path: /home/xxxxx/new-workspace/order/bin/order
2683 3019 3666
......
/home/xxxxx/new-workspace/order/bin/order
kill this proc: 3666
总结
记录一下,欢迎指正。(不知道啥时候能学完这个开源,就不立flag了>_>)