日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx

發布時間:2025/3/12 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在互聯網應用領域,服務的動態性需求十分常見,這就對服務的自動發現和可動態擴展提出了很高的要求。

微服務系統動輒上萬個服務,而且還要動態伸縮。以人工寫好的IP、Port 硬編碼腳本的方式無法做到大規模自動化,稍微多點服務運維就傻了。微服務必然要做到ip和port自動分配,減少人工干預。我們需要讓每個服務能動態的創建地址,同時調用方要能感知地址變化。

這就需要有一個服務注冊與發現的機制,這篇文件就是討論如何實現這個機制。

1. 服務注冊發現的流程

我們做這個事情要達到的目的是:

注冊發現模式傳統模式
服務啟動后自動被發現手動注冊
動態變更負載均衡人工寫入靜態配置
自動伸縮規模運維較長時間的手動調整

1.1 服務 “自注冊” 與 “第三方注冊”。

按注冊源分

1.自注冊:服務內部啟動客戶端,連接注冊中心,寫入服務信息。

好處:

  • 沒有引入第三方,進程數量少,少依賴。

問題:

  • 服務代碼對注冊中心進行了硬編碼,若更換了注冊中心,服務代碼也必須跟著調整;
  • 注冊中心必須與每個服務都保持通信,來做心跳檢測。如果服務很多時,對注冊中心也是一種額外的開銷;

2.第三方注冊(本文采用方式):采用協同進程的方式,監聽服務進程的變化,將服務信息寫入注冊中心。

  • 好處:做到了服務與注冊中心的解耦,對服務而言,完成了服務的自動化注冊;
  • 問題:協同進程本身也要考慮高可用,否則將成為單點故障的風險點;

1.2 自注冊的實現

自注冊不是我們本篇要討論的,可以自己寫代碼實現,我們討論第三方注冊的實現。

1.3 第三方注冊的實現

Docker 的出現,以及微服務架構的興起,讓眾多開源項目開始關注在松耦合的架構前提下,如何基于 Docker 實現一套真正可動態擴展的服務架構。

這里我們使用 Registrator + Consul + Consul-template + Nginx 這幾個開源組件來實現可動態擴展的服務注冊與發現機制,當然,毫無疑問他們都跑在docker上。

首先看看流程:

這里寫圖片描述

服務注冊中心:作為整個架構中的核心,要支持分布式、持久化存儲,注冊信息變動實時通知消費者。

服務提供者:服務以 docker 容器化方式部署(實現服務端口的動態生成),并以 docker-compose 的方式來管理,通過 Registrator 可以檢測到docker進程信息以完成服務的自動注冊。

服務消費者:要使用服務提供者提供的服務,和服務提供者往往是動態相互轉位置的。

  • 服務注冊:服務提供者到注冊中心注冊;
  • 服務訂閱:服務消費者到注冊中心訂閱服務信息,對其進行監聽;
  • 緩存:本地緩存服務列表,減少與注冊中心的網絡通信;
  • 服務調用:先查找本地緩存,找不到再去注冊中心拉取服務地址,然后發送服務請求;
  • 變更通知:服務節點變動時(新增、刪除等),注冊中心將通知監聽節點,更新服務信息。
  • 2. 工具介紹

    2.1 Registrator

    Registrator:一個由Go語言編寫的,針對docker使用的,通過檢查本機容器進程在線或者停止運行狀態,去注冊服務的工具。所以我們要做的實驗,所有的工具都是在docker上運行的,就是因為registrator是通過檢查docker容器的狀態來判斷服務狀態的,這樣就和我們的代碼實現完全解耦了,對上層透明化,無感知。它有如下特點

    • 通過docker socket直接監聽容器event,根據容器啟動/停止等event來注冊/注銷服務
    • 每個容器的每個exposed端口對應不同的服務
    • 支持可插拔的registry backend,默認支持Consul, etcd and SkyDNS
    • 自身也是docker化的,可以容器方式啟動
    • 用戶可自定義配置,如服務TTL(time-to-live)、服務名稱、服務tag等

    2.1 consul

    我們上圖所說的服務注冊中心,就是這玩意。Consul 是一個分布式高可用的服務發現和配置共享的軟件。由 HashiCorp 公司用 Go 語言開發。

    Consul在這里用來做 docker 實例的注冊與配置共享。

    特點:

    • 一致性協議采用 Raft 算法,比Paxos算法好用. 使用 GOSSIP 協議管理成員和廣播消息, 并且支持 ACL 訪問控制.
    • 支持多數據中心以避免單點故障,內外網的服務采用不同的端口進行監聽。而其部署則需要考慮網絡延遲, 分片等情況等.zookeeper 和 etcd 均不提供多數據中心功能的支持.
    • 健康檢查. etcd 沒有的.
    • 支持 http 和 dns 協議接口. zookeeper 的集成較為復雜, etcd 只支持 http 協議.
    • 還有一個web管理界面。

    2.3 consul-template

    一開始構建服務發現,大多采用的是zookeeper/etcd+confd。但是復雜難用。consul-template,大概取代了confd的位置,以后可以這樣etcd+confd或者consul+consul-template。

    consul template的使用場景:consul template可以查詢consul中的服務目錄、key、key-values等。這種強大的抽象功能和查詢語言模板可以使consul template特別適合動態的創建配置文件。例如:創建apache/nginx proxy balancers、haproxy backends、varnish servers、application configurations。

    consul-template提供了一個便捷的方式從consul中獲取存儲的值,consul-template守護進程會查詢consul服務,來更新系統上指定的任何模板,當更新完成后,模板可以選擇運行一些任意的命令,比如我們這里用它來更新nginx.conf這個配置文件,然后執行nginx -s reload命令,以更新路由,達到動態調節負載均衡的目的。

    consul-template和nginx必須裝到一臺機器,因為consul-template需要動態修改nginx配置文件

    2.4 nginx

    這個耳熟能詳的名字,不用過多介紹了,它在這里就是做負載均衡,轉發請求用的。當然最擅長負載均衡的是直接用硬件,軟件做性能比不上。但軟件成本低、維護方便。

    3. 單機實驗

    首先看一個簡單的傳統負載均衡web服務

    load balance web servers

    這個很好理解吧,client訪問nginx,然后被轉發到后端某一個web server上,傳統的負載均衡。如果后端有添加/刪除web server,運維手動改下nginx.conf,然后重新載入配置,就可以調整負載均衡了。

    再看看我們基于微服務自動注冊和發現模式下的負載均衡:

    Servies register and find

    負載均衡的方式沒有變,只是多了一些外圍的組件,當然這些組件對client是不可見的,client依然只能看到nginx入口,訪問方式也沒變化。

    其中,我們用registrator來監控每個web server的狀態。當有新的web server啟動的時候,registrator會把它注冊到consul這個注冊中心上。由于consul_template已經訂閱了該注冊中心上的服務消息,此時consul注冊中心會將新的web server信息推送給consul_template,consul_template則會去修改nginx.conf的配置文件,然后讓nginx重新載入配置以達到自動修改負載均衡的目的。同樣當一個web server掛了,registrator也能感知到,進而通知consul做出響應。

    整個過程不需要運維人工的干預,自動完成。接下來我們找一臺機器上實踐下這個方案

    3.1 環境

    headerheader
    操作系統ubuntu:16.04 x86_64,內核:4.8.0-58-generic
    主機ip10.111.152.136
    dockerDocker version 1.12.6, build 78d1802
    docker-composedocker-compose version 1.8.0, build unknown

    首先安裝 docker 和 docker-compose

    $ apt-get install docker docker-compose -y

    隨便找個目錄,創建模板文件 docker-compose.yml

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-1MY_HOST: host-1ports:- "80"#load balancer will automatically update the config using consul-template lb:image: liberalman/nginx-consul-template:latesthostname: lblinks:- consulserver:consulports:- "80:80"consulserver:image: progrium/consul:latestenvironment:SERVICE_TAGS: consul servershostname: consulserverports:- "8300"- "8400"- "8500:8500"- "53"command: -server -ui-dir /ui -data-dir /tmp/consul -bootstrap-expect 1# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registratorlinks:- consulserver:consulvolumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -internal consul://consul:8500

    注意: liberalman/helloworld和liberalman/nginx-consul-template這兩個鏡像我已經實現了,可以pull下來,大家可以直接使用。想要看他們怎么寫的,訪問https://github.com/liberalman

    3.2 啟動

    進入模板所在目錄,執行

    $ docker-compose up

    沒問題的話就啟動成功了,其中的鏡像自動被下。訪問 http://localhost 可以看到一個 web 頁面:

    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.2</font>. I saw that you are 172.17.0.6:35612.

    這個內容實際是后端web服務器helloworld所反饋的頁面,它告訴我們它自己的地址是172.17.0.2(docker的內網地址),它所看到的前端訪問過來的ip是172.17.0.6,實際上這個前端是我們的nginx的負載均衡的代理轉發的,所以它看到的實際是nginx的地址。

    這里的host-1是我自己設置的物理機的名稱,注釋不是操作系統那hostname,純粹是為了在頁面上好顯示,以及后期多個物理機實驗的時候好區分不同物理機器,所以自定義了一個臨時名稱。它對應docker-compose.yml中的MY_HOST環境變量,會通過docker容器傳遞到helloworld的運行環境中。

    要停止服務Ctrl + C就行了,如果有些沒有停止,則

    $ docker-compose down

    如果要在后臺運行

    $ docker-compose up -d

    3.3 負載均衡

    回到正題,在瀏覽器上多次刷新,可以看到后端地址沒有變化,這是因為只有一個 web 后端服務器。

    如果要測試一下nginx負載均衡的效果,則調整后端為 3 個服務器。先停掉服務,然后

    $ docker-compose scale web=3 $ docker-compose up

    再次訪問 http://localhost ,多次刷新,可以看到頁面的實際目標地址發生了變化,有3個ip輪換。新啟動的 web 后端服務器被自動注冊,并且 nginx 也把新的路由添加上了:

    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.2</font>. I saw that you are 172.17.0.6:36710.
    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.3</font>. I saw that you are 172.17.0.6:35210.
    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.4</font>. I saw that you are 172.17.0.6:58678.

    3.4 查看服務狀態

    要查看節點注冊狀況,到 http://localhost:8500 可以看到 consul web ui 的管理端

    consul ui

    點擊SERVICES這個按鈕,列出所有被注冊的服務。

    • consul server,看到有多個是因為監聽多個端口,還有udp端口的。
    • my-web-server就是后端web服務,這個名稱是要在docker-compose模板中設置SERVICE_80_NAME這個變量的,針對80端口,詳情見registrator 用戶指導手冊
      https://gliderlabs.com/registrator/latest/user/services/。
    • nginx-consul-template就是nginx和consul-template的合體服務。

    點擊my-web-server,可以看到它右側的服務節點數,這里只有一個,有多個的話會依次列出

    host-1 my-web-server

    4. 兩臺物理機

    以上都是在單臺物理機上完成的,下面我們要測試下多臺物理機情況下,真正分布式的效果。

    host namereal ipservices
    host-110.111.152.136registrator、helloworld、consul-server、consul-template、nginx
    host-210.111.152.135registrator、helloworld

    第一臺物理機host-1的docker-compse.yml

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-1MY_HOST: host-1ports:- "80"#load balancer will automatically update the config using consul-template lb:image: liberalman/nginx-consul-template:latesthostname: lblinks:- consulserver:consulports:- "80:80"consulserver:image: progrium/consul:latestenvironment:SERVICE_TAGS: consul servershostname: consulserver-node1ports:- "8300"- "8400"- "8500:8500"- "53"command: -server -ui-dir /ui -data-dir /tmp/consul -bootstrap-expect 1# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registrator-1volumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -ip=10.111.152.136 consul://10.111.152.136:8500

    我們第二臺機器host-2的yml文件:

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-2MY_HOST: host-2ports:- "80"# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registrator-2volumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -ip 10.111.152.135 consul://10.111.152.136:8500

    這是我們將MY_HOST改為host-2了,以便在頁面查看的時候可以直觀看到。另外的重要改變就是registrator的啟動參數,我們去掉了上報docker內部ip的-internal,轉而使用了外部ip,將自己本機的ip 10.111.152.135上報了。同時要訪問的consul服務器參數配置成host-1的ip地址 10.111.152.136。還有registrator的hostname要和第一臺機器的區別開,我改成registrator-2了,這樣在注冊到consul中的時候,不會覆蓋掉。hostname一樣consul無法區分是哪個機器的,這樣兩個機器的registrator會相互覆蓋。

    host-1啟動方式不變,我們現在到host-2上啟動,看看效果,是否新節點被加上了。

    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.2</font>. I saw that you are 172.17.0.5:41464.

    Hello World! I'm <font color=blue>host-2</font> <font color=red>addr:172.17.0.2</font>. I saw that you are 10.111.152.136:41578.

    刷新兩次,發現一會兒是host-1,一會兒是host-2,說明我們host-2物理機上的服務被添加進來了,并且被nginx路由到了。

    同時consul ui,看到新的節點果然被添加上了

    host-2 my-web-server

    不過發現個問題,如果在host-2上先將registrator關閉,再關閉host-2上的后端web,我們的consul服務器可以感知到,但是那個consul ui界面沒更新,依然顯示兩個節點。

    5. Consul Cluster

    以上我們的實驗其實是個單點的consul服務,點擊consul ui頁面的NODES按鈕可以看到

    single node

    只有一個consul server節點,也就是在我們host-1上跑的節點consulserver,另外一個物理機上沒有運行consul節點。一旦它掛了整個服務注冊功能就歇菜了。既然是分布式,一定要發揮集群的優勢以解決單點問題。所以,我們要建立Consul Cluster。

    在Consul方案中,每個提供服務的節點上都要部署和運行一個agent,所有運行Consul agent節點的集合構成Consul Cluster。

    Consul agent有兩種運行模式:Server和Client。這里的Server和Client只是Consul集群層面的區分,與搭建在Cluster之上的應用服務無關。

    以Server模式運行的Consul agent節點用于維護Consul集群的狀態,官方建議每個Consul Cluster至少有3個或以上的運行在Server mode的Agent,Client節點不限。

    這里寫圖片描述

    每個數據中心的Consul Cluster都會在運行于server模式下的agent節點中選出一個Leader節點,這個選舉過程通過Consul實現的raft協議保證,多個 server節點上的Consul數據信息是強一致的。處于client mode的Consul agent節點比較簡單,無狀態,僅僅負責將請求轉發給Server agent節點。

    我們這次的架構有些調整,繪制一個服務器的邏輯上的部署圖來說明下

    Services register adn find, consul cluster

    這是一張邏輯上服務部署的圖,我們找3臺機器來實驗。每臺機器上部署幾個web server,一個registrator和一個consul client,這是基本需求。另外再建立一個consul cluster集群,用來當我們的注冊中心。當web server啟動后,被registrator感知,進而將注冊信息發送給consul client,consul client則訪問注冊中心的leader節點,上報新加入的服務信息。consul cluster會將新的服務信息推送給已經到它這里訂閱了服務消息的consul-template,consul-template再去修改和自己同一臺機器上的nginx,以達到動態調整負載均衡的目的。

    注意:由于資源有限,我們沒有單獨使用機器去搭建consul集群,所以圖中的consul client和consul server節點其實是同一個節點,因為server模式同時可以提供client的功能嘛。那個consul cluster集群其實是分布到3個host中建立起來的,我們就在3個host中分別啟動一個consul進程,每個都同時擔任server和client的功能。

    5.1 配置

    host namereal ipservicesnote
    host-110.111.152.136registrator、helloworld*n、consul-server、consul-template、nginx放置consol web ui和nginx負載均衡
    host-210.111.152.135registrator、helloworld*n、consul-server
    host-310.111.152.168registrator、helloworld*n、consul-server

    host-1作為運行負載均衡的機器,部署consul-template和nginx。每個機器上都部署了consul-server節點,也就是我們有3個節點,接下來就研究這3個節點是如何選舉leader的。

    host-1的docker-compose.yml文件

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-1MY_HOST: host-1ports:- "80"#load balancer will automatically update the config using consul-template lb:image: liberalman/nginx-consul-template:latesthostname: lblinks:- consulserver:consulports:- "80:80"consulserver:image: progrium/consul:latestenvironment:SERVICE_TAGS: consul servershostname: consulserver-node1ports:- "8300:8300"- "8301:8301"- "8301:8301/udp"- "8302:8302"- "8302:8302/udp"- "8400:8400"- "8500:8500"- "53:53/udp"command: -server -ui-dir /ui -advertise 10.111.152.136 -bootstrap-expect 3# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registrator-1volumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -ip 10.111.152.136 consul://10.111.152.136:8500

    參數解釋下

    • hostname,將來consul節點都靠這個來標識了,所以每個物理機上的節點名稱都要區別開,以免沖突。
    • -bootstrap-expect 3,這個參數的作用是,當consulserver-node1節點啟動之后,等待另外兩個節點的加入,3個節點聚齊后,之后才開始選舉leader。
    • -advertise 10.111.152.136,如果要讓節點在WAN網絡中被發現,就要配置這個參數,暴露出外網ip。如果只在LAN中被發現,就不用配置這個了,默認綁定內網ip。
    • -ui-dir /ui,這個配置是指定當前節點支持consul ui的web頁面。

    host-2的docker-compose.yml文件

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-2MY_HOST: host-2ports:- "80"consulserver:image: progrium/consul:latestenvironment:SERVICE_TAGS: consul servershostname: consulserver-node2ports:- "8300:8300"- "8301:8301"- "8301:8301/udp"- "8302:8302"- "8302:8302/udp"- "8400:8400"- "8500:8500"- "53:53/udp"command: -server -advertise 10.111.152.135 -join 10.111.152.136# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registrator-2volumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -ip 10.111.152.135 consul://10.111.152.136:8500

    與host-1不同的是,host-2使用了參數
    -join 10.111.152.136 意思是把本節點加入到10.111.152.136這個ip的節點中,這是consulserver-node1的地址。我們上一個host的配置中表明,consulserver-node1這個節點啟動后,會等待另外兩個節點的加入,我們這里就是加入它。

    host-3的docker-compose.yml文件

    #backend web application, scale this with docker-compose scale web=3 web:image: liberalman/helloworld:latestenvironment:SERVICE_80_NAME: my-web-serverSERVICE_TAGS: backend-3MY_HOST: host-3ports:- "80"consulserver:image: progrium/consul:latestenvironment:SERVICE_TAGS: consul servershostname: consulserver-node3ports:- "8300:8300"- "8301:8301"- "8301:8301/udp"- "8302:8302"- "8302:8302/udp"- "8400:8400"- "8500:8500"- "53:53/udp"command: -server -advertise 10.111.152.168 -join 10.111.152.136# listen on local docker sock to register the container with public ports to the consul service registrator:image: gliderlabs/registrator:masterhostname: registrator-3volumes:- "/var/run/docker.sock:/tmp/docker.sock"command: -ip 10.111.152.168 consul://10.111.152.136:8500

    注意:到這里你可能有疑問,上文的3個節點都是server節點,那client節點哪里去了,沒有client節點怎么訪問集群啊?我們和集群交互可是訪問client,client再轉發到server節點的。

    我們前篇也提到過,其實每個server節點,本身就具有client的功能,只是多了一些把所有的信息持久化的本地以及選舉leader的功能呢,這樣遇到故障,信息是可以被保留的。

    所以,這里我們每個主機上部署registrator的時候,配置的訪問consul服務的地址也是就近訪問本機上的consul節點,把它當成一個consul client訪問就可以了。當然也可以單獨部署一個client節點,只是我們至少要保證有3個server節點,才能完成leader選舉,如果再多一臺機器我會考慮專門加一個client節點。

    5.2 啟動

    依次在host-1、host-2和host-3上啟動3個節點。注意執行docker-compose up之后,不要關閉終端,讓它一直打印,后續我們還要在這里看日志,別的操作都轉到新開終端上執行。訪問 http://10.111.152.136:8500/ui/#/dc1/nodes 看到節點都被添加上了

    這里寫圖片描述

    除了查看ui界面外,也可以使用命令行看看有哪些服務注冊了,在新終端下執行

    ~# curl 10.111.152.136:8500/v1/catalog/services|jq .% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed 100 308 100 308 0 0 54892 0 --:--:-- --:--:-- --:--:-- 61600 {"consul": [],"consul-53": ["consul servers","udp"],"consul-8300": ["consul servers"],"consul-8301": ["consul servers","udp"],"consul-8302": ["consul servers","udp"],"consul-8400": ["consul servers"],"consul-8500": ["consul servers"],"my-web-server": ["backend-1","backend-2","backend-3"],"nginx-consul-template": [] }

    訪問 http://10.111.152.136 查看nginx負載均衡的效果,依次刷新,得到

    Hello World! I'm <font color=blue>host-1</font> <font color=red>addr:172.17.0.2</font>. I saw that you are 172.17.0.1:49728.
    Hello World! I'm <font color=blue>host-2</font> <font color=red>addr:172.17.0.3</font>. I saw that you are 10.111.152.136:54640.
    Hello World! I'm <font color=blue>host-3</font> <font color=red>addr:172.17.0.3</font>. I saw that you are 10.111.152.136:58660.

    OK,看起來一切正常。那我們現在分析下到底哪個節點是leader,有節點退出會怎樣?

    現在新開一個終端,在host-1上,執行

    docker ps -f name=consul

    查到consul節點的容器id是4364cd41f2ba。登錄這個容器

    docker exec -it 4364cd41f2ba /bin/sh

    然后就進入容器的操作系統環境了,在該環境下執行

    / # consul members Node Address Status Type Build Protocol DC consulserver-node3 10.111.152.168:8301 alive server 0.5.2 2 dc1 consulserver-node1 10.111.152.136:8301 alive server 0.5.2 2 dc1 consulserver-node2 10.111.152.135:8301 alive server 0.5.2 2 dc1

    一目了然的看到了我們的3個consul節點。查看當前節點信息

    / # consul info ...... consul:bootstrap = falseknown_datacenters = 1leader = falseserver = true raft:applied_index = 192commit_index = 192fsm_pending = 0last_contact = 15.960533mslast_log_index = 192last_log_term = 2last_snapshot_index = 0last_snapshot_term = 0num_peers = 2state = Followerterm = 2 ......

    輸出信息很多,省略掉,只給出重要的。server = true確實是server節點。看到leader=false,說明這個節點不是leader。state = Follower,看來確實是個Follower節點哦。last_contact = 15.960533ms心跳剩余時間,term = 2說是第二個term,已經選過2回了。

    執行上述命令的同時,由于之前在host-1上執行docker-compose up命令的時候,日志是直接輸出到屏幕上的,我們此時可以節點1輸出的日志

    consulserver_1 | 2017/07/26 05:08:20 [INFO] agent.rpc: Accepted client: 127.0.0.1:47084 consulserver_1 | 2017/07/26 05:08:24 [INFO] agent.rpc: Accepted client: 127.0.0.1:47086 ......

    我們剛才執行的命令都是客戶端發到當前consul server上的。

    同樣的方式,在節點在conserver-node3上

    consul:bootstrap = falseknown_datacenters = 1leader = trueserver = true

    原來leader是節點3.

    5.3 去掉節點

    讓一個節點掛掉,看看會發生什么。

    5.3.1 關閉一個節點

    在host-1上新開終端執行

    docker stop 4364cd41f2ba

    看到host-1的日志滾動

    gocode_consulserver_1 exited with code 1 lb_1 | 2017/07/26 06:02:51.211894 [WARN] (view) health.service(my-web-server|passing): Get http://consul:8500/v1/health/service/my-web-server?index=40&passing=1&stale=&wait=60000ms: dial tcp 172.17.0.4:8500: i/o timeout (retry attempt 1 after "250ms") ex=40&passing=1&stale=&wait=60000ms: dial tcp 172.17.0.4:8500: i/o timeout (retry attempt 1 after "250ms") lb_1 | 2017/07/26 06:03:10.099572 [WARN] (view) health.service(my-web-server|passing): Get http://consul:8500/v1/health/service/my-web-server?index=40&passing=1&stale=&wait=60000ms: dial tcp 172.17.0.4:8500: getsockopt: no route to host (retry attempt 2 after "500ms") ......

    lb_1會不斷的打印重試到http://consul:8500的健康檢查。

    不過此時訪問 http://10.111.152.136 發現nginx并沒有被破壞,還是可以正常路由到后端三個節點的,后端的web server也正常可用。沒有受到一個consul server節點掛掉的影響。

    只是consul web ui無法訪問了,http://10.111.152.136:8500/ui/#/dc1/services 因為剛好把這個節點停掉了。

    另外兩個節點的日志情況

    host-2機器上,consulserver-node2節點,也是一個Follower狀態的節點上

    consulserver_1 | 2017/07/26 06:02:24 [INFO] memberlist: Suspect consulserver-node1 has failed, no acks received consulserver_1 | 2017/07/26 06:02:27 [INFO] memberlist: Suspect consulserver-node1 has failed, no acks received consulserver_1 | 2017/07/26 06:02:27 [INFO] memberlist: Marking consulserver-node1 as failed, suspect timeout reached consulserver_1 | 2017/07/26 06:02:27 [INFO] serf: EventMemberFailed: consulserver-node1 10.111.152.136 consulserver_1 | 2017/07/26 06:02:27 [INFO] consul: removing server consulserver-node1 (Addr: 10.111.152.136:8300) (DC: dc1) consulserver_1 | 2017/07/26 06:03:19 [INFO] serf: attempting reconnect to consulserver-node1 10.111.152.136:8301 consulserver_1 | 2017/07/26 06:03:49 [INFO] serf: attempting reconnect to consulserver-node1 10.111.152.136:8301 consulserver_1 | 2017/07/26 06:05:19 [INFO] serf: attempting reconnect to consulserver-node1 10.111.152.136:8301 ......

    每隔30s嘗試重連node1.

    host-3機器上,consulserver-node3節點,我們的leader

    consulserver_1 | 2017/07/26 06:02:21 [INFO] raft: aborting pipeline replication to peer 10.111.152.136:8300 consulserver_1 | 2017/07/26 06:02:21 [ERR] raft: Failed to AppendEntries to 10.111.152.136:8300: EOF consulserver_1 | 2017/07/26 06:02:21 [ERR] raft: Failed to heartbeat to 10.111.152.136:8300: dial tcp 10.111.152.136:8300: connection refused consulserver_1 | 2017/07/26 06:02:21 [ERR] raft: Failed to AppendEntries to 10.111.152.136:8300: dial tcp 10.111.152.136:8300: connection refused consulserver_1 | 2017/07/26 06:02:21 [ERR] raft: Failed to heartbeat to 10.111.152.136:8300: dial tcp 10.111.152.136:8300: connection refused consulserver_1 | 2017/07/26 06:02:21 [ERR] raft: Failed to AppendEntries to 10.111.152.136:8300: dial ......

    也在嘗試重連,而且它間隔2s就嘗試一次,頻率上更快。由于一直連不上,后來干脆去掉node1節點了。

    consulserver_1 | 2017/07/26 06:02:27 [INFO] memberlist: Suspect consulserver-node1 has failed, no acks received consulserver_1 | 2017/07/26 06:02:27 [INFO] memberlist: Marking consulserver-node1 as failed, suspect timeout reached consulserver_1 | 2017/07/26 06:02:27 [INFO] serf: EventMemberFailed: consulserver-node1 10.111.152.136 consulserver_1 | 2017/07/26 06:02:27 [INFO] consul: removing server consulserver-node1 (Addr: 10.111.152.136:8300) (DC: dc1)

    不過雖然去掉了node1,但是其他節點依然沒有放棄嘗試重連node1。重連的操作一直都在繼續中。

    5.3.2 恢復節點

    把剛才在host-1上關閉的容器重新啟動

    docker start 4364cd41f2ba

    看看3個機器都會輸出什么。

    host-1上

    consulserver_1 | ==> Starting raft data migration... consulserver_1 | ==> Starting Consul agent... consulserver_1 | ==> Starting Consul agent RPC... consulserver_1 | ==> Consul agent running! consulserver_1 | Node name: 'consulserver-node1' consulserver_1 | Datacenter: 'dc1' consulserver_1 | Server: true (bootstrap: false) consulserver_1 | Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400) consulserver_1 | Cluster Addr: 10.111.152.136 (LAN: 8301, WAN: 8302) consulserver_1 | Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false consulserver_1 | Atlas: <disabled>......consulserver_1 | 2017/07/26 06:23:11 [INFO] consul: New leader elected: consulserver-node2 ......

    consulserver-node1節點又重新啟動了,并且整個集群選舉了新的leader上來:consulserver-node2

    host-2上

    consulserver_1 | 2017/07/26 06:23:05 [INFO] consul: adding server consulserver-node1 (Addr: 10.111.152.136:8300) (DC: dc1)......consulserver_1 | 2017/07/26 06:23:11 [INFO] consul: New leader elected: consulserver-node2 ......

    感知到了consulserver-node1的復活,并且也參與了選舉,選出新leader,是自己,哈哈。

    host-3上

    consulserver_1 | 2017/07/26 06:23:05 [INFO] consul: adding server consulserver-node1 (Addr: 10.111.152.136:8300) (DC: dc1)......consulserver_1 | 2017/07/26 06:23:11 [INFO] consul: New leader elected: consulserver-node2 ......

    同樣感知到了consulserver-node1的復活,并且也參與了選舉,選出新leader。

    此時ngxin依然沒受影響,web服務正常。而且consul web ui也可以正常訪問了。一切都恢復如初。具體這3個節點是如何選舉leader和處理節點的退出和重入的,參考我另外一篇文章 consul實現的raft算法選舉過程解析。


    創建于 2017-07-23 北京,更新于 2017-07-27 北京

    該文章在以下平臺同步

    • LIBERALMAN:
    • CSDN:http://blog.csdn.net/socho/article/details/75434733
    • 簡書:
    • [1] 引用 http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/
    • [2] 引用 http://alice.blog.51cto.com/707092/1896078

    附錄:

    文中架構圖都是用graphviz繪制的,附上圖源碼

    digraph G {size="6,6";label="services register"node [colorscheme=paired12, color=1, style=filled];register_center [label="注冊中心", color=5, shape="record"]consumer [label="服務消費者", color=4, shape="record"]service [label="服務提供者", color=2, shape="record"]consumer -> register_center [label="2.訂閱"]register_center -> consumer [label="5.通知" style=dashed]consumer -> service [label="4.調用"]consumer -> consumer [label="3.緩存" style=dashed]service -> register_center [label="1.注冊"] }digraph G {size="6,6";label="load balance web servers"node [colorscheme=paired12, color=1, style=filled];nginx [label="nginx", color=3, shape="record"]my_web_server_1 [label="my_web_server_1", color=4, shape="record"]my_web_server_2 [label="my_web_server_2", color=4, shape="record"]my_web_server_3 [label="my_web_server_3", color=4, shape="record"]{Client1 Client2 Client3} -> nginx [label="訪問"]nginx -> {my_web_server_1 my_web_server_2 my_web_server_3} [label="轉發"] }digraph G {size="6,6";label="Services register and find"node [colorscheme=paired12, color=1, style=filled];consul [label="consul", color=1]consul_template [label="consul_template", color=2]nginx [label="nginx", color=3, shape="record"]registrator [label="registrator", color=5]my_web_server_1 [label="my_web_server_1", color=4, shape="record"]my_web_server_2 [label="my_web_server_2", color=4, shape="record"]my_web_server_3 [label="my_web_server_3", color=4, shape="record"]{Client1 Client2 Client3} -> nginx [label="訪問"]nginx -> {my_web_server_1 my_web_server_2 my_web_server_3} [label="轉發"]{my_web_server_1 my_web_server_2 my_web_server_3} -> registrator [color="red",style="dashed",label="監控"]registrator -> consul [color="red",style="dashed",label="注冊"]consul -> consul_template [dir=both color=red style="dashed" label="訂閱服務"]consul_template -> nginx [color=red,style="dashed",label="配置更新"] }digraph G {size="6,6";label="Services register and find, consul cluster"node [colorscheme=paired12, color=1, style=filled];consul_node1 [label="consul_node1(leader)", color=7]consul_node2 [label="consul_node2", color=7]consul_node3 [label="consul_ndoe3", color=7]consul_client1 [label="consul_client1", color=7]consul_client2 [label="consul_client2", color=7]consul_client3 [label="consul_client3", color=7]consul_template [label="consul_template", color=2]nginx [label="nginx", color=3, shape="record"]registrator_1 [label="registrator_1", color=5]registrator_2 [label="registrator_2", color=5]registrator_3 [label="registrator_3", color=5]my_web_server_1 [label="my_web_server_1", color=4, shape="record"]my_web_server_2 [label="my_web_server_2", color=4, shape="record"]my_web_server_3 [label="my_web_server_3", color=4, shape="record"]my_web_server_4 [label="my_web_server_4", color=4, shape="record"]my_web_server_5 [label="my_web_server_5", color=4, shape="record"]my_web_server_6 [label="my_web_server_6", color=4, shape="record"]{Client1 Client2 Client3} -> nginx [label="訪問"]nginx -> {my_web_server_1 my_web_server_2 my_web_server_3 my_web_server_4 my_web_server_5 my_web_server_6} [label="轉發"]{my_web_server_1 my_web_server_2} -> registrator_1 [color="red",style="dashed",label="監控"]{my_web_server_3 my_web_server_4} -> registrator_2 [color="red",style="dashed",label="監控"]{my_web_server_5 my_web_server_6} -> registrator_3 [color="red",style="dashed",label="監控"]registrator_1 -> consul_client1 [color="red",style="dashed",label="注冊"]registrator_2 -> consul_client2 [color="red",style="dashed",label="注冊"]registrator_3 -> consul_client3 [color="red",style="dashed",label="注冊"]{consul_client1 consul_client2 consul_client3} -> consul_node1 [color="red",style="dashed",label="注冊"]consul_node1 -> consul_node2 -> consul_node3 [dir=both style=dashed color=blue]consul_node1 -> consul_template [dir=both color=red style="dashed" label="訂閱服務"]consul_template -> nginx [color=red,style="dashed",label="配置更新"]subgraph cluster_host_1 {label="host_1"my_web_server_1my_web_server_2registrator_1consul_client1}subgraph cluster_host_2 {label="host_2"my_web_server_3my_web_server_4registrator_2consul_client2}subgraph cluster_host_3 {label="host_3"my_web_server_5my_web_server_6registrator_3consul_client3}subgraph cluster_clu {label="consul cluster"consul_node1consul_node2consul_node3} }

    謝謝您的贊賞,我會再接再厲,寫出最走心的文章!

    贊賞支持

    • ?



    作者:Liberalman
    鏈接:https://www.jianshu.com/p/a4c04a3eeb57
    來源:簡書
    簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

    總結

    以上是生活随笔為你收集整理的微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲成av人片在线观看香蕉 | 伊人天天色 | 国产在线探花 | 国产中文字幕在线免费观看 | 久久久www成人免费毛片 | 国产特级毛片 | 亚洲日本三级 | 欧美日韩国产一区二 | 最近中文字幕高清字幕免费mv | 韩国在线视频一区 | 欧美疯狂性受xxxxx另类 | 亚洲天堂香蕉 | 精品福利在线观看 | 91私密保健 | 肉色欧美久久久久久久免费看 | 精品成人a区在线观看 | 深爱五月激情五月 | 五月激情六月丁香 | av在线专区| 青草视频在线免费 | 曰本免费av | 在线播放视频一区 | 蜜臀av性久久久久av蜜臀妖精 | 黄色三级在线 | 国产一区在线看 | 久久综合导航 | 一区二区三区久久精品 | 日韩大片在线免费观看 | 色婷婷电影 | 国内免费的中文字幕 | 欧美天天综合 | 人人玩人人添人人澡97 | 韩国精品福利一区二区三区 | 亚洲精品视频第一页 | 看污网站 | 国产精品美女久久久久久久 | 中文字幕在线不卡国产视频 | 国产一级视屏 | 欧美日韩裸体免费视频 | 亚洲激情小视频 | 精品国产乱码久久久久久久 | 亚洲欧美国内爽妇网 | 一区二区影视 | 久久人人爽人人爽人人片 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 欧美在线91 | 精品国产一区二区三区久久久蜜臀 | 91最新网址在线观看 | av官网| 婷婷在线色 | 国产九九热 | 在线国产高清 | 久久久观看 | 99爱视频 | 精品久久久久免费极品大片 | 999热线在线观看 | 亚洲精品视频免费看 | 免费国产一区二区视频 | 91九色在线视频观看 | 视频91 | 亚洲精品系列 | 福利视频导航网址 | 91av蜜桃 | 一区二区 不卡 | 国产精品av免费在线观看 | 五月婷婷中文字幕 | 青青色影院 | 国产一区二区不卡视频 | 久久免费视频在线 | 免费色婷婷| 黄色av网站在线免费观看 | 开心色插| 国产视频久久久久 | 天堂在线成人 | 成年人国产在线观看 | 99久久精品国产一区二区成人 | 美女免费视频网站 | 五月天综合网站 | 色综合天天综合在线视频 | 国产在线观看网站 | 91视频 - v11av | 久久精品在线免费观看 | 99超碰在线播放 | 黄色一级动作片 | 成人毛片100免费观看 | 国产v视频 | 91大神在线观看视频 | 九七视频在线 | 亚洲一区二区三区四区精品 | 韩日三级av | 欧美日韩精品区 | 久久精品国产一区二区电影 | av在线亚洲天堂 | 97成人啪啪网 | 国产精品专区一 | 国产精品久久一区二区三区, | 玖草在线观看 | 成人欧美一区二区三区在线观看 | 美女视频黄免费 | 99九九热只有国产精品 | 首页国产精品 | 亚洲国产成人久久 | 国产精品久久久久9999吃药 | 精品自拍av | 日韩性xxxx | 国产一区二区在线免费观看 | 在线精品在线 | 久久久www成人免费毛片麻豆 | av免费在线观看1 | 天天射天天拍 | 亚洲精品成人av在线 | av东方在线 | 伊人国产视频 | 超级碰碰碰碰 | 91新人在线观看 | 久久久久久久国产精品影院 | 久久久久久久网站 | 久久久久国产a免费观看rela | 久久精品99国产精品酒店日本 | 免费日韩一区二区 | 久久av中文字幕片 | 亚洲理论片在线观看 | 久久色在线观看 | 日韩欧美精品在线 | 人人射人人爽 | 伊人久久av | 国产视频久久久 | 国产精品国产精品 | 亚洲国产美女久久久久 | a级黄色片视频 | 天天综合网天天 | 91精品视频在线免费观看 | 欧美精品久久人人躁人人爽 | 久久久久久久久福利 | 婷婷在线看 | 欧美婷婷综合 | 在线看国产日韩 | 国产日韩欧美视频在线观看 | 久久久久久久久久影院 | 国内精品久久久久久久影视简单 | 国产视频高清 | 日日夜夜中文字幕 | 亚洲精品电影在线 | 日韩在线视 | 人人搞人人爽 | 成年人在线免费看视频 | 欧美色操| 色综合天天在线 | 精品国产免费看 | 亚洲欧美日韩国产精品一区午夜 | 一区二区三区av在线 | 99在线观看免费视频精品观看 | 在线精品视频免费播放 | 久久视| 国产成人福利在线观看 | 爱射综合 | 久久综合桃花 | 国产在线精品视频 | 亚洲乱码精品久久久久 | 99精彩视频在线观看免费 | 亚洲精品国产精品久久99热 | 在线日本看片免费人成视久网 | 中文字幕乱码日本亚洲一区二区 | 欧美做受高潮电影o | 亚洲国产精品传媒在线观看 | 91av在线不卡 | 成人一级免费视频 | www.日韩免费 | 日批视频在线播放 | 国产美女黄网站免费 | 精品国产综合区久久久久久 | 最近高清中文字幕在线国语5 | 日韩电影一区二区三区 | 99热在| 久久综合九色综合欧美就去吻 | 久久综合亚洲鲁鲁五月久久 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 久久人人添人人爽添人人88v | 国产黄a三级三级三级三级三级 | 91色吧 | 国产成人三级在线播放 | 免费观看十分钟 | 黄色在线看网站 | 久久久久久网站 | 精品国产精品久久 | 丁香av | 亚洲成人精品影院 | 久久人人爽人人爽人人片av免费 | 日韩欧美xxx | 在线观看亚洲精品 | 亚洲午夜精品久久久久久久久 | 91麻豆传媒| 在线看av的网址 | 久久精品免费播放 | 国产精品视频线看 | av在线电影网站 | 99性视频| 天天夜夜狠狠操 | 天天操天天爽天天干 | 欧美亚洲精品一区 | 国产亚州av| 欧美精品首页 | 在线一区av | 亚洲精品美女久久久 | 婷婷在线免费观看 | 69中文字幕| 亚洲人成在线观看 | 久久不射电影院 | 久久久香蕉视频 | 久久黄色影视 | 日韩久久电影 | 久久99国产视频 | 成人avav| 国产一级三级 | 国产精品美女免费看 | 又色又爽又黄高潮的免费视频 | 99色视频 | 久草久草久草久草 | 综合天堂av久久久久久久 | 国产va饥渴难耐女保洁员在线观看 | 国产精品9999久久久久仙踪林 | 高清精品视频 | 久久人人爽人人片 | 91视频在线播放视频 | 日韩精品欧美专区 | 国产精品一级视频 | 麻豆成人精品视频 | 成人一区在线观看 | 狠狠干夜夜爽 | 激情五月婷婷激情 | 免费a视频 | 欧美日韩国产综合网 | 97精品超碰一区二区三区 | av三级在线免费观看 | 国产96视频 | 韩日视频在线 | www五月天com | 久久久久久久久久久久久久电影 | 天天做日日做天天爽视频免费 | 精品久久久久一区二区国产 | 一区在线免费观看 | 免费观看性生活大片 | 国产精品系列在线观看 | 91探花系列在线播放 | 精品三级av | 欧美一二区视频 | 免费高清在线观看电视网站 | 欧美黑人性爽 | 91亚洲精品久久久久图片蜜桃 | 九色91在线 | 国产一区在线精品 | 欧美色噜噜噜 | 97视频在线 | 99在线看 | 国产麻豆成人传媒免费观看 | 久久国产精品网站 | 五月婷婷黄色 | 在线观看一级 | 伊人永久 | 视频在线观看99 | 日韩av影视在线观看 | 久久久在线视频 | 国产高清无av久久 | 国语精品免费视频 | 在线观看一二三区 | 91丨porny丨九色 | 麻豆传媒视频在线免费观看 | 成年人黄色免费看 | 五月婷婷六月丁香 | 色天天 | 精品在线视频播放 | 日韩av女优视频 | 国产精品毛片网 | 国产三级午夜理伦三级 | 国产精品一二三 | 超黄视频网站 | 久久精品视频在线观看免费 | 日日摸日日碰 | 亚洲精品三级 | 少妇自拍av | 青青河边草观看完整版高清 | 亚洲播播| 久久免费看毛片 | 亚洲精品视频在 | 久久精品国产久精国产 | 国产一区二区三区视频在线 | 成人黄色在线电影 | 91成年人视频 | 精品天堂av | 国产精品久久久久久久久久久久午 | 久久久99国产精品免费 | 久久视频国产精品免费视频在线 | 一区 在线 影院 | 色婷婷 亚洲| 亚洲国产中文字幕在线 | 黄色a在线| 日韩av成人在线 | 国产黄色在线观看 | 中文av免费 | 国产一区视频在线观看免费 | 欧美日韩一区二区在线观看 | 国产日韩精品在线观看 | 韩国一区二区三区在线观看 | 狠狠色丁香婷婷综合视频 | www蜜桃视频 | 国产一在线精品一区在线观看 | 久久国产精品视频观看 | 国产一二三精品 | 五月婷婷丁香 | 久久精品—区二区三区 | 视频一区二区精品 | 2019中文字幕网站 | 国产麻豆电影 | 亚洲精品欧美视频 | 天天干天天射天天操 | 最近能播放的中文字幕 | 99久久日韩精品免费热麻豆美女 | 国产精品美女久久久 | 亚洲欧美观看 | 中文字幕观看在线 | www.888.av| 国产美女精品视频 | 久久久久久久久久久久久久电影 | 91精品办公室少妇高潮对白 | 99久久精品免费看国产一区二区三区 | 国产在线色站 | 亚洲综合欧美日韩狠狠色 | 国产成人一区在线 | 久章草在线观看 | 成人av资源网 | 国产精品一区在线观看你懂的 | 亚洲精品乱码久久久久久蜜桃欧美 | 夜色.com | 日本在线观看一区二区 | 天天爱天天操天天射 | 日女人电影 | 在线精品在线 | 国产成人精品一区二区三区免费 | 免费黄色网止 | 欧美aaa大片 | 欧美天天综合网 | 国产一级电影免费观看 | 韩国精品一区二区三区六区色诱 | 精品一区二区三区电影 | 日韩午夜精品 | 国产一区在线观看免费 | 欧美精品久久久久a | 成人一级黄色片 | 亚洲精选在线观看 | www.久艹| 成人影音在线 | 国产精品一区在线观看你懂的 | 亚洲一区网站 | 欧美日韩高清不卡 | 亚洲精品国产综合久久 | 中文字幕在线观看视频免费 | 91精品国产入口 | 日韩免费av片 | 亚洲精品久久久久久久蜜桃 | 欧美成人手机版 | 在线观看视频福利 | 天天操天天爽天天干 | 日韩精品一区二区三区高清免费 | 国产麻豆视频在线观看 | 91精品欧美一区二区三区 | 99re久久精品国产 | 久久久九九 | 国产超碰在线观看 | 久久精品久久综合 | 夜色资源站国产www在线视频 | av免费在线免费观看 | 成人免费视频网站 | 久久a v电影 | 视频福利在线 | 97精品国产97久久久久久春色 | 日韩色在线 | 精品一区二区在线免费观看 | 色婷婷激情| 在线午夜电影神马影院 | 成人黄色视 | 天天干,天天射,天天操,天天摸 | 日本特黄特色aaa大片免费 | 天天爱天天操天天爽 | 鲁一鲁影院| 五月激情丁香 | 99久久成人 | 久久不射电影院 | 天天操天天是 | 国产免费观看久久 | 天天操天天操天天 | 色婷婷色 | 久久国精品 | 麻豆成人小视频 | 色噜噜日韩精品一区二区三区视频 | 久久综合九色综合欧美狠狠 | 天天综合视频在线观看 | 在线成人看片 | 少妇18xxxx性xxxx片 | 77国产精品 | 日韩伦理片hd | 日韩av一区在线观看 | 久久草在线视频国产 | 日日爱av | 日韩免费av网址 | 精品久久久久久综合 | 毛片永久新网址首页 | 亚洲精品国产综合久久 | 狠狠躁夜夜躁人人爽视频 | 91麻豆免费版 | 天天操天天爽天天干 | 欧美91精品久久久久国产性生爱 | 福利片视频区 | 综合国产在线观看 | 狠狠色丁香婷婷综合欧美 | 一二三区视频在线 | 亚洲午夜av久久乱码 | 精品一区二区影视 | 免费看在线看www777 | 国产成人性色生活片 | 天天爽天天做 | 国产精品中文久久久久久久 | 中文字幕亚洲综合久久五月天色无吗'' | 欧美成人精品欧美一级乱黄 | 中文字幕在线国产精品 | 成人黄色在线视频 | 国产一二三精品 | 在线视频观看成人 | 久久精品波多野结衣 | 国产精品久久久久久久久久久久午夜 | 狠狠色丁香婷婷综合最新地址 | 日韩欧美视频一区二区三区 | 精品综合久久 | 国产日韩在线观看一区 | 国产一区成人 | 久久久久成人精品免费播放动漫 | 91亚洲网站| 天天插狠狠干 | 91天天操 | 亚洲激情小视频 | 午夜影院三级 | 久久免费成人网 | 视频二区在线视频 | 中文十次啦 | 最新日本中文字幕 | 国产拍揄自揄精品视频麻豆 | 999在线观看视频 | 日韩激情视频在线观看 | 中文在线√天堂 | 欧美五月婷婷 | 美女久久久 | 久久99精品一区二区三区三区 | 久久精品视频国产 | 在线观看成人福利 | 婷婷激情5月天 | 欧美久久电影 | 麻豆国产精品一区二区三区 | 九色视频网 | 婷婷久草 | 99精品欧美一区二区三区黑人哦 | 免费看黄电影 | 精品免费视频. | 国产一区av在线 | 久热久草 | 国产老太婆免费交性大片 | 久久久国产一区二区三区 | 中文字幕久久精品亚洲乱码 | 久久影视精品 | 草久久久久久 | av在线播放不卡 | 中文字幕一区二区三区在线播放 | 天天艹日日干 | 国产在线观看 | 亚洲精品高清在线观看 | 伊人久久影视 | 婷婷激情在线观看 | 国产二区电影 | 久久午夜鲁丝片 | 国产成人三级在线 | 91香蕉视频污在线 | 国产一级视频在线免费观看 | 四虎欧美 | 久久情爱 | 黄毛片在线观看 | 在线观看亚洲精品视频 | 国产视频久久久 | 国产视频高清 | www看片网站| 六月丁香社区 | 久久精品99久久久久久2456 | 9797在线看片亚洲精品 | 日韩亚洲在线视频 | 国产成人一区二区三区 | www.夜夜操 | 在线一二三四区 | 91精品专区| 久久国产精品一国产精品 | 欧美久久久久久久久 | 日韩精品一区二区三区高清免费 | 亚洲国产精品久久久久 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 欧美日韩国产色综合一二三四 | av国产网站 | 色国产视频 | 伊人丁香 | 成人精品电影 | 日日精品 | 国内精品久久久久影院优 | av中文字幕在线免费观看 | 插久久| 人人舔人人舔 | av中文字幕第一页 | 欧美色综合天天久久综合精品 | 色狠狠操| 久久久999| 521色香蕉网站在线观看 | 久久精品美女视频 | 久久视频精品在线观看 | 免费成人在线网站 | 日韩免费在线观看视频 | 午夜久久久久久久久久久 | 国产原厂视频在线观看 | 久久久免费在线观看 | 国产精品免费在线视频 | 国产精品99久久久久久久久久久久 | 久久天天草| 开心激情五月婷婷 | av网址在线播放 | 天天狠狠操 | 久久久麻豆 | 久久三级视频 | 亚洲精品乱码久久久久久蜜桃动漫 | 91精品久久久久久久99蜜桃 | 亚洲精品日韩在线观看 | 亚洲成人午夜在线 | 亚洲精品视频在线免费播放 | 日韩美在线 | 91久久国产自产拍夜夜嗨 | 天天天天天天天操 | 国产黄在线 | av网站地址 | 九九久久国产 | 黄色av电影在线观看 | 亚洲一区二区三区在线看 | 精品一区二区久久久久久久网站 | 免费视频久久 | 在线观看韩国av | 九九九毛片 | 91精品国产自产老师啪 | 亚洲精品综合一二三区在线观看 | 亚洲视频免费 | 国产精品自产拍在线观看桃花 | 精品国产视频在线观看 | 国产麻豆精品传媒av国产下载 | 色五月色开心色婷婷色丁香 | 亚洲成人黄色网址 | 91免费看黄色| 亚洲精品国产成人av在线 | 中文字幕精品久久 | 日韩黄色免费看 | 最新国产一区二区三区 | 国产精品破处视频 | 最新国产精品拍自在线播放 | 经典三级一区 | 国产在线精品观看 | 久久久亚洲电影 | 日韩精品中文字幕在线不卡尤物 | 99精品国产兔费观看久久99 | 久久亚洲免费视频 | 欧美日韩一区二区三区在线观看视频 | 女人魂免费观看 | 久久综合加勒比 | 成年美女黄网站色大片免费看 | 在线电影av | 一区二区三区精品在线 | 开心激情五月网 | 日本中文一区二区 | 十八岁以下禁止观看的1000个网站 | 亚洲综合视频在线 | 国产黄影院色大全免费 | 白丝av免费观看 | 97超碰人人澡人人爱 | adc在线观看 | 久久精品免视看 | 日日夜夜天天人人 | 亚洲精品午夜久久久久久久 | 99精品视频精品精品视频 | 国产一区视频在线播放 | 色视频一区 | 天天色天天操天天爽 | 99热超碰在线 | 91在线免费观看网站 | 日韩欧美网站 | 欧美日韩一区二区视频在线观看 | 黄色片视频免费 | 国产精品久久久久久久久免费看 | 亚洲精品短视频 | 国产一区二区三区在线免费观看 | 国产免费午夜 | 九九免费观看全部免费视频 | 在线观看日韩免费视频 | 色香com.| 国产精品中文字幕在线 | 91看片在线 | 黄色a在线观看 | 国产精品一区二区av日韩在线 | 国模一二三区 | 久久久久久久久久久国产精品 | 色天天综合久久久久综合片 | 97视频免费在线观看 | 色婷婷免费视频 | 欧美精品久久久久久久久免 | 国产一级二级在线观看 | 精品国产理论片 | 激情综合亚洲 | 91看片淫黄大片在线播放 | 久久精品电影 | 亚洲精品99久久久久中文字幕 | 日韩av中文字幕在线免费观看 | 91麻豆精品91久久久久同性 | 久久人人精 | 欧美激情综合五月色丁香 | 欧美日韩不卡一区二区三区 | 日本成人黄色片 | 超碰国产在线播放 | 国产一区视频导航 | 国产精品中文 | 美女一区网站 | 天天操天天艹 | 国产精品成人一区二区三区吃奶 | 亚洲精品天天 | 中文字幕av在线不卡 | 亚洲资源片 | 国产成人精品三级 | wwwwww国产 | 精品久久久久_ | 在线激情影院一区 | 在线免费黄色av | 男女视频久久久 | 一级黄色片毛片 | 国产在线观看高清视频 | 伊人在线视频 | 92中文资源在线 | 少妇自拍av | 日韩免费高清在线观看 | 久久亚洲私人国产精品va | 久草在线视频国产 | 欧美日韩二区在线 | 国产麻豆果冻传媒在线观看 | 国产精品视频在线看 | 日韩欧美国产激情在线播放 | 天天干夜夜夜操天 | 中文欧美字幕免费 | 一区av在线播放 | 久草在线91 | 久久8精品 | 美女黄频视频大全 | 成人免费在线播放视频 | 中文字幕丝袜一区二区 | 亚欧日韩成人h片 | 在线观看精品一区 | 开心激情五月婷婷 | 日韩欧美在线视频一区二区三区 | 少妇精品久久久一区二区免费 | 日韩欧美精品在线观看 | 久草网站 | 日韩特黄一级欧美毛片特黄 | 一级黄色免费网站 | 亚洲精品乱码久久久久v最新版 | 97精品国产一二三产区 | 国产午夜三级一区二区三桃花影视 | 色婷婷久久久综合中文字幕 | 国产亚洲片| 91看片成人 | 激情中文字幕 | 久久国产精品视频 | 国产无吗一区二区三区在线欢 | 精品99免费视频 | 成年人视频在线免费 | 国产午夜一区 | 一区二区三区动漫 | 特级毛片在线免费观看 | 81精品国产乱码久久久久久 | 特级西西人体444是什么意思 | 一级黄色片在线免费观看 | 久久黄色a级片 | 国产精品久久久久久久免费大片 | 亚洲精品久久久蜜桃直播 | 麻豆一区二区三区视频 | 亚洲视频久久久久 | 国产精品久久久久永久免费观看 | 亚洲女欲精品久久久久久久18 | 狠狠色丁香婷婷综合基地 | 欧美91精品国产自产 | 日韩免费精品 | 亚洲人av免费网站 | 国产小视频在线免费观看视频 | 欧美精品在线视频 | 国产精品久久99 | 蜜桃麻豆www久久囤产精品 | 日韩精品中文字幕在线不卡尤物 | 欧美十八 | 日韩精选在线观看 | 91九色视频在线观看 | 就要干b| 亚洲观看黄色网 | 亚洲精品高清视频 | 免费在线观看一级片 | 最新日韩在线 | 伊人视频| 国产精品麻豆免费版 | 狠狠网| 日韩一级黄色av | a级国产乱理论片在线观看 伊人宗合网 | 丁香在线观看完整电影视频 | 91成人精品一区在线播放 | 国产黑丝一区二区 | 婷婷在线视频 | 狠狠操狠狠干天天操 | 99久久精品一区二区成人 | 三级视频国产 | 久久久久久久久黄色 | 91男人影院 | 国内精品久久久久久久久久久久 | 久久国产一区二区三区 | 麻豆 91 在线 | 国产精品成人自拍 | 精品一区二区影视 | 日韩在线观看一区二区三区 | 91在线在线观看 | 亚洲成人精品在线观看 | 91在线你懂的 | 欧美日韩高清不卡 | 丁香色婷婷 | 日日夜夜天天人人 | 国产91全国探花系列在线播放 | 中文字幕免 | 天天搞天天干天天色 | 97在线视频免费观看 | 久草视频免费看 | 黄色一区二区在线观看 | 免费视频一区二区 | 色永久免费视频 | 久久久久久久国产精品影院 | 国产日韩中文字幕在线 | 久久久久欧美精品 | 国内外激情视频 | 韩日精品在线观看 | 97手机电影网 | 日韩av在线影视 | 超碰公开97| 蜜臀av性久久久久蜜臀aⅴ涩爱 | 中文字幕在线播放一区二区 | 91人人澡| av电影久久 | av网址aaa | 国产成人在线一区 | 欧美日韩一区二区免费在线观看 | 91香蕉视频黄色 | 久久免费视频网 | 免费在线观看毛片网站 | 中文字幕一区二区在线播放 | 欧美日韩一区二区在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产美女精品视频免费观看 | 国产精品久久久久久久久久免费 | 人人插人人插 | av一区二区三区在线播放 | 五月婷网站| 久久婷婷一区二区三区 | 国产在线视频资源 | 中文字幕在线视频一区二区三区 | 天堂资源在线观看视频 | 久久精品婷婷 | 亚洲精品h | 午夜精品一区二区三区在线 | 国产婷婷视频在线 | 久久电影网站中文字幕 | 奇米网777| 最近中文字幕在线播放 | 久久天天躁狠狠躁夜夜不卡公司 | 国产一区久久久 | 欧美在线你懂的 | 视频一区二区三区视频 | 亚洲乱码一区 | 中文乱幕日产无线码1区 | 久久久91精品国产一区二区三区 | 丁香资源影视免费观看 | 极品国产91在线网站 | 国产超碰97 | 五月婷婷狠狠 | 天天操狠狠操夜夜操 | 麻豆视频免费入口 | 69视频在线播放 | 在线观看黄色av | 人人讲下载 | 开心色插 | 91中文在线观看 | 美女视频黄免费的久久 | av免费线看 | 日韩特级片| 国产精品久久 | 国产精品嫩草影院99网站 | 99久久这里有精品 | 欧美日韩国产二区 | 久久久一本精品99久久精品66 | 国产aa精品 | 超碰夜夜| 欧美极度另类 | 成人一级在线观看 | 亚洲精品小视频 | 免费看一及片 | 就操操久久| 久久婷婷综合激情 | 亚洲天天草 | 96在线| 国产精品成人av在线 | 日韩中文字幕免费在线播放 | 四虎在线视频免费观看 | 亚洲区视频在线 | 国产黄色特级片 | 首页av在线 | 国内精品久久久久影院男同志 | 日韩一区二区三区观看 | 欧美天天射| 国产精品一区二区三区四区在线观看 | 欧美在线观看视频免费 | 国产一区在线播放 | 色综合久久综合中文综合网 | 午夜精品一区二区三区在线播放 | 在线观看黄a| 久久久精品久久 | av色影院 | 日韩欧美黄色网址 | 在线韩国电影免费观影完整版 | 精品视频国产一区 | 亚洲美女精品视频 | 中文字幕 婷婷 | 精品一区二区三区久久 | 久久成人综合视频 | 国产精美视频 | 免费十分钟 | 天天操天天干天天插 | 亚洲一级片免费观看 | 日韩免费一区二区三区 | 成人小视频在线观看免费 | 日本最新中文字幕 | 综合激情网... | 又色又爽又黄高潮的免费视频 | 天天操夜夜拍 | 午夜精品久久久久久久爽 | 欧美整片sss | 亚洲天堂首页 | 成人一区二区在线观看 | 欧美一级免费 | 日韩欧美在线一区 | 欧美成人区| 青青网视频 | 国产一区二区久久久 | 亚洲国产精品va在线看黑人 | 正在播放国产一区 | 精品国产一区二区三区免费 | 成人h视频在线 | 日日爽| 91福利小视频 | 蜜桃视频成人在线观看 | 蜜桃视频成人在线观看 | 午夜精品久久久久久久99热影院 | 日韩电影在线观看一区二区三区 | 久久激情小说 | 国产理论免费 | 久久久久久久久综合 | 中文免费观看 | 久久久电影网站 | 色中色综合 | 欧美日韩高清在线一区 | 免费在线国产视频 | 在线综合 亚洲 欧美在线视频 | 在线成人av| 在线国产一区 | 国产精品久久久久三级 | 丁香在线| 国产成人精品一区二区在线 | 日韩精品一区二区三区视频播放 | 五月婷丁香网 | 亚洲 综合 国产 精品 | 精品999在线观看 | 国产精品第一视频 | 日韩欧美在线一区二区 | 探花视频网站 | 国产1区2 | 中文在线a∨在线 | 二区视频在线 | 欧美性黑人 | 成人在线视频在线观看 | 深夜男人影院 | 精品国产乱码久久 | 欧美色图p| 色在线免费观看 | 一区二区视 | 欧美一级免费黄色片 | 视频国产| 日韩av成人在线观看 | 成年人看片网站 | 亚洲日本一区二区在线 | 色www精品视频在线观看 | 在线观看日韩中文字幕 | 天天拍天天爽 | 日韩在线欧美在线 | 婷婷六月色 | 久艹视频在线免费观看 | 久久天天躁夜夜躁狠狠85麻豆 | 天天色天天操综合网 | 日韩电影在线观看中文字幕 | 欧美人牲 | 国产精品初高中精品久久 | 四虎成人网 | 中文字幕在线观看1 | 国内丰满少妇猛烈精品播放 | 99热在线精品观看 | 干狠狠| 国产尤物在线观看 | 四虎在线视频 | adn—256中文在线观看 | 久草网视频在线观看 | 国产精品久久久久久久久久不蜜月 | 亚洲精品午夜久久久 | 亚洲精品xxx | 人人要人人澡人人爽人人dvd | 色中色综合 | 91视频免费看片 | 亚洲精品视频在线观看视频 | 国产福利不卡视频 | 亚洲精品乱码久久 | 日韩av在线免费看 | 久久久久久片 | 亚洲精品美女久久久久 | 欧美91精品久久久久国产性生爱 | 色丁香久久 | 99久久99久久综合 | www日日 | 久久色亚洲 | 成人免费xxx在线观看 | 午夜精品视频一区二区三区在线看 | 欧美视频在线观看免费网址 | 国产天天综合 | 久久五月婷婷丁香社区 | av成年人电影 | 97免费视频在线播放 | 中文字幕 二区 | 亚洲三级网 | 亚洲在线精品视频 | 性色av免费看 | 色七七亚洲影院 | 国产色秀视频 | 欧美最猛性xxxxx(亚洲精品) | 丁香六月网| 91亚色视频| 久久久九色精品国产一区二区三区 | 久久综合九色综合欧美就去吻 | 超碰电影在线观看 | 国精产品999国精产品岳 | 国产成人av一区二区三区在线观看 | 亚洲精品理论 | av在线进入| 亚洲精品国产第一综合99久久 | 五月色婷 | 午夜精品一区二区三区免费视频 | 午夜视频亚洲 | 毛片网站观看 | 香蕉影院在线观看 | 麻豆视频国产在线观看 | 九九免费精品视频在线观看 | av免费播放| 999久久国精品免费观看网站 | 一区二区三区四区免费视频 | 天天色天天射综合网 | 亚洲最新精品 | 天天爽天天爽天天爽 | 国产一二三精品 | 欧美在线一级片 | 精品免费一区 | 国产精品久久久久久久免费大片 | 欧美日韩在线播放 | 91精品欧美一区二区三区 | 成人黄色电影在线观看 | 麻豆视频在线免费 | 久久久九色精品国产一区二区三区 | 麻豆系列在线观看 | 国产精品99久久久精品免费观看 | 又黄又爽又刺激的视频 | 91国内在线 | 97视频在线观看播放 | 2022中文字幕在线观看 | 久久久久综合精品福利啪啪 | 久久国产免费 | 99热最新网址 | 久久久精华网 | 97国产超碰在线 |