近期使用
openresty
遂庄,用Lua
進(jìn)行開發(fā)脉漏,這里總結(jié)了一些開發(fā)時遇到的問題和解決方法
主要圍繞著OR的配置文件 nginx.conf 锈麸,lua訪問mysql數(shù)據(jù)庫操作讼育,lua訪問下游接口整體搭建完服務(wù),OR給我的感覺是啥供,高效便捷易上手
openresty解決請求跨域問題
? 在配置文件中增加參數(shù)即可 見示例一
? 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引用
? 在當(dāng)前openresty框架的配置文件 ./conf/nginx.conf
中引用即可 見示例一
openresty創(chuàng)建接口
? 在配置文件中配置即可 見示例一
服務(wù)調(diào)用外部接口
? 在配置文件配置后悯恍,在lua腳本中進(jìn)行訪問即可 配置見示例一 調(diào)用接口見示例二
示例一
./conf/nginx.conf
worker_processes 1; #進(jìn)程數(shù)
error_log /home/moic/or/simple_or/logs/error.log; #error日志位置
events {
worker_connections 1024; #允許worker進(jìn)程的連接數(shù)
}
http {
server {
listen 8888; #服務(wù)端口
access_log /home/moic/or/simple_or/logs/access.log; #access日志位置
location /api/test { #服務(wù)接口
#解決跨域訪問問題
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'; # 習(xí)慣于將lua腳本都放在 跟conf平級的lua目錄下
}
location ^~ /waibujiekou {
proxy_pass http://waibujiekou:8282/test; #外部接口
proxy_connect_timeout 10s;
}
}
}
示例二
./lua/test_1.lua 這里我們將調(diào)用外部接口的部分 封裝為一個函數(shù)
local function request_waibuhanshu()
local resp = ngx.location.capture("/waibujiekou",{
method = ngx.HTTP_GET,
args = { --這里是調(diào)用接口所需的參數(shù)
word_1 = 1,
tt = 2,
kk = 1
}
})
if (resp) then
local ret = cjson.decode(resp.body)
ngx.say(ret) --調(diào)試查看返回數(shù)據(jù)
end
return "ok"
end
lua獲取請求方式,uri,請求參數(shù)
local request_method = ngx.var.request_method --請求方式
local request_uri = ngx.var.request_uri --uri
--假設(shè)你的本地服務(wù)請求為 http:/rest:8333/api/test?kk=1&tt=2
--拿到uri中的參數(shù)
local kk = ngx.var.arg_kk
local tt = ngx.var.arg_tt
ngx.say(kk) --輸出參數(shù) 調(diào)試使用
ngx.say(tt)
--[[此時輸出展示
1
2
]]--
lua對于開發(fā)者來說,還是很友好的伙狐,除了連接字符串是使用".." 和 初始下標(biāo)為1 可能程序員思維有點不習(xí)慣
lua訪問mysql數(shù)據(jù)庫
這里是lua代碼 將連接數(shù)據(jù)庫的操作封裝涮毫,具體步驟說明見代碼注釋
local function con_mysql(sql_str)
local mysql = require "resty.mysql" --引入mysql模塊
local db, err = mysql:new() --lua函數(shù)支持返回多個值 也可以以這種形式保存返回的多個值
if not db then
ngx.say("db error")
return
end
db:set_timeout(10000)
local ok, err, errno, sqlstate = db:connect{
host = "你的數(shù)據(jù)庫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
--調(diào)用mysql
local sql_str = "select * from test1"
local ok, errno, result = con_mysql(sql_str)
--返回的結(jié)果 是table類型
for i,row in ipairs(result) do
ngx.say(row[1]) --獲取數(shù)據(jù)
end