在進行服務註冊之前先確認叢集是否建立,關於服務註冊可以看上篇微服務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 API
和DNS
兩種方式
- 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.consul
和user_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技術棧