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

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

off999 2025-02-16 22:27 30 浏览 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 实现定时更新数据

相关推荐

系统错误怎么解决(微信系统错误怎么解决)

1、最后一次正确的配置:在开机启动未进入到操作系统之前我们按下F8键,选择“最后一次正确的配置”然后回车即可。此方法只能解决因出现配置问题进不了系统的情况(例如更换新硬件或加载新驱动后造成的蓝屏),由...

电脑自带的防火墙怎么关(电脑的防火墙如何关闭)
电脑自带的防火墙怎么关(电脑的防火墙如何关闭)

点击开始,点击设置,进入设置后我们可以直接在上方的搜索框中直接搜索【defender】,就会弹出防火墙。点击进入防火墙后,在左侧的列表中找到【启用或关闭Windowsdefender防火墙】,并且点击进入。进入后,就可以自行关闭所有的防...

2025-12-18 03:03 off999

光猫和路由器哪个网速快(光猫网速快还是路由器网速快)

两个都快。这要从两个设备的功能说起。光猫是把光信号转变成数字信号的一种设备,随着光猫技术的发展,现在光猫也集成了路由器的功能,也带有有线和无线,只要有光纤加上光猫,就可以实现有线或者无线上网。路由器的...

台式电脑运行一段时间就死机

1、散热不良:显示器、电源和CPU工作时间太长会导致死机,给风扇除尘,上油。2、灰尘杀手:机器内灰尘过多也会引起死机故障。定期清洁机箱。3、内存条故障:主要是内存条松动,内存芯片本身质量所致,应根...

高清windows免费版观看(高清windows免费版观看网站)

方法一:1、右键单击开始菜单----运行2、在运行对话框中输入:devmgmt.msc,展开:显卡适配器,右击所列的显卡适配器,点击卸载。3、卸载后重新安装兼容Win10的显卡驱动,建议去官方下载...

h3c官网(H3C官网登录账号)

1H3C防火墙官网是存在的,可以通过搜索引擎或输入官方网址进行访问。2H3C防火墙官网提供了产品信息、技术支持、解决方案和服务支持等各种资源,帮助用户全面了解和使用H3C防火墙产品。同时,还有在线...

系统流小说下载(系统流小说大全完本)

全能奇才、末世之兑换高手、穿越之兑换无敌、:重生之我能升级、重生之模拟游戏、超级物品、戒指也疯狂、全职天才、疯狂道具、星戒、超级游戏分身、重生之神才风流、全能闲人、逆天作弊器之超级游戏、宅男之游戏人生...

win7网络设置初始化(win7网络设置初始化方法)

1、首先在操作系统桌面上,点击左下角开始按钮选择控制面板选项进入。2、进入控制面板主界面,点击查看方式下拉按钮选择大图标进入。3、切换至所有控制面板项,点击恢复选项进入。4、进入恢复界面,点击高级恢复...

家用笔记本电脑哪个牌子实惠又好用

在用机械革命s1pro键盘不好用,录音功能不好用,其它还行吧一分价钱一分货清华同方品牌的笔记本最便宜,然14最大的特点就是便宜,仅售3000元,属于新品笔记本中的超低价位。屏幕方面,熟悉的1080p...

免费使用的数据恢复软件(真正的免费的数据恢复软件)

1、在误删除数据后,无论是硬盘、U盘、SD卡还是其他存储设备,最好马上停止写入新的数据,保持现状,然后找适当的数据恢复软件进行恢复。请勿使用非专业软件,以免导致文件彻底无法恢复!  2、在误删除数据后...

感冒流鼻涕怎么办最简单方法

由于受凉感冒引起鼻腔腺体分泌旺盛导致鼻涕增多,建议在医生指导下使用玉屏风颗粒口服治疗促进恢复正常,可以进食鼻腔腺体分泌,改善流鼻涕,打喷嚏症状,另外注意保暖,不要进食辛辣刺激性食物,避免疲劳,多食用容...

tp路由器无线设置最佳参数(tp-link路由器网络参数怎么设置)

1,在浏览器中输入192.168.1.1,进入后台管理,输入用户名和密码登录。2,先连接外网。在左边选择“网络参数”下的“WAN口设置”。3,并在右边选择一种网络方式,如“PPPOE”并输入帐号和密码...

amd的cpu天梯图(amd全系列cpu天梯图)

低压版最高端是“FX-7500”,四核心,4MB二级缓存,CPU频率为2.1-3.3GHz,RadeonR7GPU六个计算单元384个流处理器,频率496-553MHz,内存支持DDR3-1600...

免费恢复微信好友软件(免费恢复微信好友软件哪个好用)

1.不存在免费的微信找回删除好友软件。2.因为微信的好友删除是一种数据操作,需要访问微信服务器上的数据,而微信官方并没有提供找回删除好友的功能,所以任何软件都无法实现这个功能。此外,使用未知来源的...

台式电脑突然断电后无法开机

首先,突然断电导致电脑不能正常开机,并不一定是系统故障,根据以下的方法进行排除。1、在断开电源的前提条件下,打开主机箱侧盖将内存条取下来,更换内存安装插槽的位置。2、找到主板电池,并且将主板电池取下来...

取消回复欢迎 发表评论: