Nginx利用Consul实现动态负载均衡
首先,说声抱歉哈,最近更新的比较慢,不是工作比较忙,而是自己变懒了,对不住各位了一。前言
由于最近手中的项目在不断更新迭代,经常对服务做些调整,一调整就需要改配置文件,真是烦死了,这里先简单说下我司架构,openresty当前端网关,利用nginx反向代理多应用服务器,提供服务(不重要的服务省略了),通过查资料发现,利用consul可以和nginx配合,实现动态修改nginx配置的需求二。资源说明
10。10。100。4centos系统nginx服务consultemplate服务
10。10。100。3centos系统consul服务web1服务web2服务
由于资源有限,就开了2台虚拟机来模拟一下,当然可以用docker实现,这里就不演示了,consul服务也不开集群模式了,同时consul服务与web服务就放在同一个服务器上了,看懂意思就可以了,多个web服务,就以不同的端口来区分三。安装过程3。1在10。10。100。4安装openrestyaddtheyumrepo:wgethttps:openresty。orgpackagecentosopenresty。reposudomvopenresty。repoetcyum。repos。d更新sudoyumcheckupdate安装sudoyuminstallopenresty启动systemctlstartopenresty。service开机自启动systemctlenableopenresty。service
验证安装成功浏览器访问10。10。100。4在10。10。100。4服务器上的命令行中执行curl127。0。0。13。2在10。10。100。4安装consultemplateconsultemplate是基于consul自动替换配置文件的应用。在ConsulTemplate没出现之前,大家构建服务发现系统大多采用的是Zookeeper、EtcdConfd这样类似的系统。
Consul官方推出了自己的模板系统ConsulTemplate后,动态的配置系统可以分化为EtcdConfd和ConsulConsulTemplate两大阵营。ConsulTemplate的定位和Confd差不多,Confd的后端可以是Etcd或者Consul。
ConsulTemplate提供了一个便捷的方式从Consul中获取存储的值,ConsulTemplate守护进程会查询Consul实例来更新系统上指定的任何模板。当更新完成后,模板还可以选择运行一些任意的命令。下载wgethttps:releases。hashicorp。comconsultemplate0。29。2consultemplate0。29。2linuxamd64。zip解压unzipconsultemplate0。29。2linuxamd64。zip添加到环境变量中,这里直接复制到里面mvconsultemplateusrlocalbin查看版本consultemplatev3。3在10。10。100。3安装consulsudoyuminstallyyumutils配置源sudoyumconfigmanageraddrepohttps:rpm。releases。hashicorp。comRHELhashicorp。repo安装consulsudoyumyinstallconsul查看版本consulv测试环境这里使用单机dev模式了,这种模式只能使用127。0。0。1的ip访问consulagentdev客户端ip访问可以指定client参数就可以访问了http:10。10。100。3:8500uidc1servicesconsulagentdevuiclient10。10。100。33。4在10。10。100。3安装web应用服务
这里的web服务,我使用go语言实现了,源码在后面,这里通过不同的端口,来对应多个不同的服务,go程序编译后就是一个二进制文件,直接上传到服务器,运行即可!
上传web服务到10。10。100。3,并启动go程序编译命令gobuildoweb01main。go修改端口号,重新编译gobuildoweb02main。go修改端口号,重新编译gobuildoweb03main。go上传到10。10。100。3服务器的web目录启动命令cdwebnohup。web01devnull21nohup。web02devnull21nohup。web03devnull21
web服务源码如下:packagemainimport(fmtconsulapigithub。comhashicorpconsulapinethttp)const(CONSULURL10。10。100。3CONSULPORT8500SERVERADDR10。10。100。3SERVERPORT8081端口需要修改,8081,8082,8083SERVERNAMEgoserverSERVERID100需要修改100,200,300checkAddr10。10。100。3checkPort8081端口需要修改8081,8082,8083)funcconsulRegister(){链接到consulconfig:consulapi。DefaultConfig()config。Addressfmt。Sprintf(s:d,CONSULURL,CONSULPORT)client,err:consulapi。NewClient(config)iferr!nil{fmt。Println(consulclienterr,err)return}注册服务到consulregistion:new(consulapi。AgentServiceRegistration)registion。IDSERVERIDregistion。NameSERVERNAMEregistion。PortSERVERPORTregistion。AddressSERVERADDRregistion。Tags〔〕string{web03,goweb03}增加consul健康检查回调函数check:new(consulapi。AgentServiceCheck)check。HTTPfmt。Sprintf(http:s:ds,checkAddr,checkPort,check)check。Timeout5scheck。Interval5scheck。DeregisterCriticalServiceAfter30s故障检查失败30s后,自动删除删除registion。Checkcheck注册服务errclient。Agent()。ServiceRegister(registion)iferr!nil{fmt。Println(注册服务失败,err)return}}funcmain(){consulRegister()http。HandleFunc(check,func(writerhttp。ResponseWriter,requesthttp。Request){writer。Write(〔〕byte(我是check))})http。HandleFunc(,func(writerhttp。ResponseWriter,requesthttp。Request){writer。Write(〔〕byte(我是8081端口服务返回的))})fmt。Println(启动。。。。)err:http。ListenAndServe(fmt。Sprintf(s:d,,SERVERPORT),nil)iferr!nil{fmt。Println(启动http失败,err)}}3。5在10。10。100。4配置consultemplate文件
consultemplate的常用参数consulauthusername〔:password〕设置基本的认证用户名和密码。consuladdr设置Consul实例的地址。maxstaleduration查询过期的最大频率,默认是1s。dedup启用重复数据删除,当许多consultemplate实例渲染一个模板的时候可以降低consul的负载。consulssl使用https连接Consul。consulsslverify通过SSL连接的时候检查证书。consulsslcertSSL客户端证书发送给服务器。consulsslkey客户端认证时使用的SSLTLS私钥。consulsslcacert验证服务器的CA证书列表。consultokentoken设置ConsulAPI的token。syslog把标准输出和标准错误重定向到syslog,syslog的默认级别是local0。syslogfacilityfacility设置syslog级别,默认是local0,必须和syslog配合使用。templatetemplate增加一个需要监控的模板,格式是:templatePath:outputPath(:command),多个模板则可以设置多次。waitduration当呈现一个新的模板到系统和触发一个命令的时候,等待的最大最小时间。如果最大值被忽略,默认是最小值的4倍。retryduration当在和consulapi交互的返回值是error的时候,等待的时间,默认是5s。configpath配置文件或者配置目录的路径。pidfilepathPID文件的路径。loglevellevel设置日志级别,可以是debug,info,warn(default),anderr。dryDump生成的模板到标准输出,不会生成到磁盘。once运行consultemplate一次后退出,不以守护进程运行。
新建nginx配置的模板文件
注意如果要生成nginx的配置文件,则要一定要与nginx安装到同一台服务器上upstreamgoserver{{{rangeservicegoserver}}{{name:。Name}}upstream{{name}}zoneupstream{{name}}64k;server{{。Address}}:{{。Port}}maxfails3failtimeout60weight1;{{else}}server127。0。0。1:65535;forcea502{{end}}}server{listen8000;servernamelocalhost;location{addheaderAccessControlAllowOrigin;addheaderAccessControlAllowMethodsGET,POST,OPTIONS;addheaderAccessControlAllowHeadersDNT,XMxReqToken,KeepAlive,UserAgent,XRequestedWith,IfModifiedSince,CacheControl,ContentType,Authorization;if(requestmethodOPTIONS){return204;}proxypasshttp:goserver;ProxySettingsproxysetheaderHosthost;proxysetheaderRefererhttpreferer;proxysetheaderCookiehttpcookie;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;proxyconnecttimeout90;proxysendtimeout90;proxyreadtimeout90;proxybuffersize4k;proxybuffers432k;proxybusybufferssize64k;proxytempfilewritesize64k;}errorpage404404。html;location40x。html{}errorpage50050250350450x。html;location50x。html{}}
执行命令生成nginx。conf配置文件consultemplateconsuladdr10。10。100。3:8500templatenginx。ctmpl:usrlocalopenrestynginxconfconf。dconsul。conf:usrlocalopenrestybinopenrestysreload
当然可以使用配置文件生成了vimusrlocalopenrestynginxconfconsulnginxtemplatenginx。hcl
配置文件如下:wait{min3smax10s}consul{address10。10。100。3:8500}template{sourceusrlocalopenrestynginxconfconsulnginxtemplatenginx。ctmpldestinationusrlocalopenrestynginxconfconf。dconsul。confcommandusrlocalopenrestybinopenrestysreload}
运行配置文件consultemplateconfigusrlocalopenrestynginxconfconsulnginxtemplatenginx。hcl
浏览器测试
我这里绑定了8000端口,所以访问10。10。100。4:8000,就可以发现后端3个go服务开始提供服务了,关闭一个服务,nginx的配置文件也会动态的做出改变结尾:
这种解决方案是可以解决我们遇到的问题,但是最终开会后确没有使用这种方法来解决,还是使用原始方法手动改,我是无语了,可能是怕麻烦吧
英媒科学家发现,呼吸道合胞体病毒和流感病毒能形成新型混合病毒来源环球时报环球时报综合报道病毒可以合体躲避人体免疫系统?据英国卫报24日报道,科学家发现,呼吸道合胞体病毒和流感病毒能形成新型混合病毒躲避人体免疫系统并感染肺部细胞。报道称,这是
老美是怎样割世界韭菜的一个国家,如果政府多印钱,只会及自己的人民,因为其钞票只能在本土流通,无法流通到国外去。而美元不同,它是世界货币老大,在全世界都能买到东西。因此,美国政府拼命的印钱,发给本国人民和
元宇宙巨亏扎克伯克仍一意孤行大力支出彻底点燃了股东怒火尽管全力挺进的元宇宙领域还面临巨亏,宏观经济打击公司主要收入源数字广告业务,Meta仍要大力投资构建元宇宙。这种一意孤行令Meta的一些大股东对CEO扎克伯格为首的管理层感到愤怒。
小安盘前预测(11月1日)10月已经收官,看看自己账户的收益情况,是不是一片谩骂,有多少人想关掉自己股票账户了?上证指数昨天是个冲高回落的上影线,那么今天有两种情况会出现,走的不好会有大阴线出现,击破286
年内累计回购57次,天伦燃气(01600)是否有超额收益机会?在美联储加息俄乌战争疫情反复等多重因素的影响下,恒生指数年内跌超30,这是自2009年以来恒生指数调整幅度最大的年份。但危与机总是相伴而生,获取超额收益的投资机会正在孕育。从过往的
三季报收官谁在强势增长?文张云编辑杨秀红2022年三季报披露收官,两市共有4969家上市公司发布了三季报数据。由于公布时间已接近年底,大部分上市公司的全年业绩情况雏形渐显。在外部环境紧张与内部疫情反复的情
T1交易制度需要改革吗回答是肯定的,中国成功的秘诀就是各领域不断改革取得了瞩目的成就。从世界范围发达国家股票市场来看,都是采用公平交易且成熟的做市商机制和T0机制。远了欧美股市不必说,香港日本韩国还有俄
反思自己近一年半在股市和基金投资的失误以及未来的规划(二)2021年6月份的那段时间,是让我很难忘的,至今回想起来依旧很兴奋,那是我第一次在股市里面尝到比较大的甜头,当时持仓的是一支汽车配件类的公司,业绩还行,而且有给新能源汽车供货的能力
Twitter加持狗狗币站上0。15美元!Doge将以某种方式与推特合并?狗狗币(DOGE)因马斯克正式收购推特后有可能成为支付选项,币价大幅飙涨一度站上0。15美元市值也超车Cardano和Solana,名列第8。狗狗币(DOGE)教父马斯克在本周五正
最新消息!中国乒乓球国家队解散啦!王楚钦许昕6大主力离开11月1日,2022年WTT新乡世界杯总决赛结束,新科冠军王楚钦成为最大赢家,42横扫日本的19岁天才少年张本智和!接下来,中国乒乓球国家队除了备战11月亚洲杯外,基本上就解散啦,
美联储加息在即,金价能继续下跌多少上周五国际黄金在亚盘出现冲高,欧盘回落连续下跌后,一直到美盘,美国公布PCE物价指数年率后,出现扫盘。但是最终金价日线几乎收了一个满阴线。从数据角度来看,PCE大于前值,而小于预期