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

文章目录

  • 一、需求分析
  • 二、准备
    • 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;
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDei在线设计器-数据格式说明

数据格式说明 DDei的所有设计数据都以文件为单位保存在一个JSON对象中。JSON对象包含了全量的页签、舞台、图层、控件的位置以及属性信息。开发人员可以存储这个JSON到服务端数据库中,从而轻易的实现保存功能;也解析这个JSON,将其转换成自己业…

没想到,2024年死磕技术是真的没用!快速提升职场竞争力的AI工具,才是真的王炸!

大家好,我是画画的小强 2024年最大的热点,除了裁员,就是各种AI技术层出不穷。 原本以为只是新技术的短暂爆火,但现实却残酷的警示着:AI抢走你饭碗时,连声招呼都不打! Excel、Word、PPT&#xf…

MAVSDK-Java安卓客户端编译与使用完整示例

效果: 1.启动PX4容器 2.监听QGC连接端口 3.手机与QGC连接到同一局域网(此例QGC为:192.168.6.250 手机为:192.168.6.86) 4.监听手机mavsdk_server连接端口 5.使用Android Studio打开MAVSDK-JAVA下的examples/android-c…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

排队问题--逆序对应用

对于逆序对,我们可以用树状数组的方式来求,但是值得注意的是,我们逆序对一般求的是比这个元素小的个数(位置可以是前或者后),那么求比这个元素大的个数怎么办,我们可以用 i - query() !!! 每个元…

C#中的委托

在C#中,委托(Delegate)是一种特殊的类型,它持有对方法的引用。委托可以指向静态方法、实例方法或Lambda表达式。它们在C#中用于实现回调机制、事件处理以及泛型方法的实现。 委托的主要特点包括: 类型安全&#xff1a…

颗粒饲料机器,打造成套饲料生产线

无论您是大型养殖场还是小型养殖户,我们的颗粒饲料机器能满足您的需求。我们致力于为客户打造成套饲料生产线,让您在养殖业中脱颖而出。 🚀 开启养殖新时代,您的饲料生产线升级设备! 还在为饲料生产烦恼吗&#xff1f…

html5——CSS背景属性设置

目录 背景颜色 background-color 背景图像 背景定位 背景样式简写 背景尺寸 ​编辑渐变属性 背景颜色 background-color 背景图像 background-image background-image:url(图片路径); 背景重复方式: background-repeat 属性: repeat&#…

elementui 日历组件el-calendar使用总结

功能: 1.日历可以周视图、月视图切换; 2.点击月视图中日期可以切换到对应周视图; 3.点击周视图查看当日对应数据; 4.周、月视图状态下,点击前后按钮,分别切换对应上下的周、月; 5.点击回到…

【深度学习】FaceChain-SuDe,免训练,AI换脸

https://arxiv.org/abs/2403.06775 FaceChain-SuDe: Building Derived Class to Inherit Category Attributes for One-shot Subject-Driven Generation 摘要 最近,基于主体驱动的生成技术由于其个性化文本到图像生成的能力,受到了广泛关注。典型的研…

Stable Diffusion - 光影魔法,SD中的光影控制(附模型)

今天继续分享SD中光影控制的运用和效果。 光影控制体验 — 这次介绍的光影控制效果如下: autumn lights:秋天光景,街景与人物服装也会变成秋装 spring lights:春天光景,街景与人物服装也会变成春装 summer lights…

【Python爬虫教程】第7篇-requests模块的cookies保存和使用

文章目录 为什么要保存cookiesrequests.utils工具类保存cookies到本地文件从本地文件解析cookies使用使用实践 为什么要保存cookies 保存cookies是避免每次都登录获取权限,一遍权限是有过期时间的,不需要每次重复登录,可以将cookies保存起来…

招聘难怎么破?这38个面试问题,助你精准筛选出适用人才!

对于专门负责招聘工作的人员来说,每天都有很多很多面试要应对,但你还不能敷衍,因为不能高效地挑选出合适的人才,你的招聘目标就没办法完成了。精准筛选你所需要的人才,跟面试官面试的时候提出的问题有很大关系。因为好…

29.【C语言】自定义函数

1、自定义详解 *提示&#xff1a;先看第12,19篇 例&#xff1a;写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…

【算法消费者行为】算法性能预期如何增强冲动性购买?—推文分享—2024-07-16

今天的推文主题是&#xff1a;【算法&消费者行为】 第一篇&#xff1a;如何通过管理多种刺激来优化客户体验&#xff1f;购买行为的驱动因素是隐性还是显性的消费者态度&#xff1f;第二篇&#xff1a;算法性能期望如何增强在线零售中的即兴购买行为。第三篇&#xff1a;社…

详解linux驱动框架(开篇)

该系列博客只是个人记录&#xff0c;笔者本人也是菜鸟&#xff0c;如果出现大量错误&#xff0c;欢迎留言评论&#xff0c;请不要进行人身攻击等行为。 让我们先从drivers/input/input.c入手&#xff0c;让我们想一想&#xff0c;当我们modprobe input1.ko时&#xff0c;内核会…

JuiceFS、Ceph 和 MinIO 结合使用

1. 流程图 将 JuiceFS、Ceph 和 MinIO 结合使用&#xff0c;可以充分利用 Ceph 的分布式存储能力、JuiceFS 的高性能文件系统特性&#xff0c;以及 MinIO 提供的对象存储接口。以下是一个方案&#xff0c;介绍如何配置和部署 JuiceFS 使用 Ceph 作为其底层存储&#xff0c;并通…

量化投资基础(三)之Fama-French 三因子模型(2)

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1. 前言 Sharp&#xff08;1964&#xff09;&#xff0c;Lintner&#xff08;1965&#xff09;&#xff0c;Black&#xff08;1972&#xff09;的资本资产定价模型&…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos&#xff08;2.2.0&#xff09; 服务&#xff0c;控制台报错 Unable to start embedded Tomcat。 报错信息&#xff1a;Unable to start …

解决UniGUI中动态创建控件时,控件不按序显示的问题。

这两天遇到一个问题&#xff1a;我在UNIGUI中多批次动态创建控件&#xff0c;但是这些控件在显示时并没有按我想要的顺序排列。比如动态创建UnimContainerPanel面板&#xff0c;这个面板上放一些其它控件用于显示数据。在手机中从上到下按顺序显示出来&#xff0c;当第一批次时…