consul服務注冊發現介紹


  Consul 是一套開源的分布式服務發現和配置管理系統,由 HashiCorp 公司用 Go 語言開發。它具有很多優點。包括:基於 raft 協議,比較簡潔; 支持健康檢查, 同時支持 HTTP 和 DNS 協議 支持跨數據中心的 WAN(廣域網) 集群 提供圖形界面 跨平台,支持 Linux、Mac、Windows。

  consul是使用go語言開發的服務發現、配置管理中心服務。內置了服務注冊與發現框架、分布一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案,不再需要依賴其他工具(比如ZooKeeper等)。服務部署簡單,只有一個可運行的二進制的包。每個節點都需要運行agent,他有兩種運行模式server和client。每個數據中心官方建議需要3或5個server節點以保證數據安全,同時保證server-leader的選舉能夠正確的進行。

  raft(分布式一致性協議):見《一致性算法之:Raft》 

  @client

  CLIENT表示consul的client模式,就是客戶端模式。是consul節點的一種模式,這種模式下,所有注冊到當前節點的服務會被轉發到SERVER,本身是不持久化這些信息。

  @server

  SERVER表示consul的server模式,表明這個consul是個server,這種模式下,功能和CLIENT都一樣,唯一不同的是,它會把所有的信息持久化的本地,這樣遇到故障,信息是可以被保留的。

  @server-leader

  中間那個SERVER下面有LEADER的字眼,表明這個SERVER是它們的老大,它和其它SERVER不一樣的一點是,它需要負責同步注冊的信息給其它的SERVER,同時也要負責各個節點的健康監測。

  @raft

  server節點之間的數據一致性保證,一致性協議使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。

  @服務發現協議

  consul采用http和dns協議,etcd只支持http

  @服務注冊

  consul支持兩種方式實現服務注冊,一種是通過consul的服務注冊http API,由服務自己調用API實現注冊,另一種方式是通過json個是的配置文件實現注冊,將需要注冊的服務以json格式的配置文件給出。consul官方建議使用第二種方式。

  @服務發現

  consul支持兩種方式實現服務發現,一種是通過http API來查詢有哪些服務,另外一種是通過consul agent 自帶的DNS(8600端口),域名是以NAME.service.consul的形式給出,NAME即在定義的服務配置文件中,服務的名稱。DNS方式可以通過check的方式檢查服務。

  @服務間的通信協議

  Consul使用gossip協議管理成員關系、廣播消息到整個集群,他有兩個gossip  pool(LAN pool和WAN pool),LAN pool是同一個數據中心內部通信的,WAN pool是多個數據中心通信的,LAN pool有多個,WAN pool只有一個。

  

一、基本概念

在描述架構之前,這里提供了一些術語來幫助聲明正在探討的東西:

  • Agent——agent是一直運行在Consul集群中每個成員上的守護進程。通過運行 consul agent 來啟動。agent可以運行在client或者server模式。指定節點作為client或者server是非常簡單的,除非有其他agent實例。所有的agent都能運行DNS或者HTTP接口,並負責運行時檢查和保持服務同步。
  • Client——一個Client是一個轉發所有RPC到server的代理。這個client是相對無狀態的。client唯一執行的后台活動是加入LAN gossip池。這有一個最低的資源開銷並且僅消耗少量的網絡帶寬。
  • Server——一個server是一個有一組擴展功能的代理,這些功能包括參與Raft選舉,維護集群狀態,響應RPC查詢,與其他數據中心交互WAN gossip和轉發查詢給leader或者遠程數據中心。
  • DataCenter——雖然數據中心的定義是顯而易見的,但是有一些細微的細節必須考慮。例如,在EC2中,多個可用區域被認為組成一個數據中心?我們定義數據中心為一個私有的,低延遲和高帶寬的一個網絡環境。這不包括訪問公共網絡,但是對於我們而言,同一個EC2中的多個可用區域可以被認為是一個數據中心的一部分。
  • Consensus——在我們的文檔中,我們使用Consensus來表明就leader選舉和事務的順序達成一致。由於這些事務都被應用到有限狀態機上,Consensus暗示復制狀態機的一致性。
  • Gossip——Consul建立在Serf的基礎之上,它提供了一個用於多播目的的完整的gossip協議。Serf提供成員關系,故障檢測和事件廣播。更多的信息在gossip文檔中描述。這足以知道gossip使用基於UDP的隨機的點到點通信。
  • LAN Gossip——它包含所有位於同一個局域網或者數據中心的所有節點。
  • WAN Gossip——它只包含Server。這些server主要分布在不同的數據中心並且通常通過因特網或者廣域網通信。
  • RPC——遠程過程調用。這是一個允許client請求server的請求/響應機制。

   

  拆解開這個體系,從每一個組件開始了解。首先,可以看到有兩個數據中心,分別標記為“one”和“two”。Consul是支持多數據中心一流,並且是常用業務場景。

  每個數據中心都是由Server和client組成。建議有3~5 Server——基於故障處理和性能的平衡之策。如果增加越多的機器,則Consensus會越來越慢。對client沒有限制,可以很容易地擴展到成千上萬或數萬。

  同一個數據中心的所有節點都要加入Gossip協議。這意味着gossip pool包含給定數據中心的所有節點。有以下目的:首先,沒有必要為client配置服務器地址參數;發現是自動完成的。第二,節點故障檢測的工作不是放置在服務器上,而是分布式的。這使故障檢測比心跳機制更可擴展性。第三,可用來作為消息層通知重要的事件,如leader選舉。

  每個數據中心的服務器都是屬於一個Raft peer。這意味着,他們一起工作,選出一個的Leader,Leader server是有額外的職責。負責處理所有的查詢和事務。事務也必須通過Consensus協議復制到所有的伙伴。由於這一要求,當非Leader Server接收到一個RPC請求,會轉發到集群的leader。

  Server節點也是作為WAN gossip pool的一部分。這個pool是與LAN gossip pool是不同的,它為具有更高延遲的網絡響應做了優化,並且可能包括其他consul集群的server節點。設計WANpool的目的是讓數據中心能夠以low-touch的方式發現彼此。將一個新的數據中心加入現有的WAN Gossip是很容易的。因為池中的所有Server都是可控制的,這也使跨數據中心的要求。當一個Serfer接收到不同的數據中心的要求時,它把這個請求轉發給相應數據中心的任一Server。然后,接收到請求的Server可能會轉發給Leader。

  多個數據中心之間是低耦合,但由於故障檢測、連接緩存復用、跨數據中心要求快速和可靠的響應。

二、consul安裝

1、到consul的官網下載:https://www.consul.io/downloads.html 

2.  解壓:

3. 啟動server服務

  consul agent -server -data-dir=/opt/consul/data -node=xxxxx -bind=xxxxxx -client=0.0.0.0 -datacenter=sandbox -log-file=/opt/consul/consul.log -ui -join=xxxx &

 

Consul 啟動參數說明

啟動參數 說明
-advertise 通知展現地址用來改變我們給集群中的其他節點展現的地址,一般情況下-bind地址就是展現地址
-bootstrap 用來控制一個server是否在bootstrap模式,在一個datacenter中只能有一個server處於bootstrap模式,當一個server處於bootstrap模式時,可以自己選舉為raft leader
-bootstrap-expect 在一個datacenter中期望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候才會引導整個集群,該標記不能和bootstrap公用
-bind 該地址用來在集群內部的通訊,集群內的所有節點到地址都必須是可達的,默認是0.0.0.0
-client consul綁定在哪個client地址上,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1
-config-file 明確的指定要加載哪個配置文件
-config-dir 配置文件目錄,里面所有以.json結尾的文件都會被加載
-data-dir 提供一個目錄用來存放agent的狀態,所有的agent允許都需要該目錄,該目錄必須是穩定的,系統重啟后都繼續存在
-dc 該標記控制agent允許的datacenter的名稱,默認是dc1
-encrypt 指定secret key,使consul在通訊時進行加密,key可以通過consul keygen生成,同一個集群中的節點必須使用相同的key
-join 加入一個已經啟動的agent的ip地址,可以多次指定多個agent的地址。如果consul不能加入任何指定的地址中,則agent會啟動失敗,默認agent啟動時不會加入任何節點。
-retry-join 和join類似,但是允許你在第一次失敗后進行嘗試
-retry-interval 兩次join之間的時間間隔,默認是30s
-retry-max 嘗試重復join的次數,默認是0,也就是無限次嘗試
-log-level consul agent啟動后顯示的日志信息級別。默認是info,可選:trace、debug、info、warn、err
-node 節點在集群中的名稱,在一個集群中必須是唯一的,默認是該節點的主機名
-protocol consul使用的協議版本
-rejoin 使consul忽略先前的離開,在再次啟動后仍舊嘗試加入集群中
-server 定義agent運行在server模式,每個集群至少有一個server,建議每個集群的server不要超過5個
-syslog 開啟系統日志功能,只在linux/osx上生效
-ui 使用自帶的ui
-ui-dir 提供存放web ui資源的路徑,該目錄必須是可讀的
-pid-file 提供一個路徑來存放pid文件,可以使用該文件進行SIGINT/SIGHUP(關閉/更新)agent

4、驗證

用瀏覽器訪問:http://localhost:8500/ui/#/dc1/services

 

    server 表示啟動的為consul server ,構建一個consul cluster 一般建議使用3或者5個consul server
    bootstrap-expect 1 表示期望的服務節點數目為1
    -data-dir 數據目錄,如果該文件夾不存在則手工創建,如果在consul發生錯誤后,建議先清理該目錄文件
    advertise 設置廣播地址,ip可以設置為公網ip
    client 設置client訪問的地址
    ui-dir web控制台目錄位置

 三、consul功能介紹

consul 具有以下性質:

  • service discovery(服務發現):consul通過DNS或者HTTP接口使服務注冊和服務發現變的很容易,一些外部服務,例如saas提供的也可以一樣注冊。
  • health checking(服務健康監測):健康檢測使consul可以快速的告警在集群中的操作。和服務發現的集成,可以防止服務轉發到故障的服務上面。
  • key/value storage(ey/value 存儲):一個用來存儲動態配置的系統。提供簡單的HTTP接口,可以在任何地方操作。
  • multi-datacenter(多數據中心):無需復雜的配置,即可支持任意數量的區域

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM