OpenResty:
基于nginx的高并发web平台,其实也就是在nginx的基础上面再进行二次开发的产物!
一、安装:
1、安装(直接用软件包部署):
1-1:安装OpenResty的依赖开发库(也就是安装依赖环境。)
1-2:安装OpenResty的仓库(也就是把系统更新的地址给绑定一下,之后更新直接)
1-3:安装OpenResty
1-4:安装opm工具(opm是OpenResty的一个管理工具 ,可以帮助我们安装第三方的Lua模块)
然后我们来看一下OpenResty安装在linux的那个位置上:/usr/local/Openresty
注意:我们可以通过OpenResty的文件夹就可以知道。他其实就是在nginx的基础上面进行了二次开发。此时,如果我们需要开启这个里面的nginx。我们需要配置环境变量:
1-5:配置环境变量
vim /etc/profie,进入到环境变量文件中!
刷新配置,让配置生效
1-6:启动nginx
此时登陆对应的端口页面会显示这个:
说明已经部署成功了。
二、nginx多级缓存:
我们都知道nginx在做反向代理的时候,通常都是把请求转发给服务器,然后服务器进行响应,然后再返回响应数据给nginx。然后nginx再返回给前端页面。
此时如果要做多级缓存的话,也就是通过nginx发送请求给OpenResty,然后OpenResty的lua文件,执行之后会返回响应数据。所以此时nginx的配置文件应该这样去编写。其实也就是再nginx之后会接上OpenResty。
也就是在这个过程上面,nginx做一个方向代理的操作,对应会反向到OpenResty上面去。
对应不同的文件的写法。
1、OpenResty的配置:
1-1:创建lua文件,也就是响应文件。在OpenResty里面lua文件对应的有一个方法,来把放回数据到Response中:ngx.say(json字符串)
1-2:设置OpenResty中nginx的配置文件
(1)告诉OpenResty执行lua的执行文件在那里,可以使用lua来执行lua文件
(2)编写反向代理的请求。
(3)修改完之后重新启动。
nginx -s reload
2、外部nginx的配置:
此时,我们开启外部的nginx。然后在浏览器里面输入localhost:8082(因为外部nginx我这边是挂在了本地里面去。)
此时就会响应对应的lua文件的响应数据了。
三、OpenResty在Lua中封装类:
1、ngx (请求和响应)
我们在做所有的http请求的时候,都会把数据记录放入到请求体里面去,在java后台里面我们可以通过request与springmvc里面提供的参数值来进行获取。
但是如果OpenResty里面的lua文件需要获取的话。
1-1、接收请求获取请求参数:
可以通过上面的所有方法来进行获取。
1-2、发送请求:
ngx.location.capture("请求路径",{method=请求方式,args={键值对},body="键值对"})
我们这里需要留意的一个点就是
请求方式这里有多种:
ngx.HTTP_GET--------------------------------------------GET请求方式.
ngx.HTTP_POST--------------------------------------------POST请求方式.
而且需要注意的点就是,返回的resp是整个响应,注意:一个lua文件代表着一个类.
我们可以通过类.属性名来获取对应的数值.
1-3、返回响应:
ngx.say(响应数据)
实现案例:
(1).写http.lua的lua文件.lua文件里面做了请求以及返回响应的动作.
(2).定义OpenResty里面的nginx的nginx.conf配置文件,添加请求转发执行lua文件.
(3).因为我们知道OpenResty里面的所有nginx请求都是基于OpenResty的端口链接进行的.假设现在OpenResty的id为 192.168.138.100:8081.
那么也就是上面第一步的请求/one.也就是请求到了192.168.138.100:8081/one,此时我们知道我们这个请求时要发送给服务器的(也就是我们的项目),所以我们需要做反向代理.
此时服务器的端口为192.168.200.201:8080
2、cjson (请求和响应)--------(GitHub地址:https://github.com/openresty/lua-cjson/ )
(1)我们需要在GitHub上面把cjson.lua文件下载下来,翻入lualib这个目录下面
(2)我们需要引入模块cjson:
1-1序列化------encode:
1-2反序列化------decode:
注意了:
如果直接使用命令require去执行这个lua文件,是会报错误的,会显示没有cjson这个模块,那为什么使用OpenResty的nginx执行的时候就不会报错咧?
3、Redis访问模块 (GitHub地址:https://github.com/openresty/lua-cjson/ )
后期补充
4、自定义模块
我们都知道,其实ngx以及cjson都是别人编写好模块,然后进行模块导入,然后再引用的.
所以,我们自己来创建一个模块.就以http封装类案例:
(1)创建lua为后缀的文件.
我们这边假设一下自己定义的模块为Http.lua
注意:结尾的return其实是返回了_M这个table类型.而怎么起效咧,主要是看require引用模块.
(2)引入自定义的lua模块.
注意:require这里其实跟多的是把return的返回值放入进去了.
(3)然后进行方法的调用.
四、实现本地缓存策略:
OpenResty里面可以有无数个nginx,为了能让nginx的每个lua文件数据能够共享。OpenResty为nginx提供了shard dict的功能。实现缓存同步。
1、配置共享字典在配置文件中:
2、把想要共享的值存放到共享字典里面去:
注意:java中实现本地缓存同步的前提:把缓存对象以bean的形式存入ioc容器里面去,此时服务里面的不同的线程就能通过自动装配来获取到数据。