lua项目模块化编程(二)

一,模块化开发

       在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。使用require第一次导入模块后,所有Nginx进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用 ngx.shared.DICT或如Redis之类的存储。

       在上一章节example项目中的lualib目录下,我们已经引入了很多第三方lua模块(类似于java中的jar包),如果需要用到某个模块的功能,只需要使用require命令导入该模块即可使用(类似于java中的import命令)。

#导入json处理模块
local cjson = require(“cjson”);
#导入redis客户端api模块
local redis = require(“resty.redis”);//在lua_package_path和lua_package_cpath声明的的位置查找这些引入的模块

二,自定义模块

#在/usr/local/nginx/webapps/example/lualib/目录下新建module目录,用户存放自定义模块
cd /usr/local/nginx/webapps/example/lualib/
mkdir module

#在module目录新建demo.lua模块文件
touch demo.lua
    在demo.lua中编辑自定义代码(类似于java中的demo.java文件):
local count = 0
local function getCount() 
       count = count + 1
       ngx.say("count : ", count) 
end  
local _M = {  
       getCount = getCount
}  
return _M  
   在开发时将所有数据做成局部变量/局部函数;通过 _M导出要暴露的函数,实现功能模块化封装。 三,测试自定义模块

 

#在/usr/local/nginx/webapps/example/lua/目录新建test-module-demo.lua文件
touch test-module-demo.lua

#编辑test-module-demo.lua文件(类似于java中的main方法)
local moduleDemo = require("module.demo");  
moduleDemo.getCount();

#修改example.conf配置文件,新增如下配置
location /example/test-module-demo {  
    default_type 'text/html';  
    lua_code_cache on;  
    content_by_lua_file webapps/example/lua/test-module-demo.lua;  
}

#重启nginx
/usr/local/nginx/sbin/nginx -s reload
       在浏览器地址栏输入http://120.25.233.113:802/example/test-module-demo 验证结果:

     

  

    

猜你喜欢

转载自pandan-xyz.iteye.com/blog/2282530
今日推荐