当前位置: 首页 > 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万家企…...

unity UI特效遮罩

using System.Collections; using System.Collections.Generic; using UnityEngine;/**UI特效遮罩 1.需要将ScrollRect 的遮罩Mask 换为 2D Mask2.将特效的Render里面的 Masking 设置为*/ public class UIParticleMaskControll : MonoBehaviour {// Start is called before …...

编程模拟支付宝能量产生过程--数据控制流

#模拟支付宝蚂蚁森林的能量产生过程 behavior_points { # 定义行为对应的积分"步行": 2,"生活缴费": 10,"线下支付": 5,"网络购票": 5,"共享单车": 10 }total_points 0 # 初始化总积分while True: # 开…...

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…...

2024 Move 中文开发者大会将于1月13–14日在上海举办

*以下文章来源于MoveFuns ,作者MoveFunsDAO 2024 Move 中文开发者大会将于1月13日-1月14日在上海举办。本届 Move 开发者大会以 “Move 生态关键的一年” 为主题。 由 MoveFuns 、OpenBuild 和 MoveBit 主办,Rooch、AptosGlobal、alcove、zkMove 和 Ti…...

基于PHP的在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发,数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…...

解决element ui tree组件不产生横向滚动条

结果是这样的 需要在tree的外层&#xff0c;包一个父组件 <div class"tree"><el-tree :data"treeData" show-checkbox default-expand-all></el-tree></div> 在css里面这样写,样式穿透按自己使用的css编译器以及框架要求就好 &l…...

mysql的InnoDB存储引擎

详情请参考&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html InnoDB 是一个通用目的的存储引擎&#xff0c;它在高可用性、高性能方面做了平衡。MySQL 8.0&#xff0c;InnoDB 是默认的存储引擎。在创建表的时候&#xff0c;如果没有使用ENGIN…...

MCU 的 TOP 15 图形GUI库:选择最适合你的图形用户界面(二)

在嵌入式系统开发中&#xff0c;选择一个合适的图形用户界面&#xff08;GUI&#xff09;库是至关重要的。在屏幕上显示的时候&#xff0c;使用现成的图形库&#xff0c;这样开发人员就不需要弄清楚底层任务&#xff0c;例如如何绘制像素、线条、形状&#xff0c;如果再高级一点…...

软件工程 单选多选补充 复刻

原文 软件的主要特性&#xff1a;无形、高成本、包括程序和文档 软件工程三要素&#xff1a;方法、工具、过程 螺旋模型包含风险分析 软件工程的主要目标&#xff1a;风险分析 面向对象开发&#xff1a;Booch、UML、Coad、OMT 软件危机的主要表现&#xff1a;软件成本太高…...

微前端个人理解与简单总结

最近一段时间在学习微前端&#xff0c;一开始是看各种博客了解微前端含义、对比多种微前端框架优劣&#xff0c;最后选择了qiankun、micro-app、wujie这三种微前端框架进行深入研究、对比。 微前端框架 推出时间 官方文档易读性 社区讨论活跃度 配置难度 Qiankun&#xff…...

网站定做/百度外链查询工具

解决循环引用的问题&#xff0c;参考学习了ibireme大神的YYFPSLabel的实现&#xff0c;整理以备用 // 如果直接用 self 或者 weakSelf&#xff0c;都不能解决循环引用问题_link [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:selector(t…...

有什么网站可以免费建站免费建网站/百度百科查询

前言 weblogic反序列化主要有XMLDecoder和T3协议。先从T3协议开始,主要是CVE-2015-4852这个漏洞 环境搭建 https://blog.csdn.net/qq_41918771/article/details/117467957https://blog.csdn.net/weixin_45682070/article/details/123230456主要参考这两篇文章,第一篇是我写…...

软件网站开发评估/seo关键词推广价格

饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 514 Accepted Submission(s): 226Problem Description电子科大本部食堂的饭卡有一种很诡异的设计&#xff0c;即在购买之前判断余额。如果购买一个商品之前&…...

微信公众号网站建设/2345纯净版推广包

原文出处&#xff1a;https://wiki.ubuntu.com/IptablesHowTo 原文作者&#xff1a;UbuntuWiki 授权许可&#xff1a;创作共享协议 GNU FDL 翻译人员&#xff1a;denven 校对人员&#xff1a;5451vs5451 贡献者&#xff1a; 适用版本&#xff1a; 文章状态&#xff1a;翻译完成…...

做刀模网站/企业线上培训平台有哪些

原文链接&#xff1a;工程师男友如何反窃听&#xff1f;趣聊密码学入门科普 阿里妹导读&#xff1a;谁都不想在通信过程中被别人“窃取”小秘密。本文借助一对情侣与八卦女、猥琐男的斗智故事&#xff0c;为大家讲述科普密码学基础知识。既有料又有趣&#xff0c;深入浅出&…...

优化站诊断/腾讯第三季度营收448亿元

mouseover定义和用法 当鼠标指针位于元素上方时&#xff0c;会发生 mouseover 事件。 该事件大多数时候会与 mouseout 事件一起使用。 mouseover() 方法触发 mouseover 事件&#xff0c;或规定当发生 mouseover 事件时运行的函数。 注释&#xff1a;与 mouseenter 事件不同&…...