Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

36.3. 实现灰度发布

grey.lua 规则文件

        
[root@netkiller nginx]# cat /srv/openresty/nginx/lua/grey.lua 
local cache = ngx.shared.my_cache
local args = ngx.req.get_uri_args()
local key = args['key']
local result = cache:get(key)
local proxy_pass_url = ''
if not result then
    proxy_pass_url = '127.0.0.1/a'
else
    proxy_pass_url = '127.0.0.1/b'
end
ngx.log(ngx.NOTICE, "url: ", proxy_pass_url)
return proxy_pass_url		
    
    

nginx.conf 配置

        
lua_shared_dict my_cache 128m;	

server {
listen 8080;

error_log logs/lua.log; 

location / {
    default_type text/html;
    content_by_lua_block {
        ngx.say("<p>hello, world</p>")
    }
}
    

location /cache/get {
    content_by_lua_block {
        local cache = ngx.shared.my_cache
        local args = ngx.req.get_uri_args()
        local value = cache:get(args['key'])		

        json = require("cjson")
                data = {}
        if not value then
            data["status"] = false
            data['value'] = ''
        else
            data["status"] = true
            data['value'] = value
        end
                data["key"] = args['key']
        json_string = json.encode(data)
                ngx.say(json_string)
        ngx.log(ngx.INFO, "get: ", json_string)
    }
}

location /cache/set {
    content_by_lua_block {
        local cache = ngx.shared.my_cache
        local args = ngx.req.get_uri_args()
        local exptime = tonumber(args['ttl'])
        local key = args['key']
        local value = args['value']
        if not exptime then
                   exptime = 0
            end
        local status, err, forcible = cache:set(key, value, exptime)
        
        ngx.header['Content-Type'] = 'application/json; charset=utf-8'
        
        json = require("cjson")
        data = {}
        data["status"] = status 
        data["key"] = key
        data['value'] = value
        data["exptime"] = exptime
        json_string = json.encode(data)
        ngx.say(json_string)
        ngx.log(ngx.INFO, "set: ", json_string)
    }
}

location /cache/del {
    content_by_lua_block {
        local cache = ngx.shared.my_cache
        local args = ngx.req.get_uri_args()
        local status, err, forcible = cache:delete(args['key'])
        ngx.header['Content-Type'] = 'application/json; charset=utf-8'

        json = require("cjson")
        data = {}
        data["status"] = status
        data["key"] = args['key']
        json_string = json.encode(data)
        ngx.say(json_string)
        ngx.log(ngx.INFO, "det: ", json_string)

    }
}

location /test {
    set_by_lua_file $proxy_pass_url lua/grey.lua;
    proxy_pass http://$proxy_pass_url;
    #echo $proxy_pass_url;
}
}		
    
    

        
默认访问 A 环境

[root@netkiller nginx]# curl http://localhost:8080/cache/test
A

neo 默认也是 A 环境
[root@netkiller nginx]# curl http://localhost:8080/cache/test?key=neo
A

将 neo 分配到 B 环境
[root@netkiller nginx]# curl 'http://localhost:8080/cache/set?key=neo&value=true'
{"exptime":0,"value":"true","key":"neo","status":true}

默认仍是 A
[root@netkiller nginx]# curl http://localhost:8080/cache/test
A

现在 neo 默认是 B
[root@netkiller nginx]# curl http://localhost:8080/cache/test?key=neo 
B

将 neo 从灰度名单中移除
[root@netkiller nginx]# curl http://localhost:8080/cache/del?key=neo
{"key":"neo","status":true}

现在 neo 被重新分配回 A
[root@netkiller nginx]# curl http://localhost:8080/cache/test?key=neo
A