概念:图片.png要想实现灰度发布,在环境准备方面,不仅要具备lua环境,还要具备图中的memcache和tomcat

    原理:
    当用户请求访问前端代理 Nginx 时,内嵌Lua模块会解析 Nginx 配置文件中 Lua 脚本,Lua 脚本会获取客户端IP地址,查看Memcached 缓存中是否存在该键值,如果存在则会反向代理到新版本的upstream池,不存在则会反向代理到老版本的upstream池

    环境准备:图片.png用“yum install memcached”安装一下memcached

    图片.png用“memcached -p 11211 -u nobody -d”启动并检查memcached服务,接下来关于memcacched配置步骤,直接参考下一步

    image.png
    ## 安装Memcached
    [root@Nginx src]# yum install memcached -y

    ## 下载Lua和memcached连接库,让Lua可以连接Memcached
    [root@Nginx src]# cd /soft/src
    [root@Nginx src]# wget https://github.com/openresty/lua-resty-memcached/archive/v0.14.tar.gz
    [root@Nginx src]# tar xf v0.14.tar.gz
    [root@Nginx src]# mkdir /etc/nginx/conf/lua
    [root@Nginx src]# cp -r lua-resty-memcached-0.14/lib/resty/memcached.lua /etc/nginx/conf/lua/

    ## 启动Memcached
    [root@Nginx src]# systemctl start memcached
    [root@Nginx src]# systemctl enable memcached

    图片.png接下来我们开始Tomcat服务的相关安装,其实这一步不一定要做的,因为tomcat就是apache web应用,只要你能启动相关web服务,然后用两个不同页面来区分即可,先去apache官网下载相关压缩包,“https://tomcat.apache.org/download-90.cgi

    图片.png在/usr/下创建tomcat,用来存放压缩包

    图片.png用winscp上传压缩包

    图片.png图片.png“tar -xzvf apache-tomcat-9.0.58.tar.gz”进行解压缩并确认

    图片.png进行重命名,解压一次,就相当于一个web服务,我们一个开放8080服务端口,一个开放9090,所以,用端口进行后缀区分

    图片.png随后,再进行一次解压,再进行一次重命名,命名用不同端口区分

    图片.png进入其中之一进行端口修改

    图片.png随后进入conf/目录下,找到server.xml,这是tomcat的配置文件,我们要进入这个配置文件进行一些修改

    图片.png修改指定位置“connector port”修改成8080,也就是我们的访问服务端口,随后保存并退出

    图片.png随后进入指定目录bin/下

    图片.png随后用“./startup.sh”命令启动tomcat即可,如果不能正常启动,查一下端口是否被占用,停止tomcat服务命令为“./shutdown.sh”

    图片.png测试访问成功即可

    图片.png随后用相同的步骤,将9090的tomcat服务也进行相应启动即可

    图片.png图片.png图片.png值得注意的是,当你配置多个tomcat文件的时候,这三个地方的端口,一定要互不一样,不然你会发现,无论如何你只能启动一个服务,既没有端口被占用的错误日志,也无其他相关报错(相关故障排查方法:“https://blog.csdn.net/k_kuo_k/article/details/104330505”)

    图片.png启动完成之后,可以用“ss -antp | grep java | column -t”命令来查看端口是否正常启动

    图片.png测试成功

    操作步骤:
    image.png
    按照给出的参考文档,可以参考它的配置文件,是个很标准的灰度发布,注意第一行里面要调用“memcached.lua”的路径,这是用来存放IP,用来后续区分流量并引入至指定服务器,所以路径别写错

    image.png
    为了区分之前“mengjb.conf”配置文件,因为里面已经具备了很多配置语言,再多写多少有点混乱,所以我们单独写一个“lua.conf”配置文件,语言如下:
    lua_package_path “/etc/nginx/conf/lua/memcached.lua”;
    upstream new_version {
    server 192.168.1.2:80;
    }
    upstream old_version {
    server 192.168.1.3:80;
    }
    server {
    listen 80;
    server_name localhost;

    location / {
    default_type ‘text/plain’;
    content_by_lua_file /etc/nginx/conf/lua/index.lua; ## 访问网站交给这个lua脚本
    }

    location @new_version {
    proxy_pass http://new_version;
    proxy_set_header Host $http_host;
    }

    location @old_version {
    proxy_pass http://old_version;
    proxy_set_header Host $http_host;
    }
    }

    image.png
    想要测试的时候,记得把旧的配置文件给暂时移除,放入备份位置,以免配置冲突

    image.png
    随后我们编写一下上一步lua配置文件中要调用的文件

    image.png
    语言逻辑如下:

    — 获取客户端头部信息的 x-real-ip
    — clientIP = ngx.req.get_headers()[“X-Real-IP”]
    — — 如果clientIP没有获取到客户端IP就获取 x_forwarded_for
    — if clientIP == nil then
    — clientIP = ngx.req.get_headers()[“x_forwarded_for”]
    — end
    — — 如果clientIP还是没有获取到客户端IP就获取 remote_addr
    — if clientIP == nil then
    — clientIP = ngx.var.remote_addr
    — end
    — — 本地加载 memcached
    — local memcached = require “resty.memcached”
    — — 实例化对象
    — local memc, err = memcached:new()
    — — 判断连接是否存在错误
    — if not memc then
    — ngx.say(“failed to instantiate memc: “..err)
    — return
    — end
    — — 建立 memcache 连接
    — local ok, err = memc:connect(“127.0.0.1”, 11211)
    — — 无法连接往前端抛出错误信息
    — if not ok then
    — ngx.say(“failed to connect: “..err)
    — return
    — end
    — — 获取对象中的 ip 存在值赋给 res
    — local res, flags, err = memc:get(clientIP)
    — if err then
    — ngx.say(“failed to get clientIP “..err)
    — return
    — end
    — — 如果 res 值为 1 则调用 local-@new_version
    — if res == “1” then
    — ngx.exec(“@new_version”)
    — return
    — end
    — — 否则调用 local-@old_version
    — ngx.exec(“@old_version”)
    — return

    image.png
    完成之后,检查语法并重启服务即可

    完成这些之后,进行测试即可,测试方式参考相关文档最后部分即可,非常简单,不过多赘述“https://www.cnblogs.com/songguoyou/p/11883213.html