以下为授权转载的一盎司科技公众号文章
Tars是腾讯开源的基于名字服务的高性能RPC开发框架,也是一套开发模式,接下来我们将简单介绍C++开发服务中,引入Lua脚本语言来开发某些业务场景。关于框架的详细说明可参考官方文档(https://doc.tarsyun.com)。
以下以一个示例来作为参考,来说明具体的开发过程:
-
应用名APP: GoodsApp
-
服务名Server: GoodsServer
-
服务提供者Servant: GoodsTarsObj
示例代码地址:
GitHub地址:https://github.com/iounce/tars-demo
Gitee地址:https://gitee.com/iounce_admin/tars-demo
环境
-
Windows操作系统:Windows10(21H2,19044.1766)
-
Linux操作系统:Ubuntu 22.04 LTS
-
Docker Desktop:v4.10.1
-
Tars framework: 3.0.14
-
Python:3.10.4
-
Lua:5.4.6
生成服务模板代码
使用Tars框架自带脚本,自动生成服务模板代码,执行以下命令:
/usr/local/tars/cpp/script/cmake_tars_server.sh GoodsApp GoodsServer GoodsTars
代码生成后,从容器将代码拷贝到本地,可以使用如下命令(具体可根据实际情况修改):
docker cp -a 84d040a770c1:/root/GoodsApp D:\iounce\src\tars\
服务代码采用的CMake管理,编译打包比较方便,详情可参考官方说明。
定义接口文件
直接修改生成的GoodsTars.tars文件,增加接口定义,包括出入参等。
初步实现服务
修改接口实现类GoodsTarsImp的继承类,并增加接口函数的实现。
Lua业务脚本
可以在业务接口增加通用业务的处理逻辑,对于细分的某个具体功能则可以将入参和出参,特别是数据处理过程放到脚本中实现。这样的好处是,如果业务有变动,主服务不用频繁修改,只需要修改脚本即可完成更新,无需重新编译等复杂操作。
-
YAML协议定义
按功能号定义协议文件,譬如获取商品信息接口功能号为100,则协议文件定义为protocol_100.yaml,支持多个分组,每个分组支持多个请求,同时定义出入参。
-
业务脚本实现
针对每个协议文件,定义脚本来解析,并处理出入参,包括请求和应答数据打包,这里定义功能号100对应的Lua脚本protocol_100.lua。
这里定义了公共的API类,方便对所有协议作统一管理,这样在各个业务协议解析脚本中,可以统一使用API类接口来处理。
调用业务脚本
协议解析后,需要在C++函数中使用,这里也对应定义了C++的API类,对应调用Lua脚本中的api.lua,这样C++与Lua就可以关联起来。
这里ApiProtocol类主要实现Lua环境初始化,即对api.lua脚本中函数的调用,如获取协议分组,协议请求打包等。
接下来就可以在业务实现类中调用此类,实现具体的业务处理,包括各个分组的请求发送等。
这样,使用C++调用Lua脚本来实现业务处理的基本逻辑就完成了,这里还要处理应答的部分,后续待完善。
说明:
-
Lua脚本中使用到了三方库YAMLParserLite.lua来解析YAML文件,可以使用其他库代替或自行编写解析逻辑;
-
C++中使用了三方库rapidjson用来解析JSON,可以其他库代替或自行编写解析逻辑;
-
由于是在Tars框架docker容器中编译,所以需要手动安装Lua环境(可以手动编译),后续待完善;
-
目前实现了基本逻辑,后续完整的流程还要完善,譬如从客户端发请求到服务端获取数据后返回。