Openerstry + lua + redis根据请求参数实现动态路由转发

一、需求分析

根据用户访问url的参数,将请求转发到对应指定IP的服务器上。

二、准备

1、软件安装

安装openresty+redis,略

2、redis-lua封装优化

在关于web+lua+openresty开发中,项目中会大量操作redis,

重复创建连接–>数据操作–>关闭连接(或放到连接池)这个完整的链路调用完毕,
甚至还要考虑不同的 return 情况做不同处理,就很快发现代码中有大量的重复

推荐一个二次封装的类库
OpenResty使用Lua大全(四)OpenResty中使用Redis

三、实现

1、nginx.conf

worker_processes 4;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type text/html;
	sendfile        on;
    keepalive_timeout  65;
	
	# 指定lua文件地址
	lua_package_path '/usr/local/openresty/nginx/conf/?.lua;;';

    server {
        listen       80;
        server_name  192.168.56.10;
        charset utf-8;

        location / {
        	# 目标代理地址(动态生成)
        	set $target '';
        	# 执行lua
          	access_by_lua_block {
				local proxy = require("dynamic")
				ngx.var.target = proxy.dynamicProxy()
		   }
	        
	        proxy_pass http://$target;

			resolver 114.114.114.114;
        }

    }
}

2、dynamic.lua

local redis = require "resty.redis_iresty"
local _M = {_VERSION = '0.01'}

local opts = {
        ip = "192.168.56.10",
        port = "6379",
        -- password = "root",
        db_index = 0
}

local red = redis:new(opts)

-- 封装函数,防止每次redis都要new
function _M.dynamicProxy()
	-- 获取url参数,通过client来获取redis的ip+端口
	local clientKey = ngx.req.get_uri_args()["client"]
	if not clientKey then
			ngx.exit(403)
		ngx.say("no param as client: ", err)
		return
	end

	-- 根据client,获取到ip+端口
	local clientIP, err = red:get(clientKey)
	if not clientIP then
			ngx.exit(404)
		ngx.say("failed to connect redis: ", err)
		return
	elseif clientIP == ngx.null then
		ngx.exit(404)
			ngx.say("failed to connect redis: ", err)
		return
	end
	
	-- 将获取到的value赋值给target
	-- ngx.var.target = clientIP
	return clientIP
	
end


return _M

注意

这里防止new多次,能否提高性能表示存疑。

3、准备两个应用

192.168.56.1:8081、192.168.56.1:8082,分别在redis中设置:
client1:

4、访问nginx

在这里插入图片描述

在这里插入图片描述
至此,实现了根据请求参数进行动态路由转发。

四、参数直接传要代理的地址+端口

worker_processes 4;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type text/html;
    sendfile        on;
    keepalive_timeout  65;


    server {
        listen       80;
        server_name  192.168.56.10;
        charset utf-8;

        location / {
                # 目标代理地址(动态生成)
                set $target '';
                # 执行lua
                access_by_lua_block {
					local clientKey = ngx.req.get_uri_args()["client"]
					if not clientKey then
						ngx.exit(403)
						ngx.say("no param as client: ", err)
						return
					end
					ngx.var.target = clientKey
                   }

                proxy_pass http://$target;

                resolver 114.114.114.114;
        }

    }
}

相关推荐

  1. 请求优化--利用webpack实现根据进行懒加载

    2024-07-17 01:20:03       52 阅读
  2. Vue 实现动态

    2024-07-17 01:20:03       45 阅读
  3. react根据后端返回数据动态添加

    2024-07-17 01:20:03       23 阅读
  4. 3.1 Gateway之请求转发

    2024-07-17 01:20:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 01:20:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 01:20:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 01:20:03       58 阅读
  4. Python语言-面向对象

    2024-07-17 01:20:03       69 阅读

热门阅读

  1. Map和Set的迭代器原理

    2024-07-17 01:20:03       20 阅读
  2. tomcat为什么要自定义类加载器?

    2024-07-17 01:20:03       21 阅读
  3. Web 安全之 VAPT (漏洞评估与渗透测试)详解

    2024-07-17 01:20:03       21 阅读
  4. VScode编译c++代码json配置

    2024-07-17 01:20:03       24 阅读
  5. 【DRAM存储器三十四】LPDDR4介绍--MR和IO结构

    2024-07-17 01:20:03       18 阅读
  6. AI发展中的伦理挑战与应对策略

    2024-07-17 01:20:03       24 阅读
  7. 2024睿抗机器人开发者大赛CAIP编程赛题解(c++)

    2024-07-17 01:20:03       25 阅读
  8. ardupilot 系统时间见解

    2024-07-17 01:20:03       17 阅读