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

灰度发布专题---3、Nginx+Lua灰度发布

上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现,但如果用户这时候在代理层如何做灰度发布呢?

代理层灰度发布分析

在这里插入图片描述
用户无论访问应用服务还是静态页,都要经过Nginx代理层,我们可以在Nginx这里做灰度发布,这里的灰度发布可以分为静态页灰度发布和应用动态发布,
如上图:动态服务灰度发布IP/ID切流:

  • zhangsan、wangwu使用A应用
  • zhaoliu使用B应用
  • 192.168.211.1/192.168.211.2 IP的用户使用A应用
  • 192.168.211.3 IP的用户使用B应用

静态资源灰度发布IP/ID切流:

  • zhangsan、wangwu访问静态页,使用/usr/bj目录下的静态页
  • zhaoliu访问静态页,使用/usr/tj目录下的静态页
  • 192.168.211.1/192.168.211.2 IP的用户使用/usr/sz目录下的静态页

IP分流灰度发布

我们为了测试系统,通常把公司内部IP设置为测试IP,也就是使用灰度系统的IP,此时内部员工测试直接访问服务器即可,但是访问服务器又分为静态资源访问和动态服务访问,都有不同的实现策略。在代理层实现灰度发布,可以采用Nginx+Lua实现。

动态服务灰度发布

IP切流动态服务灰度发布方式的实现要借助Nginx+Lua和Redis了,我们可以先把公司内部的IP全部存储在Redis缓存中,当用户访问系统的时候,先通过Lua脚本根据IP查询Redis缓存,如果Redis缓存数据存在就表明使用灰度系统,如果没有缓存则使用稳定版系统。
在这里插入图片描述
IP切流步骤如上图:

  1. IP校验
    在服务器上创建lua脚本文件/usr/local/openresty/nginx/lua/loadip.lua:
--客户端
IPlocal headers=ngx.req.get_headers()
local ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or 
ngx.var.remote_addr or "0.0.0.0"
--local ip = "192.168.211.1"--引入redis依赖
local redis = require("resty.redis");
local red = redis:new()
red:set_timeout(2000)
red:connect("192.168.211.142", 6379)
--执行查询
local grayresult=red:get(ip);
red:close()if grayresult==nil or grayresult==nil or grayresult==ngx.null then 
--没有数据则查询主服务 
ngx.var.upstream = "sys"
else 
--如果有数据,则查询灰度服务 
ngx.var.upstream = "gray"
end
  1. Nginx控制配置:
    修改nginx.conf配置如下:
    在这里插入图片描述
    上图代码如下:
#灰度系统负载均衡池
upstream gray { 
server 192.168.211.1:18082;
}
#稳定系统负载均衡池
upstream sys { 
server 192.168.1.5:18081;
}
server {    
listen       80;    
server_name localhost;    
#charset koi8-r;    
#access_log logs/host.access.log main;
#所有动态请求    
location / {        
#设置负载均衡池        
set $upstream '';        
#查找负载均衡池        
access_by_lua_file /usr/local/openresty/nginx/lua/loadip.lua;        
#反向代理        
proxy_pass http://$upstream;   
}
}
  1. 效果测试
    在这里插入图片描述
    在Redis中添加IP 192.168.211.1,访问时会走灰度发布系统,把IP删除会走稳定系统。

静态资源灰度发布

我们把稳定静态资源和灰度静态页资源分别放在了 /usr/local/openresty/nginx/static1/ 和 /usr/local/openresty/nginx/static2/目录下,我们要求公司员工IP访问灰度发布的静态页, 非公司员工IP访问稳定版本页面,这里又需要用到指定IP查询了。
创建 home.lua脚本如下:

--客户端IP 
local headers=ngx.req.get_headers() 
local ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0" 
--local ip = "192.168.211.1" 
--引入redis依赖 
local redis = require("resty.redis"); 
local red = redis:new() 
red:set_timeout(2000) 
red:connect("192.168.211.142", 6379) 
--执行查询 
local grayresult=red:get(ip); 
red:close() 
if grayresult==nil or grayresult==nil or grayresult==ngx.null then --没有数据则查询主服务 
ngx.var.homepath = "/usr/local/openresty/nginx/static1/" 
else 
--如果有数据,则查询灰度服务 
ngx.var.homepath = "/usr/local/openresty/nginx/static2/" 
end

nginx.conf配置如下:图片、静态页、样式、脚本,我们都进行灰度发布,如下配合

#静态资源 
location ~* \.(jpg|png|html|css|js|woff|ttf|woff2) { 
#静态资源路径设置 
set $homepath ''; 
#lua脚本校验使用静态资源 
access_by_lua_file /usr/local/openresty/nginx/lua/home.lua; #静态资源root配置 
root $homepath; 
} 

ID切流灰度发布

现在的项目大多数已经是微服务项目,而微服务项目几乎都是前天传递JWT令牌到后台,要想实现ID切 流,我们需要在代理层识别用户身份(JWT令牌),我们需要引入 lua-resty-jwt模块,是用于 ngx_lua 和 LuaJIT 的 Lua 实现库,在该模块能实现Jwt令牌生成、Jwt令牌校验,依赖库的地址:http s://github.com/SkyLothar/lua-resty-jwt。

JWT令牌识别库安装

将下载好了该依赖库 lua-resty-jwt-master.zip,我们将该库文件上传到服务器上,并解压,当然,我 们也可以使用opm直接安装 lua-resty-jwt,配置 lua-resty-jwt之前,我们需要先安装resty和 opm。
安装仓库管理工具包:

yum install yum-utils 

添加仓库地址:

yum-config-manager --add-repo 
https://openresty.org/package/centos/openresty.repo 

安装resty:

yum install openresty-resty 

安装opm:

yum install openresty-opm 

安装Jwt组件:

opm get SkyLothar/lua-resty-jwt 

此时 lua-resty-jwt安装好了,可以直接使用了。
在这里插入图片描述

ID识别

我们先利用 lua-resty-jwt生成令牌,再解析令牌 创建 make.lua用于生成令牌:

ngx.header.content_type="application/json;charset=utf8" local cjson = require "cjson" 
local jwt = require "resty.jwt" 
--生成令牌 
--lua-resty-jwt为秘钥 
local jwt_token = jwt:sign( 
"lua-resty-jwt", 
{ 
header={typ="JWT", alg="HS256"}, 
payload={name="zhangsan"} 
} 
) 
ngx.say(jwt_token) 

创建 token.lua用户校验令牌:

local cjson = require "cjson" 
local jwt = require "resty.jwt" 
--获取请求头中的令牌数据 
local auth_header = ngx.var.http_Authorization 
local jwt_obj = jwt:verify("lua-resty-jwt", auth_header) ngx.say(cjson.encode(jwt_obj)) 

nginx.conf配置如下:

#校验令牌 
location /check { 
content_by_lua_file /usr/local/openresty/nginx/lua/token.lua; } 
#生成令牌 
location /token { 
content_by_lua_file /usr/local/openresty/nginx/lua/make.lua; } 

生成令牌:http://192.168.211.142/token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.VxhQcGihWyHuJeHhpUiq2FU7 aW2s_3ZJlY6h1kdlmJY 

校验令牌:http://192.168.211.142/check
在这里插入图片描述

ID切流实现

结合上面JWT令牌识别,可以编写一个ID切流的流程,我们这里假设是zhangsan用户就访问灰度版本, 其他用户访问稳定版本,创建id.lua如下代码:

local cjson = require "cjson" 
local jwt = require "resty.jwt" 
--获取请求头中的令牌数据 
local auth_header = ngx.var.http_Authorization 
local jwt_obj = jwt:verify("lua-resty-jwt", auth_header) --解析的用户名 
local username = jwt_obj["payload"]["name"] 
if username=="zhangsan" then 
--没有数据则查询主服务 
ngx.var.idpath = "/usr/local/openresty/nginx/static1/" 
else
--如果有数据,则查询灰度服务 
ngx.var.idpath = "/usr/local/openresty/nginx/static2/" 
end

nginx.conf修改配置如下:

#ID切流 
location =/1.html { 
#静态资源路径设置 
set $idpath ''; 
#lua脚本校验使用静态资源 
access_by_lua_file /usr/local/openresty/nginx/lua/id.lua; #静态资源root配置 
root $idpath; 
} 

相关文章:

灰度发布专题---3、Nginx+Lua灰度发布

上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现,但如果用户这时候在代理层如何做灰度发布呢? 代理层灰度发布分析 用户无论访问应用服务还是静态页,都要经过Nginx代理层,我们可以在Nginx这里做灰度发…...

冬天来了,波司登的高端化“春天”不远了?

最近,羽绒服频繁“贵”上热搜。 在众多热搜词条中,一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此,波司登在最新的业绩说明会上进行了回应,公司表示:“波司登旗下主品牌及子品牌将形成差…...

Vue3.0优点详解

相对于Vue2.0 3.0有了比较大的改进,优势主要有以下几点: 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象,取代了Vue2.0中的Object.defineProperty,使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…...

Unity3D URP 自定义范围的特效热扭曲详解

前言 Unity3D URP(Universal Render Pipeline)是Unity官方推出的一款渲染管线,可以实现高效、高质量的图形渲染。在URP中,我们可以通过自定义特效来增强游戏的视觉效果。本文将详细解释如何使用URP实现一个自定义范围的特效热扭曲…...

Apache Flink(一):Apache Flink是什么?

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...

Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章

在当今数字化时代,博客已经成为许多人分享观点、经验和知识的重要平台。然而,对于博主们来说,每天按时发布一篇又一篇的文章可能是一项具有挑战性的任务。为了解决这个问题,一些创新的工具应运而生,其中包括WordPress的…...

VUE项目中问题学习总结(一)

文章目录 🍁自定义组件使用🍁clearInterval函数的使用🌿定时器的作用 🍁localStorage的使用🌿设置数据🌿获取数据🌿更新数据🌿删除数据 🍁VUE国际化配置🍁项目…...

使用K-means把人群分类

1.前言 K-mean 是无监督的聚类算法 算法分类: 2.实现步骤 1.数据加工:把数据转为全数字(比如性别男女,转换为0 和 1) 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source:http:img-blog.csdnimg.cn…...

静态HTTP和动态HTTP有什么区别

静态HTTP是指网页内容在服务器上以静态文件的形式存在,每个页面都是固定的,不能根据用户的操作或输入进行改变。当用户请求一个静态页面时,服务器直接将页面的HTML代码返回给用户的浏览器进行显示。静态HTTP服务器的主要优点是速度快、简单易…...

分享66个在线客服JS特效,总有一款适合您

分享66个在线客服JS特效,总有一款适合您 66个在线客服JS特效下载 链接:https://pan.baidu.com/s/1VqM6ASgKRFdQ8RyzbsX4uA?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气&#xff0…...

Backend - Django JsonResponse HttpResponse

目录 一、关系 二、使用 (一)data 字典传值 1. JsonResponse 2. HttpResponse 3. 例子 (二)JsonResponse 有一个 safe 参数 (三)前端接收 1. 接收 JsonResponse 回传的值 2. 接收 HttpResponse 回…...

第四阶|自在行草 暄桐教室,林曦书法 从书法之美到生活之美

我这有很多的课程,需要了可以取用 新一期(入门课),目前已经更新完毕。 新一期(第一阶),目前已经更新完毕。 新一期(第二阶),目前已经更新完毕。 新一期&#…...

kubernetes详解——从入门到入土(更新中~)

k8s简介 编排工具:系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose:实现单机容器编排docker swarm:实现多主机整合成为一个docker machine:初始化新主机mesos marathonmesos …...

VScode异常处理 (因为在此系统上禁止运行脚本)

在使用 VScode 自带程序终端的时候会报出"系统禁止脚本运行的错误" 这是由于 Windows PowerShell执行策略导致的 解决办法 管理员身份运行 Windows PowerShell执行:get-ExecutionPolicy1,显示Restricted2执行:Set-ExecutionPoli…...

(5h)Unity3D快速入门之Roll-A-Ball游戏开发

DAY1:Unity3D安装 链接 DAY2:构建场景,编写代码 链接 内容:WASD前后左右移动、摄像机跟随 DAY3:待更新 DAY4:待更新 DAY5:待更新...

分享86个选项卡TABJS特效,总有一款适合您

分享86个选项卡TABJS特效,总有一款适合您 86个选项卡TABJS特效下载链接:https://pan.baidu.com/s/1NBtPP2tT5YQqi6c744tCqg?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气&#xff0…...

【Linux】Linux基础

文章目录 学习目标操作系统不同应用领域的主流操作系统虚拟机 Linux系统的发展史Linux内核版和发行版 Linux系统下的文件和目录结构单用户操作系统vs多用户操作系统Windows和Linux文件系统区别 Linux终端命令格式终端命令格式查阅命令帮助信息 常用命令显示文件和目录切换工作目…...

动态规划求解 fibonacci 数列

动态规划: 动态规划的基本思想是:将原问题拆分为若干子问题,自底向上的求解。是自底向上的求解,即是先计算子问题的解,再得出原问题的解。 思路: 创建一个数组,大小为n1,用于存储斐波那契数列的值。数组的…...

js最大公约数的实现有哪些办法

在JavaScript中,有几种常见的方法可以实现最大公约数(GCD)的计算。以下是其中一些方法: 辗转相除法(欧几里德算法): 辗转相除法是一种基于递归的算法,用于计算两个数的最大公约数。它…...

盘后股价狂飙16% — GitLab的DevOps产品在AI时代展现强劲财务业绩

12月4日(周一)在美股收盘后,GitLab的股价狂飙16%!人工智能驱动的DevOps产品继续凸显其平台能力的优势。 GitLab 12 月 4 日股价图 GitLab报告第三季度收入同比增长32%!根据粗略统计,全球已经有接近1万家企…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...