微服務Consul系列之服務部署、搭建、使用

五月君發表於2019-03-30

使用Consul解決了哪些問題:

  • 是否在為不同環境來維護不同專案配置而發愁
  • 是否有因為配置的更改,導致程式碼還要進行修改、釋出,因為客流量大了還要規避開高峰期等到半夜來發布
  • 微服務架構下,應用的分解,業務系統與服務系統之間的呼叫管理

以上只是列舉的筆者曾經遇到的幾點問題,當然問題還不止於這些,下面介紹的Consul可以有效解決這些問題,當然還有一些其它的優點,讓我們一起期待下文的Consul的講解。

Consul的四大核心特性:

  • 服務發現:可以方便的實現服務註冊,通過DNS或者HTTP應用程式可以很容易的找到他所依賴的服務.
  • Key/Value儲存:使用Key/Value進行資料儲存。
  • 多資料中心:Consul支援開箱即用的多資料中心。這意味著使用者不需要擔心建立額外的抽象層讓業務擴充套件到多個區域
  • 健康檢查:可以對指定服務進行健康檢查例如,Response Status是否為200,避免將流量轉發到不健康的服務上。

Consul架構

圖片來自官網 Consul Architecture

微服務Consul系列之服務部署、搭建、使用

上圖很好的展示了Consul對於多資料中心的支援,另外在兩個資料中心之間只有Service層可以相互通訊。

Consul是一個分散式高可用的系統,一個發現和配置服務的工具。客戶端可以利用它提供的API註冊和發現服務,及監控檢測功能實現服務的高可用,深入的架構描述具體細節,可以參考官網Consul Architecture,下面開始進入實戰操作部分。

安裝部署

本處主要以linux來講解,其他操作平臺見官網Download Consul

下載 wget https://releases.hashicorp.com/consul/1.4.0/consul_1.4.0_linux_amd64.zip

解壓 unzip consul_1.4.0_linux_amd64.zip 得到目錄consul
複製 consul到你的系統的任何一個地方,如果你想使用命令列直接訪問,確保複製的目錄在你的PATH裡 cp consul /usr/local/bin/

驗證consul是否安裝成功,出現以下視窗則安裝成功

[root@iZbp1isjfk2rw8fpnxx8wgZ ~]# consul
Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    acl            Interact with Consul's ACLs
    agent          Runs a Consul agent
    catalog        Interact with the catalog
    connect        Interact with Consul Connect
    debug          Records a debugging archive for operators
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators.
    intention      Interact with Connect service intentions
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    services       Interact with services
    snapshot       Saves, restores and inspects snapshots of Consul server state
    validate       Validate config files/directories
    version        Prints the Consul version
    watch          Watch for changes in Consul
複製程式碼

Consul Agent

執行consul agent -dev,啟動開發模式,這個模式會快速啟動一個單節點的Consul。注意,這個模式不能資料持久化,因此,不能用於生產環境

啟動命令簡介:

  • -server:定義agent執行在server模式,每個資料中心的Server建議在3~5個避免失敗情況下資料的丟失
  • -client:定義agent執行在client模式
  • -bootstrap-expect:在一個datacenter中期望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候才會引導整個叢集
  • -bind:節點的ip地址一般是0.0.0.0或雲服務內網地址,用於被叢集中的其他節點所訪問
  • -node:指定節點在叢集中的唯一名稱,預設為機器的hostname
  • -config-dir:配置檔案目錄,裡面所有以.json結尾的檔案都會被載入
  • 更多可選引數參考Consul Command-line Options

Start Agent

[root@iZbp1isjfk2rw8fpnxx8wgZ ~]# consul agent -dev
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v1.4.0'
           Node ID: '9e05f4d6-56c1-e57c-c726-15d9ab1c0dd5'
         Node name: 'iZbp1isjfk2rw8fpnxx8wgZ'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:
複製程式碼

看下 consul agent 輸出的幾個重要資訊:

  • Node name:代理的唯一名稱,預設是機器的hostname,可以通過-node標誌自定義,例如:consul agent -dev -node myNode
  • Datacenter:資料中心,Consul支援多個資料中心,為了有效的工作,每個節點必須被配置且上報到資料中心,-datacenter標誌用來設定資料中心,對於單一的DC配置,這個代理預設為dc1
  • Server:表示代理是以伺服器還是客戶端的模式來執行。
  • Client Addr:用於代理的客戶端介面地址。
  • Cluster Addr:用於叢集中的Consul代理之間通訊的地址和埠集,改地址必須可供其它節點訪問。

檢視叢集成員

開啟一個新終端執行consul members,可以看到叢集的成員。

圖片描述

  • Node:節點名稱
  • Address:節點地址
  • Status:alive表示節點為健康狀態
  • Type:節點的執行模式(Server)

Stop Agent

Agent兩種停止方式:gracefullyforcefully gracefully方式停止,則是傳送中斷訊號到Agent程式兩種方法:Ctrl+Ckill -INT consul_pid

服務註冊

Consul服務搭建好之後,通過提供服務定義HTTP API註冊一個服務,通用的模式是通過提供服務定義的方式,下文還會介紹怎麼應用Consul進行健康檢查

提供服務定義方式服務註冊

建立目錄/etc/consul.d(.d 字尾意思是這個路徑包含了一組配置檔案),Consul會載入該目錄下的所有檔案。

例如我現在有個測試服務test01埠為3010

sudo mkdir /etc/consul.d/test01.json

{
    "service":{
        "name":"test01",
        "tags":[
            "",
            ""
        ],
        "address":"127.0.0.1",
        "port":3010,
        "enable_tag_override": false,
        "check":{
            "deregisterCriticalServiceAfter":"90m",
            "http":"http://127.0.0.1:3010/health",
            "interval":"10s"
        }
    }
}
複製程式碼

服務定義配置檔案含義:

  • name:服務名
  • tags:服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務
  • address:服務註冊到consul的IP,服務發現,發現的就是這個IP
  • port:服務註冊consul的PORT,發現的就是這個PORT
  • enable_tag_override:標籤是否允許覆蓋
  • check:健康檢查部分
    • deregisterCriticalServiceAfter
    • http:指定健康檢查的URL,呼叫後只要返回20X,consul都認為是健康的
    • interval:健康檢查間隔時間,每隔10s,呼叫一次上面的URL

重啟Agent設定配置目錄

consul agent -dev -config-dir /etc/consul.d
複製程式碼

看以下執行結果:

啟動之後控制檯輸出了Synced service "test01",意思是Agent從配置檔案中載入了服務定義,且成功註冊到服務目錄,另外右邊的服務test01也收到了健康檢查介面呼叫

圖片描述

採用HTTP API服務註冊

呼叫/v1/agent/service/register介面進行註冊,請求Method為PUT方式

請求Body值為服務定義中的service值,看一下示例:

curl -X PUT \
  http://127.0.0.1:8301/v1/agent/service/register \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: 6b672c02-350f-3d1c-7793-1a0d9e800fc9' \
  -d '{
	"id": "test01",
    "name":"test01",
    "tags":[
        "",
        ""
    ],
    "address":"127.0.0.1",
    "port":3010,
    "check":{
        "deregisterCriticalServiceAfter":"90m",
        "http":"http://127.0.0.1:3010/health",
        "interval":"10s"
    }
}'
複製程式碼

本篇為微服務架構中基於Consul實現的服務註冊系列文章,目錄如下:

作者:五月君
連結:www.imooc.com/article/275…
來源:慕課網
Github: Node.js技術棧

相關文章