百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

通过 Consul+OpenResty 实现无reload动态负载均衡

off999 2025-02-16 22:27 36 浏览 0 评论

上篇文章使用 consul-template模板方式,来实现了nginx动态负载均衡的实现,但是会有一些问题,如果后端服务经常变动,那nginx需要重新reload,会有一些性能损耗,今天再分享另外一种不需要reload的方式即可实现动态负载均衡

上一篇地址:有兴趣的可以看一下 Nginx利用Consul实现动态负载均衡

1. 准备工作

由于需要使用到lua的一些第三方包,以前都是手动下载包,这次使用lua包管理器LuaRocks来管理第三方包

1.1安装LuaRocks

 #下载
 wget https://luarocks.org/releases/luarocks-3.9.1.tar.gz --no-check-certificate
 #解压
  tar -zxvf luarocks-3.9.1.tar.gz 
 #编译 安装 我的openresty安装目录在 默认安装目录/usr/local/openresty 
 ./configure --prefix=/usr/local/openresty/luajit --with-lua=/usr/local/openresty/luajit  --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1
 #安装
 make && make install
 #将可执行文件移动到/usr/bin目录中(此步骤可省) 方便在哪都可以运行
 mv  luarocks /usr/bin/
 

1.2 安装 openresty中的lua扩展依赖 lua-resty-http

lua-resty-http 是Openresty的http客户端 是基于cosocket 实现的,也是可以实现同步非阻塞的,你懂的吧? 推荐使用,但是到现在为止 它是在init_by_lua和init_worker_by_lua下不能使用的,所以只能使用luasocket,但是这个是阻塞的,效率不高,慎用!!

 #安装lua-resty-http
 luarocks install lua-resty-http
 #安装 luasocket,可能需要安装gcc 
 yum install gcc (如果需要则安装)
 luarocks install luasocket

1.3 修改nginx.conf配置,添加lua自定义模块路径和定义共享内存大小

 #vim /usr/local/openresty/nginx/conf/nginx.conf
 #在http块下添加内容如下:
  #配置dns解析
     #设置共享内存大小 这里的位置一定要放在加载lua文件前
     lua_shared_dict upstream_list 10m;
  #配置lua自定义模块路径,我把lua文件都放在了lua_script目录下(这个可以自定义)
     lua_package_path "/usr/local/openresty/nginx/lua_script/?.lua;;";
     
 

2 编写自定义lua模块

  • 创建upstreams.lua文件
 local http=require "socket.http"
 local cjson= require "cjson"
 local ltn12=require "ltn12"
 local _M={}
 -- 更新列表
 function _M:update_upstreams()
  local resp ={}
  http.request{url="http://10.10.100.3:8500/v1/catalog/service/go-server",sink=ltn12.sink.table(resp)}
  local resp=table.concat(resp)
   local resp=cjson.decode(resp)
 
  local upstreams ={}
  for i,v in ipairs(resp) do
    upstreams[i]={ip=v.ServiceAddress,port=v.ServicePort}
  end
  local s =ngx.shared.upstream_list
   ngx.shared.upstream_list:set("go-server",cjson.encode(upstreams))
 end
 -- 获取负载列表
 function _M:get_upstreams()
         local upstreams_str=ngx.shared.upstream_list:get("go-server")
         local tmp_upstreams=cjson.decode(upstreams_str)
         return tmp_upstreams
 end
 return _M
 
  • nginx.conf的配置如下(我这里写到了一个新conf文件中)
#第一次初始化
init_by_lua_block {
local upstreams=require("upstreams")
        upstreams.update_upstreams()
}
#定时更新
init_worker_by_lua_block {
        local upstreams =require("upstreams")
        local resty_lock=requrie("resty.lock")

        local handle=nil
        handle=function()
                -- 这里可以使用resty.lock来做下并发控制
        		local lock,err=resty_lock:new("my-lock")
        		if lock then
        			upstreams.update_upstreams()
        			lock:unlock()
        		end
                
                ngx.timer.at(5,handle)
        end
        ngx.timer.at(5,handle)
        #在定时更新时,也可以做些健康检查的动作
}
upstream go-server {
        server 0.0.0.1 down; #占位符
        balancer_by_lua_block {
         local balancer =require("ngx.balancer")
         local upstreams=require("upstreams")
         local tmp_upstreams =upstreams.get_upstreams()
         local ip_port=tmp_upstreams[math.random(1,table.getn(tmp_upstreams))]
         balancer.set_current_peer(ip_port.ip,ip_port.port)
        }
         local tmp_upstreams =upstreams.get_upstreams()
         local ip_port=tmp_upstreams[math.random(1,table.getn(tmp_upstreams))]
         balancer.set_current_peer(ip_port.ip,ip_port.port)
        }
}
server {
  listen       8001;
  server_name  localhost;
  location /test {
        default_type text/html;
        proxy_pass http://go-server;

}


  error_page 404 /404.html;
      location = /40x.html {
  }
  error_page 500 502 503 504 /50x.html;
      location = /50x.html {
  }
}
  • 其他问题
  • 在主动拉取列表时,是可以对服务做健康检查的,这里没有实现
  • 另一个问题,由于定时拉取,所以更新是不及时的,有延迟,但是 也可以解决, nginx可以暴露接口,让服务主动推送也是可以的
  • 这里均衡算法是有问题的 ,生产环境还需要重新设计
  • 我这里由于consul中设置的是 故障检查失败后30s才删除服务,所以会导致 网站有短暂的不可访问,解决办法:
  • 1 缩短故障检查失败后删除时间间隔,
  • 2 在定时器中做健康检查,发现异常,直接删除缓存中的数据

总结:

实现nginx无reload 即可更新配置的的要点

需要利用lua_shared_dict 参数来实现多个进程间共享数据,

通过 定时器 ngx.timer.at 实现定时更新数据

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: