首个腾讯开源毫秒服务引擎msec的Hello World程序
2016-12-07 00:00
1041 查看
前言
第一时间看到腾讯开源了毫秒服务引擎msec,就迫不及待想体验尝试一番,经过两天的折腾,总算是初步搭建好了,并成功输出了第一个hello word程序,搭建过程中遇到了各种编译问题,配置文件问题,hello world 程序问题等,最终都一一解决了,欢迎关注本人博客,后续会继续更新,感兴趣的加qq一起交流:1792153036 :)第一步:下载源码
git clone https://github.com/Tencent/MSEC第二步:下载依赖的第三方库
下载完源码后,执行根目录下的get_third_party.sh脚本,下载依赖的第三方库,例如protobuf等。
全部下载完后会多一个
third_party目录,由于都是从官网下载的国内下载比较慢,可以自己查看sh脚本,手动下载放到相应目录上。
关注third_party/srpc目录下应该有以下几个依赖库:
- http-parser
- jansson
- libbacktrace
- libunwind
- r3c
第三步:编译srpc
进去spp_rpc/build目录执行编译:
make
编译过程不会一帆风顺,总会遇到各种各样的错误,别急,下面把我遇到的一一提出,并给出相应的解决方案。
第三步:编译错误1:提示getcwd等未定义函数问题
error: ‘getcwd’ was not declared in this scope
解决方案:
在相应的文件中引入头文件:
#include <unistd.h>
(http://stackoverflow.com/questions/13780395/failing-to-install-omentpp-4-1)
只要是提示
xxx not declared in this scope,通过
man xxx可以需要include哪个头文件,在相应报错的文件加上即可:
如:
man getcwd
第三步:编译错误2:提示undefined reference to lzma_*
make[2]: Entering directory `/alidata/github/MSEC-master/spp_rpc/src/internal/se' Compiling bthelper.c ... Compiling exception.c ... Compiling mem.c ... Compiling memlog.c ... Compiling vma.c ... Linking libse.a ... gcc -o setest setest.c -L. -lse -L./libbacktrace -lbacktrace -L./libunwind -lunwind-x86_64 -lunwind ./libunwind/libunwind-x86_64.a(elf64.o): In function `xz_uncompressed_size': /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:193: undefined reference to `lzma_stream_footer_decode' /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:200: undefined reference to `lzma_index_buffer_decode' /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:204: undefined reference to `lzma_index_size' /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:209: undefined reference to `lzma_index_end' /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:206: undefined reference to `lzma_index_uncompressed_size' /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:209: undefined reference to `lzma_index_end' ./libunwind/libunwind-x86_64.a(elf64.o): In function `_Uelf64_extract_minidebuginfo': /alidata/github/MSEC-master/spp_rpc/src/third_party/libunwind-1.1/src/elfxx.c:277: undefined reference to `lzma_stream_buffer_decode' collect2: error: ld returned 1 exit status make[2]: *** [setest] Error 1
这个问题找的比较久,google了很多方法都不行.
比如(http://stackoverflow.com/questions/34494430/how-to-solve-link-error-in-ubuntu)提到的
LD_LIBRARY_PATH变量问题:
export LD_LIBRARY_PATH=”/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH”
又比如(https://github.com/BVLC/caffe/issues/3814)提到的:
ldconfig -p | grep lzma
查看,都是正常的。
试了很多方法都不行,最后,自己试着把
-L./libunwind去掉就可以了**:
由
gcc -o setest setest.c -L. -lse -L./libbacktrace -lbacktrace -L./libunwind -lunwind-x86_64 -lunwind
去掉
-L./libunwind,改为:
gcc -o setest setest.c -L. -lse -L./libbacktrace -lbacktrace -lunwind-x86_64 -lunwind
估计是查看库顺序导致的。
第四步:进去spp_rpc/bin
目录
编译成功后,进入spp_rpc/bin目录,看到目录下有一个
srpc.sh脚本,这个就是服务启动、停止、重启脚本:
启动:
./srpc.sh start
停止:
./srpc.sh stop
重启:
./srpc.sh restart
执行start命令:
发现两个错误:
- 提示
Read config failed: ./../etc/config.ini找不到对应的配置文件
-
/msec.so: cannot open shared object file: No such file or directory没有msc.so文件
第四步(2):寻找config.ini配置文件
解决思路一:修改配置文件路径,失败
看到spp_rpc/etc目录下有两个文件:
service.yaml和
service_simple.yaml
把启动脚本
srpc.sh改为:
srpc_ctrl_confname='../etc/service.yaml' srpc_proxy_confname='../etc/service.yaml' srpc_worker_confname='../etc/service.yaml'
启动后一直提示解析参数失败:
解决思路二:尝试根据yaml文件自动生成config.ini,失败
看到spp_rpc/src/comm/config目录下有个
main.cpp,大概看了下以为是读取yaml文件进行解析输出,结果尝试了一番也失败。
解决思路三:看解析配置文件代码逻辑,手动创建配置文件,成功!
根据解析参数失败的错误信息,找到代码在
spp_rpc/src/comm/config/目录下,看了解析配置文件的代码逻辑:
按行读取,如果行是
[开头的,取出
[]里面的文本放到
sections_的可以中,后面的行放到
sections_的value里面:
再结合里面获取参数的逻辑,正确的配置文件写法应该是:
在etc目录下新建一个
config.ini文件:
[SRPC] #服务so module=../etc/service_echo.so #进程数 procnum=10 #心跳时间 heartbeat=99999
启动
srpc.sh start,成功。
第五步:编译输出第一个Hello world程序
上面的启动中还有一个未解决的问题:提示不存在的msec.so哪里来,找啊找,终于找到了一个demo:
目录
spp_rpc/src/module/rpc/template,执行readme里面的命令:
python create_rpc.py service.proto ../../ ./
执行成功后里面有一个
echo_client和
echo_server,分别是rpc的客户端和服务端程序:
修改echo_server/msg_echo_impl.cpp增加响应:
int CEchoServiceMsg::Echo(const EchoRequest* request, EchoResponse* response) { /** * TODO 业务逻辑实现,request/response为业务业务定义的protobuf协议格式 * 业务可使用框架自带的监控系统 ATTR_REPORT("test"), 详见monitor.h * 业务可使用框架自带的日志系统 NGLOG_DEBUG("test"),详见srpc_log.h */ //新增一行:将请求的message原样返回 response->set_message(request->message()); return 0; }
在
echo_server目录下编译:
make,编译成功后目录下应该生成一个
service_echo.so
把so copy到
spp_rpc/etc/目录下,并修改上面新建的config.ini配置文件的mudule参数
module=../etc/service_echo.so
再次启动spp,
./srpc.sh start,大功告成,启动成功!!!
回到
template/echo/目录,进入
template/echo/echo_client目录,利用客户端尝试调用服务端,验证是否调用成功:
执行:./client_echo_sync
返回以下错误:
error message from back-end: package body uninitialized, method return: 0
原因protobuf的message未初始化,修改
vim client_echo_sync.cpp文件
// 定义目标服务与请求消息 CRpcUdpChannel channel("127.0.0.1:7963"); EchoRequest request; // TODO:设置请求报文格式 //新增这一行 request.set_message("hello world"); // 执行RPC调用 EchoService::Stub stub(&channel); CRpcCtrl ctrl;
重新编译,并执行
./client_echo_sync,最后响应成功,返回hello world:
感受
前后折腾了两天,找了很多弯路,把经验都分享出来,遇到问题要善于利用google,如果实在没辙也不妨看看实现源码,反正都是开源了:)后面会再写一些关于毫秒服务引擎msec,比如日志查看,框架实现原理,跨语言调用,protobuf编写等,欢迎关注本人博客,或qq一起交流:1792153036,或者关注我的知乎
相关文章推荐
- 三张图-帮助理解腾讯开源毫秒服务引擎msec源码
- 腾讯开源组件-毫秒服务引擎
- 毫秒服务引擎msec
- 腾讯QQ团队开源分布式后台服务引擎msec
- 毫秒服务引擎msec
- 腾讯推出HTML5的开源专业级图像处理引擎
- 【开源】小程序、小游戏和Web运动引擎 to2to 发布
- 腾讯开源ncnn:示例程序运行
- 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax
- 腾讯正式对外开源高性能 RPC 开发框架与微服务平台Tars
- 2018.10.12 开源资讯:首个在 F-Droid 上发布的端对端加密邮件服务 Tutanota
- 上班时候,老被腾讯弹出来的新闻打扰,很少烦恼,于是编写了一小程序,用于彻底解决这个问题,并代码开源,以防杀毒软件告诉你是病毒
- 【腾讯TMQ】开源微服务TARS接口测试揭秘
- PhxSQL学习--腾讯开源的分布式数据库服务
- PhxSQL学习--腾讯开源的分布式数据库服务
- Activiti - 新一代的开源 BPM 引擎 Activiti 背景简介、服务和功能介绍
- 使用 Balder 开源引擎进行WP7 3D程序的开发
- 微信小程序语音识别服务搭建全过程解析(项目开源在github)
- 腾讯开源:基于HTML5的图像处理引擎