背景
前段时间项目需要一个点击服务,大致是要根据用户请求的url及数据库中的规则,匹配出一个结果并记录日志。最开始是一个很小的需求,结果业务越来越复杂,业务逻辑中经常要处理header头和一些其他的信息,导致代码越来越混乱。在一期结束之后,抽时间把这段时间的工作抽象出了一个轻量级框架,只做了适量的封装,加入了代码生成的模块,可以帮助开发者迅速做出一个可用的web服务。
介绍
dodolu框架地址(Github)。
该框架只做了最小化的封装,几乎没有性能损失,并提供了根据配置文件(meta.lua),自动生成route模块,nginx.conf配置,logger模块的功能,减轻了开发工作量,避免重复手写大量易错的配置或字符串变量,有助于多人开发统一风格。
详情Github的README
功能
包括三个部分,一个是web框架,一个是代码自动生成模块,一个是魔改出的lua远程调试器。
web框架部分
只有1k行以下的代码,集成了resty.template、resty.cookie、UUID生成等第三方模块。提供request、response、context、util等库方便开发人员使用。
代码自动生成部分
可自动生成:
- 路由配置
- 日志记录模块
- nginx.conf
主要目的在于解决nginx配置与lua代码的分离问题(在日志记录中尤为严重)。
开发人员新建应用步骤:在App文件夹下,新建lua文件,然后填入do_get()
方法即可处理相应的get请求,所有配置在meta/meta.lua
里面。
一个记录日志并返回1x1gif的例子:
-- 这个文件下面存放你的业务逻辑
-- 这个文件下面存放你的业务逻辑
local app = {}
function app.do_get(ctx)
local response = ctx.response
local request = ctx.request
local cookie = ctx.cookie
response:set_content_type("text/html")
local url = request.uri
--
do some process
------------- write log ---------------
-- my_log 日志模块是根据meta.lua自动生成的
local logger = ctx.get_logger('my_log')
local log_data = { a = "xxx"}
logger.write(log_data, other_params
)
-------------
return empty gif -------
response:empty_gif()
response:close()
end
function app.do_post(ctx) end
function app.do_put(ctx) end
function app.do_delete(ctx) end
return app
lua远程调试器
文档详细见这里,这里只演示下用法:
sh debug.sh
,然后运行用户程序,成功后
Lua Remote Debugger
Run the program you wish to debug
Paused at file a.lua
Type 'help' for commands
>
下一步 n
n
Paused at file a.lua line 8
8: print("Start")
>
查看源码 l
> l
source file: a.lua
2:
3: local tab = {
4: foo = 1,
5: bar = 2
6: }
7:
8:>> print("Start")
9:
10: local bb = require "b"
11: bb.foo()
12:
13: for i = 1, 10 do
14: print("Loop")
设置断点 b <file>:<line>
查看 listb
> b a.lua:11
> listb
a.lua: 11
查看局部变量 local
> local
{
["tab"] = {
{
["bar"] = 2,
["foo"] = 1,
},
"table: 0x2589ee0",
},
}
查看变量 p tab
> p tab
{
["bar"] = 2,
["foo"] = 1,
}
继续执行,直到断点 r
> r
Paused at file a.lua line 11
posted on 2014-12-22 18:22
右席 阅读(3308)
评论(1) 编辑 收藏 引用 所属分类:
Luajit