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

news2024/12/23 10:16:10

文章目录

  • 一、需求分析
  • 二、准备
    • 1、软件安装
    • 2、redis-lua封装优化
  • 三、实现
    • 1、nginx.conf
    • 2、dynamic.lua
      • 注意
    • 3、准备两个应用
    • 4、访问nginx
  • 四、参数直接传要代理的地址+端口

一、需求分析

根据用户访问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;
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java实现树形结构的设计

一、页面效果 二、数据库表设计 CREATE TABLE qc_question (id bigint(20) NOT NULL AUTO_INCREMENT,p_id bigint(11) NOT NULL,rank int(4) NOT NULL COMMENT 层级,name varchar(255) NOT NULL COMMENT 名称,code varchar(255) DEFAULT NULL COMMENT 编号,group_id bigint(20…

网络安全防御【防火墙双机热备带宽管理综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路: 四、实验步骤: 1、FW3的网络相关配置: 2、FW1的新增配置: 3、交换机LSW6(总公司)的新增配置: 4、双机热备技术配置(双机热…

【人工智能】高级搜索技术(模拟退火搜索算法和遗传算法解决旅行商问题)

目录 一、旅行商问题 1. 需求分析 2. 数据结构、功能模块设计与说明 2.1 数据结构 (1)模拟退火搜索算法 (2)遗传算法 2.2 功能模块设计 (1)模拟退火搜索算法 (2)遗传算法 …

离散数学,传递闭包的运算 ,集合的划分和覆盖 ,等价关系 ,等价类,相容关系 ,偏序关系

目录 1.传递闭包的运算 2.集合的划分和覆盖 3.等价关系 4.等价类 等价关系的性质 商集 5.相容关系 相容类 写出以下相容关系的最大相容类 完全覆盖 6.偏序关系 覆盖 7.哈斯图例子 1.传递闭包的运算 2.集合的划分和覆盖 3.等价关系 4.等价类 等价关…

starrcoks内存溢出后重启失败

sr版本:version 2.1.12 RELEASE (build 04f2931) 部署方式: FE:10.6.xx.107~10.6.xx.109 BE:10.6.xx.107~10.6.xx.111 问题:某天10.6.xx.107机器上的BE提示内存溢出(日志如下),重启后,be却无法…

Gooxi受邀参加第三届中国数据中心服务器与设备峰会

7月2-3日,第三届中国数据中心服务器与设备峰会在上海召开,作为国内最聚焦在服务器领域的专业峰会,吸引了来自全国的行业专家、服务器与机房设备厂家,企业IT用户,数据中心业主共同探讨AIGC时代下智算中心设备的设计之道…

普通人用AI提升收入的四种途径分享(附教程)

全文干货视频很长,建议先收藏再看。 实操和AI绘画工具可以扫描下方,免费获取 01 提升赚钱效率:拆解主业,让AI为你的主业做乘法 首先我要告诉你的是,用 AI 来提升收入这件事并不难,只不过大多数人用错了方…

文心一言 VS 讯飞星火 VS chatgpt (304)-- 算法导论22.2 2题

二、请计算出在图22-3所示无向图上运行广度优先搜索算法后的 d 值和 π 值。这里假定结点 u 为算法所用的源结点。 文心一言: 为了计算在图22-3所示的无向图上运行广度优先搜索(BFS)算法后的d值和π值,我们首先需要明确图的结构…

【linux】服务器重装系统之系统盘写入准备

【linux】服务器重装系统之系统盘写入准备 【创作不易,求点赞关注收藏】😀 文章目录 【linux】服务器重装系统之系统盘写入准备一、前期准备1、准备一个U盘,并进行格式化2、下载UltralSO工具3、下载对应的Ubuntu版本 二、写入操作教程 一、…

手机和电脑通过TCP传输(一)

一.工具 手机端:网络调试精灵 电脑端:野火网络调试助手 在开始通信之前,千万要查看一下电脑的防火墙是否关闭,否则可能会无法通信 在开始通信之前,千万要查看一下电脑的防火墙是否关闭,否则可能会无法通信…

中仕公考:考公基层工作经历怎么计算?

在国家及省级公务员考试中,可能会有岗位要求“基层工作经历”,很多考生对于这一概念了解的不是很清楚,该经历定义为个人在县级或以下级别的机关、国有企事业单位、以及村(社区)组织或其他经济和社会组织中的工作历程。 须知:应届…

Python与MQTT:构建物联网通信的桥梁

🚀Python与MQTT:构建物联网通信的桥梁🌉 在这个万物互联的时代,物联网(IoT)技术正以前所未有的速度改变着我们的生活。从智能家居到智慧城市,从工业自动化到农业智能化,物联网的触角…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本(超链接跳转) 锚点 图片标签 列表标签 表格标签 框架标签(窗口标签) 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示: 首先简要介绍前端的整…

电脑远程开关机

1. 远程开机 参考:https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒(需要主板支持,一般都支持) 要使用远程唤醒,有几种方式:使用类似向日葵开机棒(很贵)、公网ip&…

防火墙负载分担,带宽策略

一、实验拓扑图 二、实验要求 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流量不超过100M&a…

【Python】基础语法(函数、列表和元组、字典、文件)

。一、函数 1、函数是什么 编程中的函数和数学中的函数有一定的相似之处。 数学上的函数,比如 y sin x,x 取不同的值,y 就会得到不同的结果。 编程中的函数是一段可以被重复使用的代码片段。 (1)求数列的和&…

Go语言--广播式并发聊天服务器

实现功能 每个客户端上线,服务端可以向其他客户端广播上线信息;发送的消息可以广播给其他在线的客户支持改名支持客户端主动退出支持通过who查找当前在线的用户超时退出 流程 变量 用户结构体 保存用户的管道,用户名以及网络地址信息 typ…

第二届大数据、计算智能与应用国际会议(BDCIA2024)

会议日期:2024年11月15-17日 会议地点:中国-湖北省-黄冈市 主办单位:黄冈师范学院 【大会主席】 【主讲嘉宾】 大会邀请到来自美国、英国、加拿大、新加坡、意大利、越南等10余位领域内学术大咖作主题报告,并与参会人员互动交…

实战:功能强大齐全BBS论坛项目Echo简介

项目简介 Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot MyBatis MySQL Redis Kafka Elasticsearch Spring Security ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系…