多级缓存架构(三)OpenResty Lua缓存

这篇具有很好参考价值的文章主要介绍了多级缓存架构(三)OpenResty Lua缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过本文章,可以完成多级缓存架构中的Lua缓存。
多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker
多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker

一、nginx服务

docker/docker-compose.yml中添加nginx服务块。

  nginx:
    container_name: nginx
    image: nginx:stable
    volumes:
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/dist:/usr/share/nginx/dist
    ports:
      - "8080:8080"
    networks:
      multi-cache:
        ipv4_address: 172.30.3.3

删除原来docker里的multiCache项目并停止springboot应用。

nginx部分配置如下,监听端口为8080,并且将请求反向代理至172.30.3.11,下一小节,将openresty固定在172.30.3.11

upstream nginx-cluster {
    server 172.30.3.11;
}

server {
    listen       8080;
    listen  [::]:8080;
    server_name  localhost;

    location /api {
        proxy_pass http://nginx-cluster;
    }
}

重新启动multiCache看看nginx前端网页效果。

docker-compose -p multi-cache up -d

访问http://localhost:8080/item.html?id=10001查询id=10001商品页
多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker
这里是假数据,前端页面会向/api/item/10001发送数据请求。

二、OpenResty服务

1. 服务块定义

docker/docker-compose.yml中添加openresty1服务块。

  openresty1:
    container_name: openresty1
    image: openresty/openresty:1.21.4.3-3-jammy-amd64
    volumes:
      - ./openresty1/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
      - ./openresty1/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./openresty1/lua:/usr/local/openresty/nginx/lua
      - ./openresty1/lualib/common.lua:/usr/local/openresty/lualib/common.lua
    networks:
      multi-cache:
        ipv4_address: 172.30.3.11

2. 配置修改

前端向后端发送/api/item/10001请求关于id=10001商品信息。

根据nginx的配置内容,这个请求首先被nginx拦截,反向代理到172.30.3.11 (即openresty1)。

upstream nginx-cluster {
    server 172.30.3.11;
}

server {
    location /api {
        proxy_pass http://nginx-cluster;
    }
}

openresty1收到的也是/api/item/10001,同时,openresty/api/item/(\d+)请求代理到指定lua程序,在lua程序中完成数据缓存。
多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker
因此,openrestyconf/conf.d/default.conf如下

upstream tomcat-cluster {
    hash $request_uri;
    server 172.30.3.4:8081;
#     server 172.30.3.5:8081;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    # intercept /item and join lua
    location ~ /api/item/(\d+) {
        default_type application/json;
        content_by_lua_file lua/item.lua;
    }

    # intercept lua and redirect to back-end
    location /path/ {
        rewrite ^/path/(.*)$ /$1 break;
        proxy_pass http://tomcat-cluster;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/dist;
    }
}

conf/nginx.confhttp块最后添加3行,引入依赖。

    #lua 模块
    lua_package_path "/usr/local/openresty/lualib/?.lua;;";
    #c模块
    lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
    #本地缓存
    lua_shared_dict item_cache 150m;

3. Lua程序编写

common.lua被挂载到lualib,表示可以被其他lua当做库使用,内容如下

-- 创建一个本地缓存对象item_cache
local item_cache = ngx.shared.item_cache;

-- 函数,向openresty本身发送类似/path/item/10001请求,根据conf配置,将被删除/path前缀并代理至tomcat程序
local function read_get(path, params)
    local rsp = ngx.location.capture('/path'..path,{
        method = ngx.HTTP_GET,
        args = params,
    })
    if not rsp then
        ngx.log(ngx.ERR, "http not found, path: ", path, ", args: ", params);
        ngx.exit(404)
    end
    return rsp.body
end

-- 函数,如果本地有缓存,使用缓存,如果没有代理到tomcat然后将数据存入缓存
local function read_data(key, expire, path, params)
    -- query local cache
    local rsp = item_cache:get(key)
    -- query tomcat
    if not rsp then
        ngx.log(ngx.ERR, "redis cache miss, try tomcat, key: ", key)
        rsp = read_get(path, params)
    end
    -- write into local cache
    item_cache:set(key, rsp, expire)
    return rsp
end

local _M = {
    read_data = read_data
}

return _M

item.lua是处理来自形如/api/item/10001请求的程序,内容如下

-- include
local commonUtils = require('common')
local cjson = require("cjson")

-- get url params 10001
local id = ngx.var[1]
-- redirect item, 缓存过期时间1800s, 适合长时间不改变的数据
local itemJson = commonUtils.read_data("item:id:"..id, 1800,"/item/"..id,nil)
-- redirect item/stock, 缓存过期时间4s, 适合经常改变的数据
local stockJson = commonUtils.read_data("item:stock:id:"..id, 4 ,"/item/stock/"..id, nil)
-- json2table
local item = cjson.decode(itemJson)
local stock = cjson.decode(stockJson)
-- combine item and stock
item.stock = stock.stock
item.sold = stock.sold
-- return result
ngx.say(cjson.encode(item))

4. 总结

  1. 这里luaitem(tb_item表)和stock(tb_stock表)两个信息都有缓存,并使用cjson库将两者合并后返回到前端。
  2. 关于expire时效性的问题,如果后台改变了数据,但是openresty关于此数据的缓存未过期,前端得到的是旧数据
  3. 大致来说openresty = nginx + lua,不仅具有nginx反向代理的能力,还能介入lua程序进行扩展。

三、运行

到此为止,docker-compose.yml应该如下

version: '3.8'

networks:
  multi-cache:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.30.3.0/24

services:
  mysql:
    container_name: mysql
    image: mysql:8
    volumes:
      - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/logs
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=1009
    networks:
      multi-cache:
        ipv4_address: 172.30.3.2

  nginx:
    container_name: nginx
    image: nginx:stable
    volumes:
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/dist:/usr/share/nginx/dist
    ports:
      - "8080:8080"
    networks:
      multi-cache:
        ipv4_address: 172.30.3.3

  openresty1:
    container_name: openresty1
    image: openresty/openresty:1.21.4.3-3-jammy-amd64
    volumes:
      - ./openresty1/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
      - ./openresty1/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./openresty1/lua:/usr/local/openresty/nginx/lua
      - ./openresty1/lualib/common.lua:/usr/local/openresty/lualib/common.lua
    networks:
      multi-cache:
        ipv4_address: 172.30.3.11

启动各项服务

docker-compose -p multi-cache up -d

启动springboot程序。
多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker

四、测试

清空openresty容器日志。
访问http://localhost:8080/item.html?id=10001
查看openresty容器日志,可以看到两次commonUtils.read_data都没有缓存,于是代理到tomcat,可以看到springboot日志出现查询相关记录。

2024-01-12 11:45:53 2024/01/12 03:45:53 [error] 7#7: *1 [lua] common.lua:99: read_data(): redis cache miss, try tomcat, key: item:id:10001, client: 172.30.3.3, server: localhost, request: "GET /api/item/10001 HTTP/1.0", host: "nginx-cluster", referrer: "http://localhost:8080/item.html?id=10001"
2024-01-12 11:45:53 2024/01/12 03:45:53 [error] 7#7: *1 [lua] common.lua:99: read_data(): redis cache miss, try tomcat, key: item:stock:id:10001 while sending to client, client: 172.30.3.3, server: localhost, request: "GET /api/item/10001 HTTP/1.0", host: "nginx-cluster", referrer: "http://localhost:8080/item.html?id=10001"
2024-01-12 11:45:53 172.30.3.3 - - [12/Jan/2024:03:45:53 +0000] "GET /api/item/10001 HTTP/1.0" 200 486 "http://localhost:8080/item.html?id=10001" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"

再次访问此网址,强制刷新+禁用浏览器缓存+更换浏览器
间隔超过4s但小于1800s时,日志如下,只出现一次miss。

2024-01-12 11:48:04 2024/01/12 03:48:04 [error] 7#7: *4 [lua] common.lua:99: read_data(): redis cache miss, try tomcat, key: item:stock:id:10001, client: 172.30.3.3, server: localhost, request: "GET /api/item/10001 HTTP/1.0", host: "nginx-cluster", referrer: "http://localhost:8080/item.html?id=10001"
2024-01-12 11:48:04 172.30.3.3 - - [12/Jan/2024:03:48:04 +0000] "GET /api/item/10001 HTTP/1.0" 200 486 "http://localhost:8080/item.html?id=10001" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"

再次访问此网址,强制刷新+禁用浏览器缓存+更换浏览器
间隔小于4s,日志如下,未出现miss。

2024-01-12 11:49:16 172.30.3.3 - - [12/Jan/2024:03:49:16 +0000] "GET /api/item/10001 HTTP/1.0" 200 486 "http://localhost:8080/item.html?id=10001" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"

五、高可用集群

1. openresty

多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker
对于openresty高可用,可以部署多个openresty docker实例,并在nginxdocker/nginx/conf/conf.d/default.confupstream nginx-cluster将多个openresty地址添加进去即可。比如

upstream nginx-cluster {
	hash $request_uri;
	# hash $request_uri consistent;
    server 172.30.3.11;
    server 172.30.3.12;
    server 172.30.3.13;
}

多个openresty 无论是conf还是lua都保持一致即可。
并且使用hash $request_uri负载均衡作为反向代理策略,防止同一请求被多个实例缓存数据。

2. tomcat

多级缓存架构(三)OpenResty Lua缓存,Server架构,# 多级缓存架构,缓存,架构,openresty,docker
对于springboot程序高可用,也是类似。可以部署多个springboot docker实例,并在openresty docker/openresty1/conf/conf.d/default.confupstream nginx-cluster将多个springboot地址添加进去即可。比如文章来源地址https://www.toymoban.com/news/detail-793413.html

upstream tomcat-cluster {
    hash $request_uri;
    server 172.30.3.4:8081;
    server 172.30.3.5:8081;
}

到了这里,关于多级缓存架构(三)OpenResty Lua缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

    Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能: 用户登录 :Kong 提供了多种认证插件,像 JWT、OAuth 2.0 等,可以满足用户登录需求。 Token 管理 :使用上述认证插件,Kong 可以有效地管理

    2024年01月23日
    浏览(44)
  • Openresty(二十二)ngx.balance和balance_by_lua终结篇

    一  灰度发布铺垫 ①  init_by_lua* init_by_lua    init_by_lua_block    当配置重载时,init_by_lua* 不会清空其内的lua_shared_dict共享数据 lua执行系统命令方法os.execute和io.popen      init_by_lua_file不能连接redis init_by_lua_file  ②  init_worker_by_lua* init_worker_by_lua init_worker_by_lua_block  ngx.worker

    2024年02月07日
    浏览(40)
  • Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)

    1 同nginx配置server以后,我们可以很方便的直接访问到文件服务器上的文件资源,但是某些情况下,文件资源可能是隐私图片,比如客户注册时上传的身份证照片等等,这时候我们需要对图片访问进行控制,必须登录后才能查看到这些隐私图片。 2 一般来说,我们都是通过后端

    2024年02月09日
    浏览(54)
  • 在Openresty中使用lua语言向请求浏览器返回请求头User-Agent里边的值

    可以参考《Linux学习之Ubuntu 20.04在https://openresty.org下载源码安装Openresty 1.19.3.1,使用systemd管理OpenResty服务》安装Openresty。 然后把下边的内容写入到openresty配置文件 /usr/local/openresty/nginx/conf/nginx.conf (根据实际情况进行选择文件): 然后 sudo openresty 启动openresty。 最后在浏览器里

    2024年02月07日
    浏览(62)
  • Linux Docker安装 Docker-Compose安装 Docker安装Mysql8 Nacos OpenResty Redis Kafka ElasticSearch MinIO..

    Docker安装 Docker默认镜像源下载太慢,可以调整为国内镜像源 为了验证是否切换成功,可以使用 docker info 查看,会显示如下信息: 安装Docker-Compose,这里下载的是最新版本v2.5.0,安装流程如下: 修改密码: select NOW() 时间如果小了8小时,执行如下操作同步时区即可: 如果要安

    2024年02月02日
    浏览(43)
  • openresty 安装, nginx与 openresty

    openresty VS nginx Nginx 是一款高性能的 Web 服务器和反向代理服务器,具备基础的功能如HTTP服务、负载均衡、反向代理以及动静分离等。它是许多互联网应用的核心组件,因其模块化和可扩展的设计而受到欢迎。1 OpenResty 是基于 Nginx 的 Web 平台,它通过Lua脚本语言扩展了Nginx的功

    2024年01月25日
    浏览(30)
  • 使用openresty替换线上nginx网关之openresty安装细节

    线上跑了多年的一个网关业务,随着部门的拆分,逐渐有了一个痛点。该网关业务主要处理app端请求,app端发起的请求,采用http协议,post方法,content-type采用 application/x-www-form-urlencoded ,表单中有一个固定的字段,叫功能号,即funcNo=1000100这样,然后表单中其他业务字段就根

    2024年02月07日
    浏览(40)
  • 多级缓存架构(五)缓存同步

    通过本文章,可以完成多级缓存架构中的缓存同步。 1. mysql添加canal用户 连接在上一次 multiCache 项目中运行的 mysql 容器,创建 canal 用户。 2. mysql配置文件 在 docker/mysql/conf/my.cnf 添加如下配置 3. canal配置文件 添加 canal 服务块到 docker-compose.yml ,如下 任意启动一个 canal-server 容

    2024年01月16日
    浏览(54)
  • 多级缓存架构(四)Redis缓存

    通过本文章,可以完成多级缓存架构中的Redis缓存。 在 docker/docker-compose.ym l中,添加redis服务块 在 spirngboot 项目启动时,将固定的热点数据提前加载到 redis 中。 1. 引入依赖 pom.xml 添加如下依赖 application.yml 添加如下配置 2. handler类实现 新建 config.RedisHandler 类,内容如下,主要

    2024年01月22日
    浏览(39)
  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、授权和鉴权 、网关 、注册与发现 系统架构 docker部署

    源代码地址https://github.com/junkai-li/NetCoreKevin 基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、 docker部署  如需简约项目可直接去除项目引用 解耦设计都可以单独引用 架构默认全部引用并启动 项目启动时

    2023年04月24日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包