当前位置: 首页 > news >正文

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中设置:
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 '';# 执行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&#xff09…...

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&#xff1…...

识别视频中的人数并统计出来

目的: 使用Python和pysimpleguil以及opencv写一个统计人流量的软件。要求:1 加载选定的视频 2 通过形态学特征识别人,3统计人数并且在界面上显示出来,4 保存识别出人数的信息。 步骤 1: 安装必要的库 首先,确保你已经安装了Python。然后,安装PySimpleGUI和OpenCV。你可…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)&#xff0…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...