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)