Golang使用Consul詳解
常用指令
agent指令
- -bind=0.0.0.0 指定consul所在機(jī)器的ip地址
- -http-port 指定web接口服務(wù)端口
- -client 指定哪些機(jī)器可以訪問(wèn)consul, 0.0.0.0表示所有機(jī)器
- -data-dir=path 指定服務(wù)數(shù)據(jù)文件存儲(chǔ)位置
- -dev 開(kāi)發(fā)者模式,直接以默認(rèn)模式啟動(dòng)consul
- -node=hostname 服務(wù)發(fā)現(xiàn)的名字
- -rejoin consul啟動(dòng)的時(shí)候,加入到的consul集群
- -server 以服務(wù)方式開(kāi)啟server, 允許其他的consul連接到開(kāi)啟的consul上,不加則以客戶(hù)端方式開(kāi)啟
- -ui 可以誰(shuí)用web頁(yè)面來(lái)查看服務(wù)發(fā)現(xiàn)的詳情
- -config-dir 配置文件地址, 如果是文件夾會(huì)將所有文件合并,里面可以配置自己所在節(jié)點(diǎn)提供的服務(wù)
- -bootstrap-expect 在一個(gè)集群中期望提供的server節(jié)點(diǎn)數(shù)目,當(dāng)該值提供時(shí), consul一直等到達(dá)到指定的server數(shù)目才會(huì)參加選舉,推舉自己為leader。這個(gè)可以避免不一致和腦裂現(xiàn)象
啟動(dòng)
consul agent -server -bootstrap-expect 1 -ui -rejoin -http-port=8080 -bind="127.0.0.1" -data-dir C:\Windows\tmp
members
查看集群中有多少成員
info
查看當(dāng)前系欸但信息
leave
優(yōu)雅關(guān)閉consul
reload
重新加載配置文件
常用功能
Consul最重要的的功能就是定義服務(wù), 服務(wù)管理和健康檢查
定義服務(wù)
要定義一個(gè)服務(wù), 有兩種方式:
- 通過(guò)寫(xiě)配置文件, 讓Consul讀取
- 通過(guò)接口向Consul服務(wù)進(jìn)行注冊(cè)
一般我們采用第二種方式, 但我們可以通過(guò)第一種方式的書(shū)寫(xiě)規(guī)則來(lái)了解服務(wù)定義的一些選項(xiàng)
我們可以通過(guò)啟動(dòng)時(shí)指定-config-dir
來(lái)指定配置文件所在位置, 配置文件時(shí)json格式, 有多個(gè)會(huì)合并在一起
例子:
{ "service": { "name": "redis", // 在consul面板上顯示的服務(wù)名 "id": "redis", // 服務(wù)id, 一般通過(guò)服務(wù)id對(duì)服務(wù)進(jìn)行管理, 若不指定則會(huì)使用name作為id "address": "127.0.0.1", // 服務(wù)地址 "port": 80, // 服務(wù)運(yùn)行的端口 "tags": [ "primary" ], // 服務(wù)的標(biāo)簽, 可以作為服務(wù)的額外信息 // 服務(wù)健康檢查, 后面介紹 "checks": [ { "args": [ "/bin/check_redis", "-p", "7000" ], "interval": "30s", "timeout" : "60s" } ] } }
服務(wù)管理
所謂服務(wù)管理就是指服務(wù)發(fā)現(xiàn)\服務(wù)注冊(cè)\服務(wù)注銷(xiāo)
consul服務(wù)端均提供了相應(yīng)的http\dns等方式的接口可以方便地操作,
一般我們用go是用官方提供的一個(gè)api
庫(kù)進(jìn)行操作, 對(duì)這些http的接口就不再過(guò)多贅述, 可以查閱官方文檔
服務(wù)健康檢查
健康檢查是為了避免服務(wù)突然宕機(jī)而調(diào)用方不知道的情況發(fā)生, 原理就是隔一段時(shí)間通信一次
consul提供了 tcp\ssl\ttl\udp\script\http等多種方式來(lái)進(jìn)行健康檢查,可以在服務(wù)注冊(cè)時(shí)指定健康檢查的方式
consul根據(jù)interval
變量來(lái)決定多少時(shí)間間隔來(lái)通訊
根據(jù)timeout
變量來(lái)決定發(fā)送請(qǐng)求后多久未收到回應(yīng)算作失敗
這里我們介紹三種, http|tcp|script方式
http方式
{ "check": { "id": "api", "name": "HTTP API on port 5000", "http": "https://localhost:5000/health", //調(diào)用接口 "method": "POST", "header": { "Content-Type": ["application/json"] }, "body": "{\"method\":\"health\"}", "interval": "10s", // "timeout": "1s" } }
tcp方式
{ "check": { "id": "ssh", "name": "SSH TCP on port 22", "tcp": "localhost:22", "interval": "10s", "timeout": "1s" } }
script腳本方式
腳本方式略有不同,原理是通過(guò)調(diào)用腳本,查看腳本的返回值來(lái)判斷健康檢查是否通過(guò)
腳本退出代碼為 0 : 通過(guò)健康檢查
1 : 警告 其他: 健康檢查失敗
{ "check": { "id": "mem-util", "name": "Memory utilization", "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"], // 會(huì)被拼成 /usr/local/bin/check_mem.py -limit 256MB 來(lái)進(jìn)行調(diào)用 "interval": "10s", "timeout": "1s" } }
grpc方式
檢查grpc整個(gè)server狀態(tài)
{ "check": { "id": "mem-util", "name": "Service health status", "grpc": "127.0.0.1:12345", "grpc_use_tls": true, //是否使用tls, 默認(rèn)不使用 "interval": "10s" } }
只檢查服務(wù)器上的某一個(gè)服務(wù)
{ "check": { "id": "mem-util", "name": "Service health status", "grpc": "127.0.0.1:12345/my_service", "grpc_use_tls": true, "interval": "10s" } }
go使用官方api包來(lái)定義服務(wù)\查詢(xún)服務(wù)
console的github官網(wǎng)提供了一個(gè)go包操作consul服務(wù)端的實(shí)現(xiàn), 我們可以使用這個(gè)包來(lái)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
那么編寫(xiě)一個(gè)使用consul注冊(cè)服務(wù)的服務(wù)端程序的核心邏輯是這樣:
- 創(chuàng)建consul客戶(hù)端
- 使用創(chuàng)建的consul客戶(hù)端連接相應(yīng)的consul agent
- 向consul注冊(cè)服務(wù)
- 運(yùn)行服務(wù)
- 運(yùn)行完畢后向consul注銷(xiāo)服務(wù)
示例代碼:
package main import ( "log" "net" "github.com/hashicorp/consul/api" ) func main() { // 使用默認(rèn)配置創(chuàng)建consul客戶(hù)端 consulClient, err := api.NewClient(api.DefaultConfig()) if err != nil { log.Fatal(err) } // 注冊(cè)服務(wù) // consulClient.Agent()先獲取當(dāng)前機(jī)器上的consul agent節(jié)點(diǎn) consulClient.Agent().ServiceRegister(&api.AgentServiceRegistration{ ID: "MyService", Name: "My Service", Address: "127.0.0.1", Port: 5050, Check: &api.AgentServiceCheck{ CheckID: "MyService", TCP: "127.0.0.1:5050", Interval: "10s", Timeout: "1s", }, }) // 運(yùn)行完成后注銷(xiāo)服務(wù) defer consulClient.Agent().ServiceDeregister("MyService") l, err := net.Listen("tcp", ":5050") if err != nil { log.Fatal(err) } for { conn, err := l.Accept() if err != nil { log.Fatal(err) } go func() { log.Printf("Ip: %s connected", conn.RemoteAddr().String()) }() } }
我們通過(guò)tcp每10秒進(jìn)行健康檢查, 輸出窗口每10秒就會(huì)輸出有新連接到來(lái), 這是consul做的
$ go run .
2022/06/09 20:17:51 Ip: 127.0.0.1:53011 connected
2022/06/09 20:18:01 Ip: 127.0.0.1:53038 connected
2022/06/09 20:18:11 Ip: 127.0.0.1:53045 connected
那么服務(wù)的請(qǐng)求端(客戶(hù)端)需要通過(guò)consul來(lái)獲取服務(wù)的地址和端口,則需要這么幾步:
- 創(chuàng)建consul客戶(hù)端
- 使用創(chuàng)建的consul客戶(hù)端連接相應(yīng)的consul agent
- 向consul請(qǐng)求相應(yīng)服務(wù)id的注冊(cè)信息
- 如果獲取到了相應(yīng)的注冊(cè)信息, 就通過(guò)地址和端口請(qǐng)求服務(wù)
代碼示例:
package main import ( "fmt" "log" "github.com/hashicorp/consul/api" ) func main() { consulClient, err := api.NewClient(api.DefaultConfig()) if err != nil { log.Fatal(err) } service, _, err := consulClient.Agent().Service("MyService", nil) if err != nil { log.Fatal(err) } fmt.Printf("Got Service: ip-%s, port-%d", service.Address, service.Port) }
保證服務(wù)端運(yùn)行的情況運(yùn)行客戶(hù)端:
$ go run .
Got Service: ip-127.0.0.1, port-5050
Consul使用Raft算法保證集群一致性
到此這篇關(guān)于Golang使用Consul詳解的文章就介紹到這了,更多相關(guān)Golang Consul內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言中Select語(yǔ)句用法實(shí)例
這篇文章主要介紹了Go語(yǔ)言中Select語(yǔ)句用法,實(shí)例分析了select語(yǔ)句的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑
今天小編就為大家分享一篇關(guān)于Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Golang map實(shí)踐及實(shí)現(xiàn)原理解析
這篇文章主要介紹了Golang map實(shí)踐以及實(shí)現(xiàn)原理,Go 語(yǔ)言中,通過(guò)哈希查找表實(shí)現(xiàn) map,用鏈表法解決哈希沖突,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06windows下使用GoLand生成proto文件的方法步驟
本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)
這篇文章主要為大家介紹了Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Go語(yǔ)言利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中heap的使用以及如何利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05