摘要:前兩個(gè)數(shù)據(jù)業(yè)務(wù)相關(guān)的服務(wù)即下圖的,第三個(gè)項(xiàng)目就是的實(shí)現(xiàn)的負(fù)載均衡。這里后臺,前臺項(xiàng)目各啟動了三個(gè)實(shí)例,用戶訪問的時(shí)候,就會根據(jù)配置的負(fù)載均衡的策略,訪問其中一個(gè)。這一部分與之前我轉(zhuǎn)發(fā)的實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及網(wǎng)關(guān)其實(shí)也只是差了個(gè)網(wǎng)關(guān)和負(fù)載均衡。
一.簡介
上一篇只講了博客的前端問題,這一篇講一下后端的微服務(wù)搭建。項(xiàng)目的后端使用的thinkjs框架,在我之前的博客中已經(jīng)寫過,這里就不重點(diǎn)說明了。
后端項(xiàng)目分為三個(gè):
博客前臺頁面服務(wù)端:在這里。
博客后臺頁面服務(wù)端:在這里。
consul-template+nginx實(shí)現(xiàn)的基于微服務(wù)注冊發(fā)現(xiàn)的負(fù)載均衡:在這里。
前兩個(gè)數(shù)據(jù)業(yè)務(wù)相關(guān)的服務(wù)即下圖的service_web,第三個(gè)項(xiàng)目就是consul-template+nginx的實(shí)現(xiàn)的負(fù)載均衡。
如果對consul基礎(chǔ)概念不了解,建議讀完我博客里這兩篇文章再繼續(xù)看下面的內(nèi)容。
consul+docker實(shí)現(xiàn)服務(wù)注冊。
consul+docker實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及網(wǎng)關(guān)。
首先看下架構(gòu)圖:
consul-template會訂閱consul注冊中心上的服務(wù)消息,當(dāng)service-web改變時(shí),consul注冊中心會將新的service web信息推送給consul-template,consul-template會修改nginx配置文件,nginx重載入配置后,就達(dá)到了可以自動修改更新的負(fù)載均衡。
二.consul-template+nginx實(shí)現(xiàn)基于微服務(wù)的負(fù)載均衡 consul-template 介紹Consul-Template是基于Consul的自動替換配置文件的應(yīng)用。在Consul-Template沒出現(xiàn)之前,大家構(gòu)建服務(wù)發(fā)現(xiàn)系統(tǒng)大多采用的是Zookeeper、Etcd+Confd這樣類似的系統(tǒng)。
使用場景:可以查詢Consul中的服務(wù)目錄、Key、Key-values等。這種強(qiáng)大的抽象功能和查詢語言模板可以使Consul-Template特別適合動態(tài)的創(chuàng)建配置文件。例如:創(chuàng)建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。
代碼介紹當(dāng)consul注冊中心的的服務(wù)改變時(shí),consul-template會根據(jù)nginx-consul-template重新生成nginx.conf。首先看一下nginx.conf.ctmpl的代碼:
upstream admin { {{range service "service-admin"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } upstream app { {{range service "service-web"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } server { listen 80 default_server; # 映射博客后臺管理服務(wù) location /admin{ proxy_pass http://admin/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } #請求博客后臺服務(wù)的靜態(tài)資源 location ^~/static/blog-backend-react{ proxy_pass http://admin/static/blog-backend-react; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } #請求博客前臺服務(wù)的靜態(tài)資源 location ^~/static/blog-react{ proxy_pass http://app/static/blog-react; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 接口請求,映射博客前臺服務(wù) location /font{ proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 接口請求,映射博客后臺服務(wù) location /api{ proxy_pass http://admin/api; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 默認(rèn)映射到博客前端服務(wù) location / { proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
template與正常nginx.conf區(qū)別就是upstream里部分,根據(jù)服務(wù)名——這里是兩個(gè)服務(wù),self-blog-backend博客后臺管理服務(wù)與self-blog-fontend博客前臺服務(wù)——動態(tài)生成服務(wù)對應(yīng)的ip。
template的反向代理部分,與正常nginx配置一致,因?yàn)橛袃蓚€(gè)項(xiàng)目,所以每個(gè)url請求接口,靜態(tài)資源,服務(wù),都需要映射到特定的服務(wù)。
服務(wù)啟動后,根據(jù)模版生成的nginx配置文件如下:
upstream admin { server 172.25.0.7:8362 max_fails=3 fail_timeout=60 weight=1; server 172.25.0.8:8362 max_fails=3 fail_timeout=60 weight=1; server 172.25.0.11:8362 max_fails=3 fail_timeout=60 weight=1; } upstream app { server 172.25.0.4:8365 max_fails=3 fail_timeout=60 weight=1; server 172.25.0.9:8365 max_fails=3 fail_timeout=60 weight=1; server 172.25.0.10:8365 max_fails=3 fail_timeout=60 weight=1; } server { .... }
可以看到,upstream里,根據(jù)服務(wù)名已經(jīng)找到了對應(yīng)的ip。這里后臺,前臺項(xiàng)目各啟動了三個(gè)實(shí)例,用戶訪問的時(shí)候,就會根據(jù)配置的nginx負(fù)載均衡的策略,訪問其中一個(gè)ip。
用于啟動nginx服務(wù)
#!/bin/sh # 啟動nginx # daemon off 關(guān)閉守衛(wèi)進(jìn)程,保證nginx前臺運(yùn)行 nginx -c /etc/nginx/nginx.conf -t && nginx -c /etc/nginx/nginx.conf -g "daemon off;"
用于啟動consul-template
#!/bin/sh # 啟動consul-template,指定consul地址 # consul變化后,根據(jù)模板 nginx.conf ,生成nigix配置文件并reload exec consul-template -consul-addr=consul:8500 -template "/etc/consul-templates/nginx.conf:/etc/nginx/conf.d/app.conf:nginx -s reload"
因?yàn)檎麄€(gè)負(fù)載均衡服務(wù)需要做成鏡像,與其他服務(wù)一起部署,所以這里需要維護(hù)Dockerfile
FROM nginx # 聲明告訴系統(tǒng),無需向用戶請求輸入(非交互式) RUN DEBIAN_FRONTEND=noninteractive # 更新軟件包列表 apt-get update -qq && # 安裝 curl runit apt-get -y install curl runit && # rm 刪除,-r 全部刪除子目錄, -f 強(qiáng)制刪除 rm -rf /var/lib/apt/lists/* ADD consul-template_0.19.4_linux_amd64.tgz /usr/local/bin/ # 將 nginx.service 放到指定文件夾,生成run文件 ADD nginx.service /etc/service/nginx/run # 給所有人添加文件的可執(zhí)行權(quán)限 RUN chmod a+x /etc/service/nginx/run ADD consul-template.service /etc/service/consul-template/run RUN chmod a+x /etc/service/consul-template/run RUN rm -v /etc/nginx/conf.d/* ADD nginx.conf /etc/consul-templates/nginx.conf # 使用runit ,當(dāng) runsvdir在/etc/service/目錄中發(fā)現(xiàn)新的配置時(shí), # 啟動runsv進(jìn)程來執(zhí)行和監(jiān)控/etc/service下的run腳本 CMD ["/usr/bin/runsvdir", "/etc/service"]
維護(hù)好之后,就可以制作自己的nginx-consul-template鏡像了。
docker-compose.yml博客后臺與前臺服務(wù)端項(xiàng)目github上,都有自己的Dockerfile,將他們做成鏡像后,與nginx-consul-template鏡像一起,通過docker-compose統(tǒng)一部署這幾個(gè)服務(wù)。
version: "2.0" services: consulserver: image: progrium/consul:latest hostname: consulserver ports: - "8300" - "8400" - 8500:8500 - "53" command: -server -ui-dir /ui -data-dir /tmp/consul --bootstrap-expect=3 consulserver1: image: progrium/consul:latest hostname: consulserver1 depends_on: - consulserver ports: - "8300" - "8400" - "8500" - "53" command: -server -data-dir /tmp/consul -join consulserver consulserver2: image: progrium/consul:latest hostname: consulserver2 depends_on: - consulserver ports: - "8300" - "8400" - "8500" - "53" command: -server -data-dir /tmp/consul -join consulserver registrator: image: gliderlabs/registrator:master hostname: registrator depends_on: - consulserver volumes: - /var/run/docker.sock:/tmp/docker.sock command: -internal consul://consulserver:8500 serviceadmin1: image: daocloud.io/sunxing102005/self-blog-backend:latest depends_on: - consulserver environment: SERVICE_8362_NAME: service-admin ports: - 3002:3002 - "8362" serviceweb1: image: daocloud.io/sunxing102005/self-blog-fontend:latest depends_on: - consulserver environment: SERVICE_8365_NAME: service-web ports: - 3005:3005 - "8365" lb: image: daocloud.io/sunxing102005/consul-template-nginx-blog:latest hostname: lb links: - consulserver:consul ports: - 80:80
運(yùn)行命令,啟動服務(wù)
docker-compose up -d
運(yùn)行后,就可以從注冊中心看到consul上注冊的服務(wù):
其中consul-template-nginx-blog就是lb,service-admin,service-web分別是博客的前臺,后臺服務(wù)(3002,3005兩個(gè)服務(wù)是留給prometheus抓數(shù)據(jù)用的,不用在意)因?yàn)檫@里各只啟動了一個(gè)實(shí)例,所以他們每個(gè)只有一個(gè)服務(wù)。下面看下nginx的效果
訪問默認(rèn)80端口,直接訪問博客前端服務(wù)
訪問80端口加上admin后綴,就會跳到博客管理網(wǎng)站。
這里放一些開發(fā)過程中,自己記錄的一些問題和知識點(diǎn)。
如何進(jìn)入docker容器查看consul-template生成的nginx.confdocker ps //查看consul-template-nginx容器id docker exec -it exec 22fff6c360f1 /bin/sh // 進(jìn)入容器 cat /etc/nginx/conf.d/app.conf //查看文件docker運(yùn)行nginx為什么要執(zhí)行daemon off
docker容器后臺運(yùn)行時(shí),前臺必須有一個(gè)前臺進(jìn)程。
容器運(yùn)行的命令,如果不是一直掛起的就會自動退出。
nginx是后臺進(jìn)程模式運(yùn)行,導(dǎo)致沒有前臺運(yùn)行的應(yīng)用,他就會立即退出應(yīng)用。
解決方法:
將你要運(yùn)行的容器以前臺形式運(yùn)行,關(guān)閉守衛(wèi)進(jìn)程
nginx -g " daemon off"
添加tail,top這種可以前臺運(yùn)行的程序,推薦使用tail,然后持續(xù)輸出log
service nginx start && tail -f /var/log/nginx/error.lognginx.conf.ctmpl注意事項(xiàng)
upstream admin { {{range service "service-admin"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } upstream app { {{range service "service-web"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } server { listen 80 default_server; location /admin{ proxy_pass http://admin/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
location匹配的如果不是/ ,如果想跳轉(zhuǎn)到這個(gè)服務(wù)的根目錄,里面proxy_pass定義的url,后面要加上/,比如這里匹配的 /admin,
proxy_pass是http://admin/,如果是http://admin,則反向代理的路徑是http://XXXX:8362/admin,而不是8362服務(wù)的跟路徑http://XXXX:8362。
nginx 服務(wù)器重啟命令,關(guān)閉 nginx -s reload :修改配置后重新加載生效 nginx -s reopen :重新打開日志文件 nginx -t -c /path/to/nginx.conf 測試nginx配置文件是否正確 關(guān)閉nginx: nginx -s stop :快速停止nginx quit :完整有序的停止nginx 其他的停止nginx 方式: ps -ef | grep nginx kill -QUIT 主進(jìn)程號 :從容停止Nginx kill -TERM 主進(jìn)程號 :快速停止Nginx pkill -9 nginx :強(qiáng)制停止Nginx 啟動nginx: nginx -c /path/to/nginx.conf 平滑重啟nginx: kill -HUP 主進(jìn)程號nginx 反向代理加req header
前端每次請求,都token放到了request header里。之前header里設(shè)置的字段叫access_token,傳不過去,發(fā)現(xiàn)nginx反向代理時(shí),會忽略帶下劃線的header,所以改成了accesstoken。
docker常用命令啟動 systemctl start docker 守護(hù)進(jìn)程重啟 sudo systemctl daemon-reload 重啟docker服務(wù) systemctl restart docker 重啟docker服務(wù) sudo service docker restart 關(guān)閉docker service docker stop 關(guān)閉docker systemctl stop dockerdocker 批量刪除容器
docker rm `docker ps -a -q` //刪除所有容器 docker rmi `docker images -q` //刪除所有鏡像 //按條件刪除鏡像 //沒有打標(biāo)簽 docker rmi `docker images -q | awk "/^linx chmod 命令/ {print $3}"` //鏡像關(guān)鍵字 docker rmi `docker images | grep doss api | awk "print $3"`
如果給所有人添加可執(zhí)行權(quán)限:chmod a+x 文件名
如果給文件所有者添加可執(zhí)行權(quán)限:chmod u+x 文件名
如果給所在組添加可執(zhí)行權(quán)限:chmod g+x 文件名
如果給所在組以外的人添加可執(zhí)行權(quán)限:chmod o+x 文件名
詳細(xì)chmod命令,可參考這里。
linx service服務(wù)管理通過ubuntu自帶service,可以很方便創(chuàng)建后臺運(yùn)行程序。
service文件路徑:/lib/systemd/ystem
service文件包含多個(gè)部分,下面是簡單的后臺運(yùn)行的service文件。
啟動服務(wù)
service leshan-erver start
停止服務(wù)
service leshan-erver stop
查看服務(wù)狀態(tài)
systemctl status lenshan-server
重新加載service文件
systemctl daemon-reload四.總結(jié)
本篇主要講解consul-template+nginx的負(fù)載均衡的實(shí)現(xiàn),網(wǎng)上類似的講解有很多,consul+nginx+consul-template構(gòu)建簡單微服務(wù)也是很基礎(chǔ)常用的方案。這一部分與之前我轉(zhuǎn)發(fā)的consul+docker實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及網(wǎng)關(guān)其實(shí)也只是差了個(gè)網(wǎng)關(guān)和負(fù)載均衡。稍微值得注意的是,本項(xiàng)目里,用到了兩個(gè)業(yè)務(wù)層面的服務(wù)——博客前臺與后臺兩個(gè)服務(wù)——而不是單體項(xiàng)目,稍微有點(diǎn)微服務(wù)的感覺了,把大項(xiàng)目拆開管理。所以nginx這部分就需要分別反向代理到兩個(gè)項(xiàng)目里,這里請求接口,靜態(tài)什么的,兩個(gè)服務(wù)要有區(qū)分,讓nginx有代理區(qū)分的標(biāo)準(zhǔn)。
至此博客的前端,后端微服務(wù)搭建都講完了,有空的話下一篇講一下daocloud平臺部署和prometheus+grafana的監(jiān)控系統(tǒng)。
https://www.jianshu.com/p/a4c...
http://blog.zongwu233.com/Con...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40473.html
摘要:注冊器監(jiān)視每個(gè)守護(hù)進(jìn)程的事件,并在生命周期事件期間自動更新。條件可以包括親和規(guī)則否定至軟強(qiáng)制意味著盡可能地避免。當(dāng)使用通用標(biāo)記如或部署服務(wù)時(shí),可能會出現(xiàn)意外的后果。月日,北京海航萬豪酒店,容器技術(shù)大會即將舉行。 在這篇文章中,我們將討論如何用Rancher實(shí)現(xiàn)consul的服務(wù)發(fā)現(xiàn)。 如果你還沒有準(zhǔn)備好,推薦你閱讀本系列中先前的文章:第一篇:CI /CD和Docker入門第二篇:使部署...
摘要:接入層作用一的聚合。接入層作用二服務(wù)發(fā)現(xiàn)與動態(tài)負(fù)載均衡既然統(tǒng)一的入口變?yōu)榱私尤雽?,則接入層就有責(zé)任自動的發(fā)現(xiàn)后端拆分,聚合,擴(kuò)容,縮容的服務(wù)集群,當(dāng)后端服務(wù)有所變化的時(shí)候,能夠?qū)崿F(xiàn)健康檢查和動態(tài)的負(fù)載均衡。 此文已由作者劉超授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 這個(gè)系列是微服務(wù)高并發(fā)設(shè)計(jì),所以我們先從最外層的接入層入手,看都有什么樣的策略保證高并發(fā)。...
摘要:之前提到的文件即可利用以下模板生成請注意,其中的與就是占位符。如將某一特定部署至生產(chǎn)環(huán)境并運(yùn)行個(gè)實(shí)例。而另一種方式則是使用等負(fù)載均衡器即服務(wù)器端發(fā)現(xiàn)??芍嘏渲们夷軌蛟谧兏l(fā)生后立即將請求路由至新實(shí)例。 如今與Mesos相關(guān)的文章可謂層出不窮,不過展示能夠直接用于生產(chǎn)的完整基礎(chǔ)設(shè)施的資料卻相當(dāng)少見。在今天的文章中,我將介紹各組件的配置與使用方式,旨在幫助大家利用Mesos構(gòu)建起持續(xù)交付且...
摘要:個(gè)推針對服務(wù)場景,基于和搭建了微服務(wù)框架,提高了開發(fā)效率。三容器化在微服務(wù)落地實(shí)踐時(shí)我們選擇了,下面將詳細(xì)介紹個(gè)推基于的實(shí)踐。 2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個(gè)無比需要創(chuàng)新與速度的時(shí)代,由容器、微服務(wù)、DevOps構(gòu)成的云原生席卷整個(gè)IT界。個(gè)推針對Web服務(wù)場景,基于OpenResty和Node.js搭建了微服務(wù)框架,提高了開發(fā)效率。在微服...
閱讀 3516·2021-11-12 10:36
閱讀 2920·2021-09-22 15:35
閱讀 2845·2021-09-04 16:41
閱讀 1195·2019-08-30 15:55
閱讀 3607·2019-08-29 18:43
閱讀 2099·2019-08-23 18:24
閱讀 1444·2019-08-23 18:10
閱讀 1939·2019-08-23 11:31