成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React搭建個(gè)人博客(二)consul-template+nginx+docker實(shí)現(xiàn)負(fù)載均衡

Coding01 / 1531人閱讀

摘要:前兩個(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)圖:

架構(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的代碼:

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.service

用于啟動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.service

用于啟動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"
Dockerfile

因?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ā)筆記

這里放一些開發(fā)過程中,自己記錄的一些問題和知識點(diǎn)。

如何進(jìn)入docker容器查看consul-template生成的nginx.conf
docker 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.log

nginx.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常用命令
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 docker
docker 批量刪除容器
docker rm `docker ps -a -q` //刪除所有容器
docker rmi `docker images -q` //刪除所有鏡像

//按條件刪除鏡像
    //沒有打標(biāo)簽
docker rmi `docker images -q | awk "/^/ {print $3}"`
    //鏡像關(guān)鍵字
docker rmi `docker images | grep doss api | awk "print $3"`
linx chmod 命令

如果給所有人添加可執(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

相關(guān)文章

  • 如何使用DockerDocker-Compose和Rancher搭建部署Pipeline(四)

    摘要:注冊器監(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入門第二篇:使部署...

    13651657101 評論0 收藏0
  • 微服務(wù)的接入層設(shè)計(jì)與動靜資源隔離

    摘要:接入層作用一的聚合。接入層作用二服務(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ā)。...

    jindong 評論0 收藏0
  • 技術(shù)實(shí)踐 | Mesos 全方位“烹飪”指南

    摘要:之前提到的文件即可利用以下模板生成請注意,其中的與就是占位符。如將某一特定部署至生產(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ù)交付且...

    archieyang 評論0 收藏0
  • 個(gè)推基于Docker和Kubernetes的微服務(wù)實(shí)踐

    摘要:個(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ā)效率。在微服...

    yibinnn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<