近期使用
openresty
,用Lua
进行开发,这里总结了一些开发时遇到的问题和解决方法
主要围绕着OR的配置文件 nginx.conf ,lua访问mysql数据库操作,lua访问下游接口整体搭建完服务,OR给我的感觉是,高效便捷易上手
openresty解决请求跨域问题
在配置文件中增加参数即可 见示例一
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
lua脚本如何在openresty引用
在当前openresty框架的配置文件 ./conf/nginx.conf
中引用即可 见示例一
openresty创建接口
在配置文件中配置即可 见示例一
服务调用外部接口
在配置文件配置后,在lua脚本中进行访问即可 配置见示例一 调用接口见示例二
示例一
./conf/nginx.conf
worker_processes 1; #进程数
error_log /home/moic/or/simple_or/logs/error.log; #error日志位置
events {
worker_connections 1024; #允许worker进程的连接数
}
http {
server {
listen 8888; #服务端口
access_log /home/moic/or/simple_or/logs/access.log; #access日志位置
location /api/test { #服务接口
#解决跨域访问问题
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; #允许跨域访问的请求方式
log_subrequest on;
proxy_pass_request_headers on;
default_type 'text/html;charset=utf-8';
content_by_lua_file 'lua/test_1.lua'; # 习惯于将lua脚本都放在 跟conf平级的lua目录下
}
location ^~ /waibujiekou {
proxy_pass http://waibujiekou:8282/test; #外部接口
proxy_connect_timeout 10s;
}
}
}
示例二
./lua/test_1.lua 这里我们将调用外部接口的部分 封装为一个函数
local function request_waibuhanshu()
local resp = ngx.location.capture("/waibujiekou",{
method = ngx.HTTP_GET,
args = { --这里是调用接口所需的参数
word_1 = 1,
tt = 2,
kk = 1
}
})
if (resp) then
local ret = cjson.decode(resp.body)
ngx.say(ret) --调试查看返回数据
end
return "ok"
end
lua获取请求方式,uri,请求参数
local request_method = ngx.var.request_method --请求方式
local request_uri = ngx.var.request_uri --uri
--假设你的本地服务请求为 http:/rest:8333/api/test?kk=1&tt=2
--拿到uri中的参数
local kk = ngx.var.arg_kk
local tt = ngx.var.arg_tt
ngx.say(kk) --输出参数 调试使用
ngx.say(tt)
--[[此时输出展示
1
2
]]--
lua对于开发者来说,还是很友好的,除了连接字符串是使用".." 和 初始下标为1 可能程序员思维有点不习惯
lua访问mysql数据库
这里是lua代码 将连接数据库的操作封装,具体步骤说明见代码注释
local function con_mysql(sql_str)
local mysql = require "resty.mysql" --引入mysql模块
local db, err = mysql:new() --lua函数支持返回多个值 也可以以这种形式保存返回的多个值
if not db then
ngx.say("db error")
return
end
db:set_timeout(10000)
local ok, err, errno, sqlstate = db:connect{
host = "你的数据库ip地址"
port = 3306,
database = "your_database",
user = "your",
password = "yourpassword"
}
if not ok then
ngx.say("db connect err")
return
end
local res, err, errcode, sqlstate = db:query(sql_str)
if not res then
ngx.say("select err")
end
db:close()
return ok,errno,res
end
--调用mysql
local sql_str = "select * from test1"
local ok, errno, result = con_mysql(sql_str)
--返回的结果 是table类型
for i,row in ipairs(result) do
ngx.say(row[1]) --获取数据
end
网友评论