当前位置:首页 > 技术文章 > 正文内容

Openresty 配合 redis 实现无感知灰度发布系统(基础篇)

arlanguage3个月前 (01-31)技术文章26

Openresty 实现无感知灰度发布系统(基础篇)

Openresty 是基于 nginx 的一个成熟的网络平台,集成 nginx 和加强的 luajit,许多实用的 lua 库和一些高品质高性能的第三方 nginx 模块。

本文将使用 Openresty 来搭建一个简单的灰度发布系统。环境为 Cenos7。

安装 Openresty

参见 链接: https://blog.csdn.net/weixin_42085428/article/details/104883484.

配置 Nginx

在用户目录下创建工作目录,创建 nginx.conf 配置文件,目录结构如下图:

在这里插入图片描述


nginx配置文件:


worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}


# 通过 redis 获取灰度用户区间,执行灰度操作
# 灰度测试完毕后,所有用户切换到灰度服务器,更新正式服务器
# 清空灰度服务器列表

http {
    # 灰度服务器
    upstream grayscale.server{
        server 127.0.0.1:9090;
    }

    # 正式服务器
    upstream prod.server{
        server 127.0.0.1:8080;
    }

    server {
        listen 1111;
        location / {
            expires 5s;
            # 默认为生产环境
               set $target 'prod.server';
            default_type text/html;
            access_by_lua_file /Users/wangjie/data/nginx/lua/grayscale.lua;
            proxy_pass $scheme://$target$request_uri;
        }
    }
}

grayscale.lua 代码:

--[[ 
# 解决方案
# redis 中存储用户token 对应用户id
# redis 中存储灰度用户id区间
# 通过 token 获取用户 id 判断是否在灰度用户区间内
]]

local cjson = require('cjson')
local redis = require('resty.redis')
local red = redis:new()
red:connect("127.0.0.1",6379)

-- 灰度区间
local Grayscale_Range = red:get("Grayscale_Range")
local Grayscale_Range_Obj = cjson.decode(Grayscale_Range)
local IdStart = tonumber(Grayscale_Range_Obj.idStart)
local IdEnd = tonumber(Grayscale_Range_Obj.idEnd)

-- 用户信息
local UserToken = ngx.req.get_headers()["TOKEN"]
local UserId = tonumber(red:get("TOKEN_"..UserToken))


if (UserToken != nil)
then
    if ((UserId > IdStart) and (UserId < IdEnd))
    then
        ngx.var.target = "grayscale.server"
    end
end

创建两个web服务

创建两个 web服务,这里我使用 springboot 创建了两个简单的接口用于模拟灰度和生产环境分别返回如下内容

在这里插入图片描述

启动 redis 服务

redis 服务,代码写的是 6379 无密码,如果有密码加一句 在red:auth("密码") 即可。在 DB0 中新增两个值如下

// 原样拷贝即可
Grayscale_Range = {
    "idStart":1,
    "idEnd":5000
}
TOKEN_HGdsakGDKSFGkgcshalGF = 1234

测试

使用 postman 请求 http://localhost:1111/api/test1 并携带 TOKEN 请求头(HGdsakGDKSFGkgcshalGF)时,返回灰度环境内容

在这里插入图片描述

修改 redis 键 Grayscale_Range 的值为

{
    "idStart":1,
    "idEnd":100
}

再次请求,发现已经切换回生产环境

在这里插入图片描述


至此,大功告成

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1569.html

分享给朋友:

“Openresty 配合 redis 实现无感知灰度发布系统(基础篇)” 的相关文章

NGINX配置跨域CORS支持 nginx配置跨域请求

NGINX配置跨域CORS支持这两天在搞酷瓜云网课的 app,采用 uni-app 做全端支持,现学现卖,目前算是入门了。在做 H5 的时候难免会跨域请求后端 API,虽然用 HBuilder 内置的浏览器不会有跨域问题(这个应该是做了内部处理),但是那个内置浏览器真尼妈坑爹,过一会就会卡死,导致...

提升网站性能开发的10个技巧 提升网站性能开发的10个技巧是什么

随着网络的高速发展,网络性能的持续提高成为能否在芸芸App中脱颖而出的关键。高度联结的世界意味着用户对网络体验提出了更严苛的要求。假如你的网站不能做到快速响应,又或你的App存在延迟,用户很快就会移情你的竞争对手。以下为大家总结10条有关性能提升的经验,以供参考:1. 采用反向代理服务器(Rever...

C# 实现高并发 Web 应用的性能优化秘籍

在现代的互联网应用中,尤其是大型 Web 应用,性能和可扩展性成为了核心竞争力。随着用户访问量和数据量的增大,高并发处理成为了系统稳定性和响应速度的关键因素。无论是电商平台、社交网站还是 SaaS 应用,如何应对海量用户的同时访问,确保系统高效运转,已经成为了技术人员面临的重要挑战。C# 和 ASP...

一文教会你如何使用 iLogtail SPL 处理日志

作者:阿柄随着流式处理的发展,出现了越来越多的工具和语言,使得数据处理变得更加高效、灵活和易用。在此背景下,SLS 推出了 SPL(SLS Processing Language) 语法,以此统一查询、端上处理、数据加工等的语法,保证了数据处理的灵活性。iLogtail 作为日志、时序数据采集器,在...

宝塔面板如何关闭https强制跳转http/https共存

宝塔面板如何关闭https强制跳转http/https共存在 宝塔面板 中,如果你需要关闭 HTTPS 强制跳转并实现 HTTP 和 HTTPS 共存,可以通过以下步骤完成配置:一、关闭 HTTPS 强制跳转登录宝塔面板进入宝塔后台,点击左侧菜单中的 网站。找到目标网站在网站列表中找到需要取消 HT...

CentOS7服务器 Nginx离线升级教程

Nginx使用的版本 ≤ 1.21.5的Nginx版本存在漏洞。所以需要对Nginx进行升级。具体教程如下:1、确认安装的Nginx版本在任意目录下输入nginx -v,即可查看当前版本[root@master /]# nginx -v nginx version: nginx/1.12.2 [ro...