openresty+lua 动态更新upstram里的server (下)lua实现动态更新upstream

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014686399/article/details/80226161

如果基础环境没有配置的话,请到上篇,https://blog.csdn.net/u014686399/article/details/80225843

步骤一:更新自带的lualib/resty/upstream/healthcheck.lua

        (1)备份一下lualib/resty/upstream/healthcheck.lua

         (2)在合适的地方添加一个函数,一定要在return _M之前

--judge user_define
local function match_user_define(host,port)
        local user_define,message=get_user_define()
        local stop_sign=false
        local server=host..':'..port
        if not user_define then
                error(message)
        else
             local value, flags=user_define:get(server)
             if value == 0 then
                stop_sign=true
             end
        end
        return stop_sign
end
--end user define

         (3)修改check_peer函数,如下

    --[[if peer.host then
        -- print("peer port: ", peer.port)
        ok, err = sock:connect(peer.host, peer.port)
    else
        ok, err = sock:connect(name)
    end--]]
    mathch_result=match_user_define(peer.host, peer.port)
    if not mathch_result  then
        if peer.host then
                -- print("peer port: ", peer.port)
                ok, err = sock:connect(peer.host, peer.port)
        else
                ok, err = sock:connect(name)
        end
    else
        ok=nil
        peer.down=false
        err=" The user defines the state of the host to stop"
    end

       (4)修改openresty的http模块,添加下面参数

        lua_shared_dict user_define 1m;

     (5)重启openresty,看一下errlog是不是有报错,有报错是不正常的

步骤二

   (1)在lualib下创建upstream_update.lua

local _M = { _VERSION = '1.0' }
local function split( str,reps )
    local resultStrList = {}
    string.gsub(str,'[^'..reps..']+',function ( w )
        table.insert(resultStrList,w)
    end)
    return resultStrList
end

local function get_user_define()
    local user_define=ngx.shared['user_define']
    if not user_define then
    	return nil, "share memory variable[user_define] not found"
		else
      return user_define, ""
		end
end

--add server to user_define
local function common_user_define(func_name)
	 user_define,message=get_user_define()
	 if not user_define then
	 	   ngx.say("failed to get share memory variable [user_define]: ", message)
       return
	 end
	 ngx.req.read_body()
	 local args, err = ngx.req.get_post_args()
   if err == "truncated" then
       -- one can choose to ignore or reject the current request here
   end
   if not args['server'] then
       ngx.say("failed to get post args: ", err)
       return
   else
		  if type(args['server']) ~= 'table' then
		 	server_list=split(args['server'],',')
		 else
			server_list=args['server']
		 end
		 func_name(server_list,user_define)
   end
end

local function add_user_func(server_list,user_define)
		 for _,value in ipairs(server_list) do
 		 			--table.insert(user_define,value)
          				succ, err, forcible=user_define:set(value, 0)
					if not succ then
					    ngx.say("failed to set share memory variable [user_define]", err)
					    return nil
					end
		end
                local temp_list=user_define:get_keys()
 		ngx.say("OK,all server: ", table.concat(temp_list,", "))
		return user_define
end

function _M.add_user_define()
		common_user_define(add_user_func)
end
--del server to user_define
local function del_user_func(server_list,user_define)
	     for _,value in ipairs(server_list) do
	 	     	succ, err, forcible=user_define:delete(value)
          if not succ then
                    ngx.say("failed to set share memory variable [user_define]", err)
                    break
           end
       end
       local temp_list=user_define:get_keys()
       ngx.say("OK,all server: ", table.concat(temp_list,", "))
end

function _M.del_user_define()
		common_user_define(del_user_func)
end

return _M

(2)修改nginx.conf的server模块

    location /add_user_define {
         content_by_lua '
                local  user_fun = require "upstream_update"
                user_fun.add_user_define()
            ';
                              }
    location /del_user_define {
         content_by_lua '
                local  user_fun = require "upstream_update"
                user_fun.del_user_define()
            ';
                              }

(3)重启一下openresty,看一下errlog,不出现报错是正常的状态

步骤三:测试

(1)访问http://192.168.0.17:8000//index.html,连续两次应该能发现,会转发到192.168.0.16和192.168.0.17

  (2)curl -X POST -d "server=192.168.0.16:80&server=192.168.0.17:80" http://192.168.0.17:8000/add_user_define 去掉所有的server,然后再访问http://192.168.0.17:8000//index.html,会得到

errlog:


页面:


(3)curl -X POST -d "server=192.168.0.16:80" http://192.168.0.17:8000/del_user_define,放开192.168.0.16,然后访问http://192.168.0.17:8000//index.html,会得到192.168.0.16的页面
如果有不清楚的请到 630300475qq群。

猜你喜欢

转载自blog.csdn.net/u014686399/article/details/80226161