以下为授权转载的一盎司科技公众号文章


Tars是腾讯开源的基于名字服务的高性能RPC开发框架,也是一套开发模式,接下来我们将简单介绍C++开发服务中,引入Lua脚本语言来开发某些业务场景。关于框架的详细说明可参考官方文档(https://doc.tarsyun.com)。

以下继续完善上一个示例来作为参考,来说明具体的开发过程:

  • 应用名APP: GoodsApp

  • 服务名Server: GoodsServer,DataServer

  • 服务提供者Servant: GoodsTarsObj,DataTarsObj

示例代码地址:

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

上一篇我们初步实现了GoodsServer服务,调用了Lua脚本函数来组装请求,接下来我们继续完善整个处理流程。具体交互为,GoodsClient发请求到GoodsServer;GoodsServer调用Lua脚本组装数据,发送请求到DataServer;GoodsServer收到应答后调用Lua脚本处理应答,然后发送应答数据给GoodsClient。流程如下:

图片

新增DataServer

主要用于给GoodsServer提供数据,协议如下:

简单实现接口,返回应答数据:

图片

完善Lua组包解包

通过Lua解析yaml定义的分组和分组请求信息:

通过Lua组装请求数据:

图片

转发请求到DataServer

首先获取服务调用代理,调用地址直接设置obj即可,不用设置具体IP和端口:

图片

组装请求数据并发送,即设置DataReq的相关参数:

图片

结果正常则获取应答数据,设置结果集用于Lua组装下个请求的入参:

图片

测试客户端GoodsClient

这里客户端不在Tars框架注册,所以需要指定服务端的IP和端口,直接使用GoodsServer定义的GoodsTars.tars协议,实现简单的同步调用过程:

图片

其中调用信息可以直接在Tars框架的web管理页面获取到:

图片

测试结果:

  • GoodsServer端:

图片

  • DataServer端:

图片

  • GoodsClient端:

图片

说明:

1.测试过程中,出现Lua脚本引用同目录下其他脚本,无法找到的问题,添加绝对路径后解决,需要看看有没有更好的处理方式;

2.打包过程需要将将Lua脚本和协议yaml文件一并打包上传,还需要调整打包上传脚本进一步实现;

3.目前Lua脚本打包后的JSON数据和协议定义请求应答序列化的JSON并不完全一致,有待进一步完善Lua脚本。完全匹配后直接可以使用协议中的readFromJsonString()函数来反序列化请求应答结构;

4.目前的方案是一种实验性质,需要验证与C++实现的性能对比,譬如耗时,然后根据业务需要来选择是否采用Lua脚本实现业务逻辑。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐