OpenResty+Lua实现灰度发布

OpenResty+Lua实现灰度发布

业务场景

用户通过浏览器发送一个请求给openresty,openresty调用lua脚本获取用户id地址,并查看该ip地址是否存在redis中,如果存在则让用户访问v2.0版本,否则让用户访问v1.0版本。如图所示:

OpenResty+Lua实现灰度发布_第1张图片

实现方案

配置文件

  • nginx.conf
  • http.conf
  • app1.conf
  • app2.conf

Lua脚本

  • abtest.lua

实现流程

请求先进入openresty,然后openresty引用http.conf配置文件中的server调用lua脚本做处理,处理后使用ngx.exec()方法将流量转发到对应的版本地址

nginx

# work进程数量
worker_processes  1;




events {
	# work并发连接数
    worker_connections  1024;
}


http {
    include       mime.types;
    # 引入配置文件
    default_type  application/octet-stream;
    lua_package_path "/application/service/http/?.lua;;";
    # 关闭lua代码缓存
    lua_code_cache off;
	# 声明缓存
    lua_shared_dict my_cache 128m;
    include /application/service/http/*.conf;

    sendfile        on;
    keepalive_timeout  65;

		# 声明名称
	    upstream app1{
        	server 192.168.217.144:9090;
        }
		# 声明名称		
        upstream app2{
        	server 192.168.217.144:9091;
        }

    }

}

用户通过192.168.217.144:90端口访问,则调用到http.conf

server{
	listen 90;
	server_name localhost;

	location /{
		root html;
		index index.html index.htm;
         # 调用lua脚本
		content_by_lua_file /application/service/http/abtest.lua;
	}

	location @app1{
		proxy_pass http://app1;
	}

	location @app2{
		proxy_pass http://app2;
	}
}	

在此处调用lua脚本对请求进行处理

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Administrator.
--- DateTime: 2022/8/19 22:11
---


--local key = ngx.var.binary_remote_addr

ngx.header.content_type = "text/plain"

-- 获取请求参数
ngx.req.read_body()

-- 获取请求数据
local post_args_tab = ngx.req.get_post_args()

if not post_args_tab then
    ngx.say("请指定版本号")
    return
end

-- 获取请求参数
local request_data = {}
for k, v in pairs(post_args_tab) do
    request_data[k] = v
end

-- 判断版本控制参数是否存在
if not request_data["ver"] then
    ngx.say("ver not is null")
    return
end

-- 导入redis库
local redis_connetion = require("resty.redis")
-- new redis
local redis,err = redis_connetion:new()
redis:set_timeout(2000)
-- 链接redis
local ok,err = redis:connect("192.168.217.144",6379)
if not ok then 
	ngx.say("failed to connect",err)
	redis:close()
	return
end

-- 获取client地址
local key = ngx.var.binary_remote_addr
local a = redis:get(key)

-- 如果redis中没有改地址则将流量转发到v1.0版本,否则将流量转发到v2.0版本
if redis:get(key) == ngx.null then
    redis:set(key,"1")
    ngx.exec("@app1")
    return
end
ngx.exec("@app2")

app1.conf

server{
		listen 9090;
		server_name *.*;

		location /{
			root /application/html/app1;
			index index.html index.htm;
		}
	}

app2.conf

server{
		listen 9091;
		server_name localhsot;

		location /{
			root /application/html/app2;
			index index.html index.htm;
		}
	}

测试

可以看到redis中没有存储IP地址

OpenResty+Lua实现灰度发布_第2张图片

可以看到访问的是v1.0版本

OpenResty+Lua实现灰度发布_第3张图片

请求之后,已经将ip地址存入了redis中,再次请求就将他转发到v2.0版本
OpenResty+Lua实现灰度发布_第4张图片

你可能感兴趣的:(Lua,openresty,灰度发布,lua,openresty,开发语言)