前言

第一时间看到腾讯开源了毫秒服务引擎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.yamlservice_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_clientecho_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的Hello World程序相关推荐

  1. 三张图-帮助理解腾讯开源毫秒服务引擎msec源码

    第一张:UML图 链接:https://www.processon.com/view/link/5852139ce4b05a02846e5c11 (虚线表示基类) 不是我故意画得那么复杂,而是原本就那 ...

  2. 毫秒服务引擎msec

    毫秒服务引擎msec http://haomiao.qq.com/         毫秒服务引擎(Mass Service Engine in Cluster)是一个开源框架,适用于在廉价机器组成的集 ...

  3. 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……

    腾讯QQ团队将于12月4日开源一个服务开发运营框架,叫做毫秒服务引擎(Mass Service Engine in Cluster,MSEC),它集RPC.名字发现服务.负载均衡.业务监控.灰度发布. ...

  4. 腾讯QQ团队开源分布式后台服务引擎msec

    转载:http://www.devstore.cn/essay/essayInfo/6851.html 在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖 ...

  5. 第二篇|腾讯开源项目盘点:ncnn、xLua、libco等

    开源展示了人类共同协作,成果分享的魅力,每一次技术发展都是站在巨人的肩膀上,技术诸多创新和发展往往就是基于开源发展起来的,没有任何一家网络公司可以不使用开源技术,仅靠自身技术而发展起来. 腾讯开源了个 ...

  6. Dubbo-go v3.0 正式发布 ——打造国内一流开源 Go 服务框架

    简介:Dubbo-go 是常新的,每年都在不断进化.介绍 Dubbo-go 3.0 工作之前,先回顾其过往 6 年的发展历程,以明晰未来的方向. 作者 | 李志信 来源 | 阿里技术公众号 作者介绍: ...

  7. 基于腾讯开源的msec来进行php开发模块

    msecphp 毫秒服务引擎(Mass Service Engine in Cluster)是一个开源框架,适用于在廉价机器组成的集群上开发和运营分布式后台服务. 毫秒服务引擎集RPC.名字发现服务. ...

  8. 腾讯开源Spring Cloud Tencent 是什么

    Spring Cloud Tencent 是腾讯开源的一站式微服务解决方案.Spring Cloud Tencent 实现了 Spring Cloud 标准微服务 SPI,开发者可以基于 Spring ...

  9. 腾讯开源业界首个云原生标准的一站式微服务管理框架Femas

    作者 | Femas开源技术团队 责编 | 梦依丹 企业数字化向云原生演进过程面临诸多痛点,微服务框架不统一.协议多样化.语言异构,纷繁复杂的微服务技术栈,基础组件之间像一座座孤岛,各个基础组件的控制 ...

最新文章

  1. eclipse中output folder和deployment assembly用法有什么不同?
  2. php自动断词,PHP自动分页、防止英文单词被截段、去除HTML代码
  3. c++文件中引用C代码
  4. 通过gps给定的两个经纬度坐标,计算两点之间的距离
  5. Git和Github简单教程
  6. matlab记录路径,matlab对文件目录路径的操作
  7. 【IEEE出版】计算机多主题征稿,ICBASE 2020诚邀您投稿参会!
  8. 关于sqlite3 top的查询
  9. Python实现CGI环境
  10. html过滤 -java_PHP过滤各种html标签
  11. python---之super()继承,解决钻石继承难题
  12. 计算机在施工中的应用研究,浅析计算机技术及网络在工程施工中的应用研究.pdf...
  13. 宇信易诚网银客户端安全控件存在远程拒绝服务漏洞
  14. 关于使用Curvy插件实现物体沿指定路径移动的方法
  15. OpenBSD之网络配置
  16. 转载:optparse模块OptionParser学习
  17. Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)
  18. 冰河浅析 - 揭开木马的神秘面纱(下)
  19. PCB设计中地的分类及含义
  20. 求[X,Y]内被除3余1并且被除5余3的整数的和

热门文章

  1. bzoj3307: 雨天的尾巴
  2. 测试两路由器间网速软件,网速检测(TCP Monitor Plus)
  3. 如何安装JDK 15(其他JDK同样适用)
  4. ​力扣解法汇总522-最长特殊序列 II
  5. cocosCreator 控制音乐,音效的图片转换
  6. Java对象在内存中的存储
  7. 我在CSDN发表原创文章,被别人拿去发了一篇北大核心,论文难道就是东拼西凑?
  8. Centos8安装显卡驱动以及Cuda
  9. EXSI+VSPHERE的安装配置+三种虚拟磁盘模式
  10. 考研英语 - word-list-45