微服務Consul系列之服務註冊與發現

五月君發表於2019-04-09

在進行服務註冊之前先確認叢集是否建立,關於服務註冊可以看上篇微服務Consul系列之叢集搭建的介紹,兩種註冊方式:一種是註冊HTTP API、另一種是通過配置檔案定義,下面講解的是基於後者配置檔案定義的形式,也是Consul官方所建議的方式。

推薦技術部落格: Node.js技術棧

準備工作

以下是上節做Consul叢集的時候列的機器列表,下面我們將192.168.6.131機器安裝了Node服務,起了兩個埠

機器 模式 節點名稱
192.168.6.128 Server consul_1(初始設定為Leader)
192.168.6.129 Server consul_2
192.168.6.130 Server consul_3
192.168.6.131 Client consul_4
  • 服務一:order_service
$ curl http://192.168.6.131:3010/health
ok
複製程式碼
  • 服務二:user_service
$ curl http://192.168.6.131:3011/health
ok
複製程式碼

服務註冊

對order_service、user_service兩個服務在consul_4節點上進行服務定義,配置中包含了服務的名稱、地址、埠以及每10秒中對服務進行一次健康檢查。

  • 註冊服務一:order_service

order_service.json

{
    "service":{
        "name":"order_service",
        "address":"192.168.1.131",
        "port": 3010,
        "enable_tag_override": false,
        "check":{
            "deregisterCriticalServiceAfter":"90m",
            "http":"http://192.168.1.131:3010/health",
            "interval":"10s"
        }
    }
}
複製程式碼
  • 註冊服務二:user_service

user_service.json

{
    "service":{
        "name":"user_service",
        "address":"192.168.1.131",
        "port": 3011,
        "enable_tag_override": false,
        "check":{
            "deregisterCriticalServiceAfter":"90m",
            "http":"http://192.168.1.131:3011/health",
            "interval":"10s"
        }
    }
}
複製程式碼
  • 啟動consul_4進行服務註冊

Consul Agent啟動過程中通過指定-config-dir引數可以定位到配置檔案所在目錄,且目錄下檔案為.json的都會被Consul Agent配置檔案所讀取。

$ sudo consul agent -config-file=/usr/src/consul/consul_config.json -join=192.168.6.128 -config-dir=/etc/consul.d
複製程式碼

服務註冊成功之後檢視我們的Web管理介面,在consul_4中展示了我們上面定義的兩個服務及埠號

圖片描述

下圖為Web管理介面展示的健康檢查情況,可以看到進行了介面請求,且響應狀態為200,輸出結果為ok。

圖片描述

服務發現

Consul服務發現支援HTTP APIDNS兩種方式

  • HTTP API
$ curl http://192.168.6.128:8500/v1/catalog/service/order_service?passing=true
複製程式碼

執行命令之後返回Consul的註冊資訊、服務資訊及健康檢查資訊,且指定passing=true,表示返回時過濾掉一些不健康的節點。

[
    {
        "ID":"cf35869a-edba-5e1f-77e0-922b55ddfad4",
        "Node":"consul_4",
        "Address":"192.168.6.131",
        "Datacenter":"consul_cluster",
        "TaggedAddresses":{
            "lan":"192.168.6.131",
            "wan":"192.168.6.131"
        },
        "NodeMeta":{
            "consul-network-segment":""
        },
        "ServiceKind":"",
        "ServiceID":"order_service",
        "ServiceName":"order_service",
        "ServiceTags":[

        ],
        "ServiceAddress":"192.168.6.131",
        "ServiceWeights":{
            "Passing":1,
            "Warning":1
        },
        "ServiceMeta":{

        },
        "ServicePort":3010,
        "ServiceEnableTagOverride":false,
        "ServiceProxyDestination":"",
        "ServiceProxy":{

        },
        "ServiceConnect":{

        },
        "CreateIndex":3818,
        "ModifyIndex":3818
    }
]

複製程式碼
  • DNS方式

現在使用第二種DNS方式查詢具體的服務,Consul提供了預設的名字NAME.service.consul,NAME代指註冊的服務名稱。

對於上面註冊的兩個Web服務對應域名分別為order_service.service.consuluser_service.service.consul,下面先對於order_service.service.consul進行服務查詢

$ dig @192.168.6.128 -p 8600 order_service.service.consul        

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31324
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;order_service.service.consul.  IN      A

;; ANSWER SECTION:
order_service.service.consul. 0 IN      A       192.168.6.131

;; ADDITIONAL SECTION:
order_service.service.consul. 0 IN      TXT     "consul-network-segment="

;; Query time: 1 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 16:55:27 PDT 2019
;; MSG SIZE  rcvd: 109
複製程式碼

如上所示,ANSWER SECTION:一個A記錄返回了一個服務所在的節點IP地址為:192.168.6.131

為了展示更詳細的資訊,在dig命令中我們可以加上SRV引數,可以返回服務所在的節點資訊、埠號。

$ dig @192.168.6.128 -p 8600 order_service.service.consul SRV

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52707
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;order_service.service.consul.  IN      SRV

;; ANSWER SECTION:
order_service.service.consul. 0 IN      SRV     1 1 3010 consul_4.node.consul_cluster.consul.

;; ADDITIONAL SECTION:
consul_4.node.consul_cluster.consul. 0 IN A     192.168.6.131
consul_4.node.consul_cluster.consul. 0 IN TXT   "consul-network-segment="

;; Query time: 1 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 17:19:29 PDT 2019
;; MSG SIZE  rcvd: 164

複製程式碼

如上所示,ADDITIONAL SECTION:一個A記錄不止,返回了一個服務所在的節點IP地址為:192.168.6.131,還有節點名稱及資料中心,在ANSWER SECTION:中還可以看到服務的埠號資訊。

服務異常情況

現在我們來做些處理將consul_4節點上的order_service服務停掉,此時可以看到故障服務order_service已經不在當前結果列表頁了,保證了客戶端在服務發現過程中只能獲取當前可用的服務節點。

$ dig @192.168.6.128 -p 8600 order_service.service.consul                      

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45049
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;order_service.service.consul.  IN      A

;; AUTHORITY SECTION:
consul.                 0       IN      SOA     ns.consul. hostmaster.consul. 1553830680 3600 600 86400 0

;; Query time: 0 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 20:38:00 PDT 2019
;; MSG SIZE  rcvd: 107
複製程式碼

如上所示,已經沒有了ADDITIONAL SECTION:區域資訊。

再來看下在健康檢查端,列出了不健康的節點consul_4,標註了哪些是健康狀態和哪些是非正常狀態的服務。

圖片描述

點選consul_4可以看到詳細的健康檢查資訊結果,例如上面我們停掉的order_service服務返回連結被拒。

圖片描述

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

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

相關文章