Golang使用Consul詳解
常用指令
agent指令
- -bind=0.0.0.0 指定consul所在機器的ip地址
- -http-port 指定web接口服務(wù)端口
- -client 指定哪些機器可以訪問consul, 0.0.0.0表示所有機器
- -data-dir=path 指定服務(wù)數(shù)據(jù)文件存儲位置
- -dev 開發(fā)者模式,直接以默認模式啟動consul
- -node=hostname 服務(wù)發(fā)現(xiàn)的名字
- -rejoin consul啟動的時候,加入到的consul集群
- -server 以服務(wù)方式開啟server, 允許其他的consul連接到開啟的consul上,不加則以客戶端方式開啟
- -ui 可以誰用web頁面來查看服務(wù)發(fā)現(xiàn)的詳情
- -config-dir 配置文件地址, 如果是文件夾會將所有文件合并,里面可以配置自己所在節(jié)點提供的服務(wù)
- -bootstrap-expect 在一個集群中期望提供的server節(jié)點數(shù)目,當(dāng)該值提供時, consul一直等到達到指定的server數(shù)目才會參加選舉,推舉自己為leader。這個可以避免不一致和腦裂現(xiàn)象
啟動
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ù)
要定義一個服務(wù), 有兩種方式:
- 通過寫配置文件, 讓Consul讀取
- 通過接口向Consul服務(wù)進行注冊
一般我們采用第二種方式, 但我們可以通過第一種方式的書寫規(guī)則來了解服務(wù)定義的一些選項
我們可以通過啟動時指定-config-dir來指定配置文件所在位置, 配置文件時json格式, 有多個會合并在一起
例子:
{
"service": {
"name": "redis", // 在consul面板上顯示的服務(wù)名
"id": "redis", // 服務(wù)id, 一般通過服務(wù)id對服務(wù)進行管理, 若不指定則會使用name作為id
"address": "127.0.0.1", // 服務(wù)地址
"port": 80, // 服務(wù)運行的端口
"tags": [
"primary"
], // 服務(wù)的標簽, 可以作為服務(wù)的額外信息
// 服務(wù)健康檢查, 后面介紹
"checks": [
{
"args": [
"/bin/check_redis",
"-p",
"7000"
],
"interval": "30s",
"timeout" : "60s"
}
]
}
}
服務(wù)管理
所謂服務(wù)管理就是指服務(wù)發(fā)現(xiàn)\服務(wù)注冊\服務(wù)注銷
consul服務(wù)端均提供了相應(yīng)的http\dns等方式的接口可以方便地操作,
一般我們用go是用官方提供的一個api庫進行操作, 對這些http的接口就不再過多贅述, 可以查閱官方文檔
服務(wù)健康檢查
健康檢查是為了避免服務(wù)突然宕機而調(diào)用方不知道的情況發(fā)生, 原理就是隔一段時間通信一次
consul提供了 tcp\ssl\ttl\udp\script\http等多種方式來進行健康檢查,可以在服務(wù)注冊時指定健康檢查的方式
consul根據(jù)interval變量來決定多少時間間隔來通訊
根據(jù)timeout變量來決定發(fā)送請求后多久未收到回應(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腳本方式
腳本方式略有不同,原理是通過調(diào)用腳本,查看腳本的返回值來判斷健康檢查是否通過
腳本退出代碼為 0 : 通過健康檢查
1 : 警告 其他: 健康檢查失敗
{
"check": {
"id": "mem-util",
"name": "Memory utilization",
"args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"], // 會被拼成 /usr/local/bin/check_mem.py -limit 256MB 來進行調(diào)用
"interval": "10s",
"timeout": "1s"
}
}
grpc方式
檢查grpc整個server狀態(tài)
{
"check": {
"id": "mem-util",
"name": "Service health status",
"grpc": "127.0.0.1:12345",
"grpc_use_tls": true, //是否使用tls, 默認不使用
"interval": "10s"
}
}
只檢查服務(wù)器上的某一個服務(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包來定義服務(wù)\查詢服務(wù)
console的github官網(wǎng)提供了一個go包操作consul服務(wù)端的實現(xiàn), 我們可以使用這個包來實現(xiàn)服務(wù)發(fā)現(xiàn)
那么編寫一個使用consul注冊服務(wù)的服務(wù)端程序的核心邏輯是這樣:
- 創(chuàng)建consul客戶端
- 使用創(chuàng)建的consul客戶端連接相應(yīng)的consul agent
- 向consul注冊服務(wù)
- 運行服務(wù)
- 運行完畢后向consul注銷服務(wù)
示例代碼:
package main
import (
"log"
"net"
"github.com/hashicorp/consul/api"
)
func main() {
// 使用默認配置創(chuàng)建consul客戶端
consulClient, err := api.NewClient(api.DefaultConfig())
if err != nil {
log.Fatal(err)
}
// 注冊服務(wù)
// consulClient.Agent()先獲取當(dāng)前機器上的consul agent節(jié)點
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",
},
})
// 運行完成后注銷服務(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())
}()
}
}
我們通過tcp每10秒進行健康檢查, 輸出窗口每10秒就會輸出有新連接到來, 這是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ù)的請求端(客戶端)需要通過consul來獲取服務(wù)的地址和端口,則需要這么幾步:
- 創(chuàng)建consul客戶端
- 使用創(chuàng)建的consul客戶端連接相應(yīng)的consul agent
- 向consul請求相應(yīng)服務(wù)id的注冊信息
- 如果獲取到了相應(yī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ù)端運行的情況運行客戶端:
$ go run .
Got Service: ip-127.0.0.1, port-5050
Consul使用Raft算法保證集群一致性
到此這篇關(guān)于Golang使用Consul詳解的文章就介紹到這了,更多相關(guān)Golang Consul內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows下使用GoLand生成proto文件的方法步驟
本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解
這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

