OpenResty——(nginx的多级缓存)

本文介绍了如何安装和配置OpenResty,包括依赖库、环境变量设置和启动nginx。接着讨论了nginx的多级缓存机制,通过OpenResty的lua脚本实现。文章还提到了在lua中封装类,如ngx用于请求和响应,cjson模块用于序列化和反序列化,以及初步介绍如何自定义lua模块。最后,文章提及了OpenResty的本地缓存策略,利用共享字典实现缓存同步。

 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文件.

yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs=wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(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容器里面去,此时服务里面的不同的线程就能通过自动装配来获取到数据。

JVM多级缓存通常分为四级,第一级是浏览器客户端缓存,用于缓存页面静态资源;第二级是nginx的本地缓存,存储部分动态数据;第三级是通过nginx编写lua代码查询redis中的缓存数据;第四级是查询tomcat的进程缓存,即JVM缓存,可使用Caffeine实现 [^2]。 OpenResty是基于Nginx的高性能Web平台,具备Nginx的完整功能,基于Lua语言扩展,集成大量Lua库和第三方模块,允许使用Lua自定义业务逻辑和库,可用于搭建处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关 [^3]。 在结合使用方法上,从多级缓存的角度来看,可在不同层级与OpenResty配合。在第二级nginx本地缓存中,OpenResty可利用自身基于Nginx的特性,高效地管理和使用本地缓存。在第三级通过nginx编写lua代码查询redis缓存数据时,OpenResty基于Lua语言扩展的特点能方便地实现该功能。而对于第四级JVM缓存,当请求经过OpenResty处理后,若未在前面的缓存层级命中,可继续查询JVM缓存。例如使用Caffeine构建JVM缓存,代码示例如下: ```java @Test void testBasicOps() { // 构建cache对象 Cache<String, String> cache = Caffeine.newBuilder().build(); // 存数据 cache.put("k1", "v1"); // 取数据 String v1 = cache.getIfPresent("k1"); System.out.println("k1 = " + v1); // 取数据,包含两个参数: // 参数一:缓存的key // 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑 // 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式 String v2 = cache.get("k2", key -> { // 根据key去数据库查询数据 return "v2"; }); System.out.println("k2 = " + v2); } ``` 在基于容量设置JVM缓存时,也可结合OpenResty使用,示例代码如下: ```java // 创建缓存对象 Cache<String, String> cache = Caffeine.newBuilder() .maximumSize(1) // 设置缓存大小上限为 1 .build(); ``` 在使用场景方面,对于处理超高并发的动态Web应用场景,当大量用户请求访问时,可先通过OpenResty利用多级缓存进行处理。若请求的是静态资源,可直接从第一级浏览器客户端缓存获取;若为动态数据,先查看nginx本地缓存,再通过OpenResty编写的Lua代码查询redis缓存,最后查询JVM缓存。这样能减少数据库的访问压力,提高系统的响应速度和并发处理能力。对于扩展性要求高的Web服务和动态网关场景,OpenResty可根据业务需求灵活配置多级缓存策略,通过Lua自定义业务逻辑,结合JVM缓存对不同类型的请求进行高效处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值