首頁 > 軟體

微服務之註冊中心和設定中心Consul詳解

2023-09-06 06:27:59

概述

上篇說到構建良好的架構,依託於基礎設施建設(自動化測試、自動化部署、服務監控,服務發現、設定中心等等),決定成敗的往往是基礎設施建設,所以從搭建一個註冊中心和設定中心開始我們新一階段的啟程。

註冊中心

註冊中心選型

你有沒有思考過這樣一個問題,為什麼會有這麼多的註冊中心(etcd/ZooKeeper/Consul),選用那個最適合自己,是不是在選用的時候會眼花繚亂?

我在開始做的時候,自己也有很多困惑,將近3年的時候裡我都在不停的學習,但是還是有很多不同的框架和產品,後來我明白了其中的原因,他們就像生活中的可樂、果汁、和牛奶一樣,你在使用的時候選取你的程式語言(Java、Go、PHP),程式易接入的就好了。

產生註冊中心五花八門的原因是因為語言很多,都想打造最適合自己的體系生態,我選擇Consul為大家講解,因為它安裝和接入都比較方便。

不用被這些假象所困擾,多學習網路和系統的底層原理,萬變不離其宗,技術人應該是給出解決方案。

CAP原理

  • 一致性: 所有節點在同一時間具有相同的資料
  • 可用性:保證每個請求不管成功或者失敗都有響應
  • 分割區容錯:系統中任意資訊的丟失或失敗不會影響系統的繼續運作
FeatureConsulZooKeeperetcd
服務健康檢查服務狀態、記憶體、硬碟長連結、Keepalive連結心跳
多資料中心支援
K/V儲存服務支援支援支援
一致性RaftPaxosRaft
CAP定理CPCPCP
使用介面(多語言能力)Http/Dns使用者端Http/Grpc
安全acl/httpsaclHttps支援

Consul介紹

使用PHP、和Go編寫,使用Consul作為註冊中心和設定中心比較方便,所以我選用的是Consul。

  • 採用Raft演演算法實現,有服務發現,Key/Value儲存,可以做設定中心使用,有健康檢查,並提供了web管理頁面。

Consul 內部埠說明:

  • TCP/8300:8300埠用於伺服器節點,使用者端通過RPC協定呼叫伺服器端節點。
  • TCP/UDP/8301: 8301埠用於單個資料中心所有節點之間的互相通訊,即對LAN池資訊的同步,它使得整個資料中心能夠自動的發現伺服器地址,分散式監測點的故障,事件廣播。
  • TCP/UDP/8302: 8302埠用於單個或多個資料中心之間的伺服器節點的資訊同步(WAL池資訊的同步),它針對網際網路的高延遲進行了優化,能夠實現跨資料中心請求。
  • HTTP/8500: 8500埠基於Http服務,用於Api介面和Ui存取。
  • DNS/8600: 8600埠作為DNS伺服器,它使得我們可以通過節點查詢節點資訊。

Consul Raft演演算法

  • 解決了分散式中領導選舉和一致性問題
  • Raft演演算法是比較出名的共識演演算法,比如Redis的哨兵、Consul

Consul 叢集的特點:

  • 任期機制,Raft是終身任期的,它永遠都是領導者
  • 心跳機制,它決定領導者是否能有效的和跟隨者通訊
  • 隨機的選舉超時時間,因為是隨機的所以決定了不會再同一時間進行選舉
  • 先到先得,一屆任期內,先收到誰的投票就會給誰,剩下的請求一律拒絕
  • 過半機制,收到一半的投票才會

Consul 叢集的角色:

  • Followers 追隨者:接受到領導者傳送的訊息,當心跳超時時,主動推薦自己成為候選人。
  • Candidate 候選人:傳送Rpc訊息,讓其它節點投票給自己,當投票超過半數時,成為領導者。
  • Leader 領導者:向其他節點傳送心跳,只要心跳不超時,一直為領導者。

演演算法的詳情可以點選官網視訊檢視

Consul 基本使用

註冊服務

1.註冊服務是Consul最基礎的服務,點選檢視官網Api

PUT 192.168.88.144:8500/v1/agent/service/register
{
    "Name":"audio",
    "Id":"audio",
    "Tags":[
        "v2",
        "primary"
    ],
    "Address":"192.168.88.144",
    "Port":8500,
    "Check":{
        "HTTP":"http://192.168.88.144:8500",
        "Interval":"10s"
    }
}
{
  "id": "web",
  "name": "web",
  "port": 80,
  "check": {
    "name": "ping check",
    "args": ["ping", "-c1", "test.stark.com"],
    "interval": "30s",
    "status": "passing"
  }
}

2.發現服務

GET http://192.168.88.144:8500/v1/health/service/audio
[
    {
        "Node": {
            "ID": "38779dca-bffd-e399-6597-266aff68132c",
            "Node": "server01-virtual-machine",
            "Address": "127.0.0.1",
            "Datacenter": "dc1",
            "TaggedAddresses": {
                "lan": "127.0.0.1",
                "lan_ipv4": "127.0.0.1",
                "wan": "127.0.0.1",
                "wan_ipv4": "127.0.0.1"
            },
            "Meta": {
                "consul-network-segment": ""
            },
            "CreateIndex": 13,
            "ModifyIndex": 17
        },
        "Service": {
            "ID": "audio",
            "Service": "audio",
            "Tags": [
                "v2",
                "primary"
            ],
            "Address": "192.168.88.144",
            "TaggedAddresses": {
                "lan_ipv4": {
                    "Address": "192.168.88.144",
                    "Port": 8500
                },
                "wan_ipv4": {
                    "Address": "192.168.88.144",
                    "Port": 8500
                }
            },
            "Meta": null,
            "Port": 8500,
            // ...
}
]

Service API Service 相關的 API 都在 /v1/agent/service 下:

  • /agent/services:該端點返回在本地代理程式中註冊的所有服務;
  • /agent/service/{service_id}:返回在本地代理上註冊的單個服務範例的完整服務定義;
  • /agent/health/service/name/{service_name}/
  • /agent/health/service/id/{service_id}:通過名稱或id檢索本地代理上的聚合服務狀態;
  • /agent/service/register:註冊服務;
  • /agent/service/deregister/{service_id} :登出服務;
  • /agent/service/maintenance/{service_id}:該端點將給定的服務置於“維護模式”,在維護模式下,該服務將被標記為不可用,並且不會出現在DNS或API查詢中。

關於更多Consul的使用,查詢官方檔案吧。

以上就是微服務之註冊中心和設定中心Consul詳解的詳細內容,更多關於微服務註冊設定Consul的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com