首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Openresty 配合 redis 实现无感知灰度发布系统(基础篇)

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

作者头像
代码宇宙
发布2023-02-23 10:08:47
发布2023-02-23 10:08:47
1.4K00
代码可运行
举报
文章被收录于专栏:代码宇宙代码宇宙
运行总次数:0
代码可运行

前言

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

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

1

安装 Openresty

下载源码

代码语言:javascript
代码运行次数:0
运行
复制
wget https://openresty.org/download/openresty-1.9.7.5.tar.gz

解压源码

代码语言:javascript
代码运行次数:0
运行
复制
tar -zxvf openresty-1.9.7.5.tar.gz

编译源码并安装

代码语言:javascript
代码运行次数:0
运行
复制
cd openresty-1.9.7.5/
./configure -j2
make -j2
sudo make install

2

配置 Nginx

在用户目录下创建工作目录,如图所示

nginx.conf 配置文件内容如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 文件代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
--[[ 
# 解决方案
# 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

3

创建两个web服务

创建两个 web服务,这里我使用 springboot 创建了两个简单的接口用于模拟灰度和生产环境

4

启动 Redis 服务

redis 服务,代码写的是 6379 无密码,如果有密码加一句 在`red:auth("密码")` 即可。

在 DB0 中新增两个值如下

代码语言:javascript
代码运行次数:0
运行
复制
// 等号左边为键右边为值,原样拷贝即可
Grayscale_Range = {
    "idStart":1,
    "idEnd":5000
}

TOKEN_HGdsakGDKSFGkgcshalGF = 1234

5

测试

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

修改 redis 键 Grayscale_Range 的值为

代码语言:javascript
代码运行次数:0
运行
复制
{
    "idStart":1,
    "idEnd":100
}

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

说明

基本思路就是 Redis 存储灰度测试的用户id 区间,可随意扩展,每个用户登录后 Token 会作为键 用户id会作为值存储到 Redis 中,nginx 收到请求后会先去根据 Token 获取到用户 id,再判断用户 id 是否在灰度测试 id 范围内。

Openresty 很强大,本示例只是演示如何开始使用它,后续会发一篇 openresty 进阶篇,欢迎关注。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档