基于OpenResty的版本灰度发布方案
标签搜索

基于OpenResty的版本灰度发布方案

mrui
2025-12-08 / 0 评论 / 8 阅读 / 正在检测是否收录...

OpenResty是Nginx加上Lua脚本引擎,可以实现很多复杂的逻辑。

OpenResty学习曲线可能有点陡,但学会了之后真的很香。可以用Lua实现各种复杂的灰度策略,甚至可以对接公司的配置中心、监控系统等。

案例:结合Lua实现动态灰度

单纯使用nginx,会遇到一个问题,就是每次调整灰度比例都要修改配置文件,然后reload Nginx。这在生产环境其实挺麻烦的,万一配置写错了,reload失败,那就尴尬了。

推荐方案是结合OpenResty(Nginx + Lua),把灰度规则存在Redis里,这样就可以动态调整了。

upstream backend_v1 {
    server 192.168.1.10:8080;
}

upstream backend_v2 {
    server 192.168.1.11:8080;
}

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        set $backend "backend_v1";
        
        access_by_lua_block {
            local redis = require "resty.redis"
            local red = redis:new()
            red:set_timeout(1000)
            
            local ok, err = red:connect("127.0.0.1", 6379)
            if not ok then
                ngx.log(ngx.ERR, "failed to connect redis: ", err)
                return
            end
            
            -- 从Redis获取灰度比例
            local canary_percent, err = red:get("canary:percent")
            if not canary_percent or canary_percent == ngx.null then
                canary_percent = 0
            end
            
            -- 生成随机数判断是否走新版本
            math.randomseed(ngx.now())
            local rand = math.random(100)
            
            if rand <= tonumber(canary_percent) then
                ngx.var.backend = "backend_v2"
            end
            
            red:close()
        }
        
        proxy_pass http://$backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

这样的话,我们只需要在Redis里修改canary:percent的值,就可以实时调整灰度比例了,不需要reload Nginx。

设置灰度比例为10%

redis-cli set canary:percent 10

逐步放量

redis-cli set canary:percent 30
redis-cli set canary:percent 50
redis-cli set canary:percent 100

紧急回滚

redis-cli set canary:percent 0

0

评论 (0)

取消