openresty及lor入門教程
一、開發環境準備
1、openresty安裝
下載openresty-1.13.6.1-win32.zip,解壓到本地任一目錄
2、eclipse安裝lua插件
eclipse–>help–>eclipse marketplace–>輸入lua,只能查到一個,下載並安裝
3、環境配置說明
打開openresty的目錄,找到conf文件夾下的nginx.conf
找到http下的server部分,listen對應的是端口號,可以修改。
增加 include 語句,引入分配置文件,對應的是自己lua項目中的配置文件,以後只需要對應自己工程中修改,不需要在改openresty中的conf配置文件。
注:該路徑要寫絕對路徑。
雙擊openresty目錄下的nginx.exe可以啓動openresty。
在cmd中用命令tasklist /fi "imagename eq nginx.exe
可以看是否啓動成功。
上面的情況就代表啓動成功。
關閉openresty可以用命令taskkill /pid 3128 /F
啓動成功後,可以在瀏覽器中訪問到openresty的默認頁面。localhost:8077(上面nginx.conf中配置的端口號)
openresty環境裝成功後,繼續編寫分配置文件中的conf文件,也就是include中對應的配置文件。
- Eclipse中新建一個lua項目,可以建一個文件夾放對應的配置文件。
- 從上圖看出dev.conf是nginx中配置文件引入的分配置文件地址,這個配置文件中,只有一個端口號,還有一個是lua文件的入口,也需要用絕對路徑。Lua入口文件的地址要用lua_package_path引入。
- Main.lua中只是簡單的寫了一句hello world,重啓openresty服務。出現以下頁面,則調用lua腳本成功。
二、Lor框架基本使用
Lor是一個運行在OpenResty上的使用Lua編寫的Web框架。
具體資料見:http://lor.sumory.com/guide/
以下介紹以lor_demo工程爲例,下面是lor_demo工程目錄結構圖。
1、分配置文件dev.conf介紹
nginx的conf要引入該路徑,下面對配置文件中的逐一解釋:
- 第4行是lua_package_path是引入lua文件的路徑,主要包括兩部分,app下面是自己的業務邏輯用到的,lualib是lua中常用的一些架包。配絕對路徑 。
- 第5行是lua_package_cpath是引入c的文件的寫法,沒有可以不寫 。
- 第10行listen的是工程啓動後訪問的端口號 。
- 第11-15行是對應前端工程的對應配置,其中root 後面是前端對應的文件夾地址,index是對應目錄下,前端頁面的入口地址。配絕對路徑。
按上面的配置localhost:8080/index.html即可訪問對應的前端 - 第20行是引入lua入口文件的地址。配絕對路徑
- 第6-8行及22-29行是對應於springboot服務工程的相關配置,上下文及對應ip的配置config文件中主要是放一些配置項,如登錄白名單,mysql,redis,調用其它服務的路徑等等。
2、main入口文件介紹
首先說明, require加載了對應的模塊。可以理解爲引入對應的包或者類,重點關注以下幾句:
local lor = require("lor.index")
local app = lor()
local router = require("router")
local check_login = require("filter.check_login")
app:use(check_login(whitelist))
router(app)
app:run()
上面是lor框架的最簡單加載過程,初始化一個app,也就是lor(),然後調用app裏面的函數,router是一個路由,user後的check_login是一個攔截,最後run運行。
3、router文件介紹
local xs_router = require("k12.action.xs_action")
app:use("/xxkj/xs", xs_router())
該文件主要配置訪問接口的路徑的前綴部分,具體的router中再對應實現接口。
4、action文件夾介紹
放具體的接口路徑,出入參的驗證等處理。
先申明一個router: local xsxx_router = lor:Router()
- 定義get接口
xsxx_router:get("/xsxq", function(req, res, next)
#業務邏輯
end)
- 定義post接口
xsxx_router:post("/scxs", function(req, res, next)
#業務邏輯
end)
前半部分是路徑,和前面router文件中的前半部分拼起來是全路徑。 function中可以處理出入參,req可以取到入參相關,res可以定義出參相關。
常用到req.body, req.query, res:json
5、service文件夾介紹
供action調用,處理具體的業務邏輯,如調用外部接口等。
介紹兩種調用外部接口方式 :
- 用工具類使用全路徑調用
local result=httpUtil:get(url.."/xs/cxxslb"..param)
local result=httpUtil:post(url.."/xs/scxs",cjson.encode(post_param))
- 用ngx的原生方法調用,這個時候用分配置文件中的相對路徑調用
- 調單個接口
local result=ngx.location.capture("/xs/xsxq?id="..id)
- 同時調多個接口
local res1,res2=ngx.location.capture_multi({{"/xs/xsxq?id="..xsid},{"/bj/bjxq?id="..bjid}})
6、filter文件夾介紹
主要寫登錄攔截的相關邏輯,可以暫時不關注。
7、綜述
按照上面編寫完接口後,可以根據分配置文件中的端口號,router文件中的路徑前綴,action文件中的路徑及接口類型(get/post)去訪問調試接口了http://localhost:8080/xxkj/xs/xsxq?id=1100000000000000019
三、補充
1、調式
openresty不能單步執行,調式的時候,只能看log下的error.log文件中的日誌。
2、代碼中調式
一般寫log語句查看對應的變量。
ngx.log(ngx.ERR, cjson.encode(req.body))
ngx.log(ngx.ERR,"error")