欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang使用Consul詳解

 更新時(shí)間:2022年06月15日 10:04:08   作者:Small-K  
Consul是一個(gè)服務(wù)發(fā)現(xiàn)軟件, 提供了服務(wù)發(fā)現(xiàn)\鍵值存儲(chǔ)\健康檢查等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

常用指令

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ò)多贅述, 可以查閱官方文檔

Consul API

服務(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í)例

    這篇文章主要介紹了Go語(yǔ)言中Select語(yǔ)句用法,實(shí)例分析了select語(yǔ)句的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    Go語(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-03
  • 在go語(yǔ)言中安裝與使用protobuf的方法詳解

    在go語(yǔ)言中安裝與使用protobuf的方法詳解

    protobuf以前只支持C++, Python和Java等語(yǔ)言, Go語(yǔ)言出來(lái)后, 作為親兒子, 那有不支持的道理呢? 這篇文章主要給大家介紹了關(guān)于在go語(yǔ)言中使用protobuf的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • Golang map實(shí)踐及實(shí)現(xiàn)原理解析

    Golang map實(shí)踐及實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Golang map實(shí)踐以及實(shí)現(xiàn)原理,Go 語(yǔ)言中,通過(guò)哈希查找表實(shí)現(xiàn) map,用鏈表法解決哈希沖突,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • windows下使用GoLand生成proto文件的方法步驟

    windows下使用GoLand生成proto文件的方法步驟

    本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    這篇文章主要為大家介紹了Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法

    Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang排序和查找使用方法介紹

    Golang排序和查找使用方法介紹

    排序操作和查找一樣是很多程序經(jīng)常使用的操作。盡管一個(gè)最短的快排程序只要15行就可以搞定,但是一個(gè)健壯的實(shí)現(xiàn)需要更多的代碼,并且我們不希望每次我們需要的時(shí)候都重寫(xiě)或者拷貝這些代碼
    2022-12-12
  • Go語(yǔ)言利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列

    Go語(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

最新評(píng)論