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 '';# 执行luaaccess_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 thenngx.exit(403)ngx.say("no param as client: ", err)returnend-- 根据client,获取到ip+端口local clientIP, err = red:get(clientKey)if not clientIP thenngx.exit(404)ngx.say("failed to connect redis: ", err)returnelseif clientIP == ngx.null thenngx.exit(404)ngx.say("failed to connect redis: ", err)returnend-- 将获取到的value赋值给target-- ngx.var.target = clientIPreturn clientIPendreturn _M
注意
这里防止new多次,能否提高性能表示存疑。
3、准备两个应用
192.168.56.1:8081、192.168.56.1:8082,分别在redis中设置:

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 '';# 执行luaaccess_by_lua_block {local clientKey = ngx.req.get_uri_args()["client"]if not clientKey thenngx.exit(403)ngx.say("no param as client: ", err)returnendngx.var.target = clientKey}proxy_pass http://$target;resolver 114.114.114.114;}}
}
相关文章:
Openerstry + lua + redis根据请求参数实现动态路由转发
文章目录 一、需求分析二、准备1、软件安装2、redis-lua封装优化 三、实现1、nginx.conf2、dynamic.lua注意 3、准备两个应用4、访问nginx 四、参数直接传要代理的地址端口 一、需求分析 根据用户访问url的参数,将请求转发到对应指定IP的服务器上。 二、准备 1、…...
数字名片-Pushmall 智能AI数字名片7月更新计划
[数字名片]-商务营销推广助手7月更新计划 数字名片-商务营销推广助手7月更新计划 **2024年 6月完成模块开发优化****实现SaaS框架业务 1、智能名片:创建个人名片、企业名片、商机管理。 2、人脉商圈:附近人脉、就近群脉、好友名片。 3、企微社群&…...
21. Python代码快速查看数组分布
1. 前言 当你已经具备一段可用于快速查看数组分布的Python代码时,你拥有了一项强大的工具来分析和理解你的数据集。这种类型的代码通常会使用可视化库,例如Matplotlib和Seaborn,以直观的方式展示数据分布。这些库允许你创建直方图以观察数据集中的频率分布,以及核密度估计…...
记录些Redis题集(3)
分布式锁 分布式锁是一种用于在分布式系统中实现互斥访问的机制,它可以确保在多个节点、或进程同时访问共享资源。如果没有适当的锁机制,就可能导致数据不一致或并发冲突的问题。 分布式锁需要的介质 需要一个多个微服务节点都能访问的存储介质&#…...
OracleLinux6.9升级UEK内核
方法一: [root@localhost ~]# uname -r 4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# rpm -qa | grep kernel-uek kernel-uek-firmware-4.1.12-61.1.28.el6uek.noarch kernel-uek-4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# yum list kernel-uek Loaded plug…...
React学习笔记03-----手动创建和运行
一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录,提供可以供外部直接访问的文件,存放不需要webpack打包的文件,比如静态图片、CSS、JS src存放源码 (1)…...
ubantu22.04安装OceanBase 数据库
1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…...
【linux】【深度学习】fairseq框架安装踩坑
直接pip install fairseq发现跑代码时候老是容易崩,所以选择用源码编译安装。 python环境选择3.8以上都行,我选择3.10 首先安装torch, 我选择安装pip install torch1.13.1 torchaudio0.13.1以及cuda 11.7 (具体cuda根据个人显卡进…...
【Python爬虫教程】第7篇-requests模块的cookies保存和使用
文章目录 为什么要保存cookiesrequests.utils工具类保存cookies到本地文件从本地文件解析cookies使用使用实践 为什么要保存cookies 保存cookies是避免每次都登录获取权限,一遍权限是有过期时间的,不需要每次重复登录,可以将cookies保存起来…...
微信小程序开发基础知识6----使用npm包
一、小程序对npm的支持与限制 目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用npm 包有如下3个限制: ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置对象的包 ③ 不支持依赖于…...
如何在element中table的 v-for中 使用slot-scope?
有时候我们需要通过数据库来动态控制表格的列,这样做的好处就是系统中如果有太多的表格项的话,直接这套代码就能通用了,其他的数据库里控制就行,不要太方便了,特别是一些ERP或者供应链的表格,动不动就是几十上百个字段,这时候不要太轻松了,废话不多说,直接上代码: &…...
企业网络实验dhcp-snooping、ip source check,防非法dhcp服务器、自动获取ip(虚拟机充当DHCP服务器)、禁手动修改IP
文章目录 需求相关配置互通性配置配置vmware虚拟机(dhcp)分配IP服务配置dhcp relay(dhcp中继)配置dhcp-snooping(防非法dhcp服务器)配置ip source check(禁手动修改IP)DHCP中继&…...
20. Python读取.mat格式文件通用函数
1. 前言 在科研和工程领域,MATLAB的.mat文件是一种常见的数据存储格式,用于保存复杂的数组和结构体。Python作为一种强大的编程语言,提供了多种库来读取和处理.mat文件。本文将介绍一个通用的Python函数,用于读取.mat格式文件,并将其内容转换为Python数据结构,以便进一步…...
Cypress UI自动化之安装环境
注:macOS系统 一、git环境 略 二、node环境 1、安装nvm 前提:有装过Homebrew,参考adb使用方法文档 1、安装nvm:首先要保证之前没有安装过node,如果之前安装过,先 brew uninstall node brew install n…...
SpringApplication.java类
Tips: 以下内容根据源码中的注解翻译 SpringApplication SpringApplication可用来从一个Java main方法引导和启动一个Spring应用。默认情况下,SpringApplication按照以下步骤引导你的应用: 创建一个合适的ApplicationContext(依赖于你的cl…...
智能招聘系统的AI功能解析
一、引言 随着科技的飞速发展,人工智能(AI)技术正逐步渗透到各个领域,为企业带来前所未有的变革。在人力资源管理领域,智能招聘系统的出现,不仅大大提高了招聘效率,还为企业带来了更精准、更科…...
AV1技术学习:Translational Motion Compensation
编码块根据运动矢量在参考帧中找到相应的预测块,如下图所示,当前块的左上角的位置为(x0, y0),在参考帧中找到同样位置(x0, y0)的块,根据运动矢量移动到目标参考块(左上角位置为:(x1, y1))。 AV1…...
mysql中的存储过程
存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句 废话不说多,直接实操 ##实现num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 声明变量,赋默认值为0select num20;end $$ delimiter ; …...
07:串口通信二
串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD࿱…...
识别视频中的人数并统计出来
目的: 使用Python和pysimpleguil以及opencv写一个统计人流量的软件。要求:1 加载选定的视频 2 通过形态学特征识别人,3统计人数并且在界面上显示出来,4 保存识别出人数的信息。 步骤 1: 安装必要的库 首先,确保你已经安装了Python。然后,安装PySimpleGUI和OpenCV。你可…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
