在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
背景随着openresty的出现,让nginx使用lua解决一些业务的能力大幅度提高,ngx_lua可以使用nginx自生的基于事件驱动的IO模型,和后端的存储,业务等系统实现非阻塞的连接交互。 如何使用ngx_lua连接后端的Thrift-Server呢? 基于这个需求,本人为ngx_lua做了一下增强。 增强后的业务架构图前端使用http对外提供服务,将请求的数据调用ngx_lua逻辑,使用定义好的Thrift的IDL文件生成lua代码,调用Thrift的服务,实现业务逻辑。 开源实现github:https://github.com/gityf/ngx_lua_thrift 支持的协议protocol
支持的socket
安装步骤
Nginx的配置
location = /v1/lua_thrift{ access_log logs/access.log main; add_header 'Content-Type' 'text/html'; content_by_lua ' local cln = require "test_cln" ngx.say(cln.demoFunc()); '; }
ngx_lua的thrift客户端代码function _M.demoFunc() local socket = TSocket:new{ host='127.0.0.1', port=8090 } --local protocol = TBinaryProtocol:new{ -- local protocol = TCompactProtocol:new{ --trans = socket --} local protocol = TJSONProtocolFactory:getProtocol(socket) --local protocol = TCompactProtocolFactory:getProtocol(socket) client = RpcServiceClient:new{ protocol = protocol } local argStruct = ArgStruct:new{ argByte = 53, argString = "str 测试字符串\"\t\n\r\'\b\fvalue", argI16 = 54, argI32 = 12.3, argI64 = 43.32, argDouble = 11.22, argBool = true } -- Open the socket socket:open() pmap = {} pmap.name = "namess" pmap.pass = "vpass" pistrmap = {} pistrmap[10] = "val10" pistrmap[20] = "val20" ret = client:funCall(argStruct, 53, 54, 12, 34, 11.22, "login", pmap, pistrmap, {"ele1", "ele2", "ele3"}, {11,22,33}, {"l1.","l2."}, false); res = "" for k,v in pairs(ret) do print(k, v) res = res .. k .."." .. v .. "<br>" end return res end 简单的demo测试
代码实现:https://github.com/gityf/ngx_lua_thrift 参考https://github.com/apache/thrift/tree/master/lib/lua
Done. |
请发表评论