最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang使用Consul詳解

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

常用指令

agent指令

  • -bind=0.0.0.0 指定consul所在機器的ip地址
  • -http-port 指定web接口服務端口
  • -client 指定哪些機器可以訪問consul, 0.0.0.0表示所有機器
  • -data-dir=path 指定服務數(shù)據(jù)文件存儲位置
  • -dev 開發(fā)者模式,直接以默認模式啟動consul
  • -node=hostname 服務發(fā)現(xiàn)的名字
  • -rejoin consul啟動的時候,加入到的consul集群
  • -server 以服務方式開啟server, 允許其他的consul連接到開啟的consul上,不加則以客戶端方式開啟
  • -ui 可以誰用web頁面來查看服務發(fā)現(xiàn)的詳情
  • -config-dir 配置文件地址, 如果是文件夾會將所有文件合并,里面可以配置自己所在節(jié)點提供的服務
  • -bootstrap-expect 在一個集群中期望提供的server節(jié)點數(shù)目,當該值提供時, 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

查看當前系欸但信息

leave

優(yōu)雅關閉consul

reload

重新加載配置文件

常用功能

Consul最重要的的功能就是定義服務, 服務管理和健康檢查

定義服務

要定義一個服務, 有兩種方式:

  • 通過寫配置文件, 讓Consul讀取
  • 通過接口向Consul服務進行注冊

一般我們采用第二種方式, 但我們可以通過第一種方式的書寫規(guī)則來了解服務定義的一些選項

我們可以通過啟動時指定-config-dir來指定配置文件所在位置, 配置文件時json格式, 有多個會合并在一起

例子:

{
    "service": {
        "name": "redis", // 在consul面板上顯示的服務名
        "id": "redis", // 服務id, 一般通過服務id對服務進行管理, 若不指定則會使用name作為id
        "address": "127.0.0.1", // 服務地址
        "port": 80, // 服務運行的端口
        "tags": [
            "primary"
        ], // 服務的標簽, 可以作為服務的額外信息
        //   服務健康檢查, 后面介紹
        "checks": [
            {
                "args": [
                    "/bin/check_redis",
                    "-p",
                    "7000"
                ],
                "interval": "30s",
                "timeout" : "60s"
            }
        ]
    }
}

服務管理

所謂服務管理就是指服務發(fā)現(xiàn)\服務注冊\服務注銷

consul服務端均提供了相應的http\dns等方式的接口可以方便地操作,

一般我們用go是用官方提供的一個api庫進行操作, 對這些http的接口就不再過多贅述, 可以查閱官方文檔

Consul API

服務健康檢查

健康檢查是為了避免服務突然宕機而調(diào)用方不知道的情況發(fā)生, 原理就是隔一段時間通信一次

consul提供了 tcp\ssl\ttl\udp\script\http等多種方式來進行健康檢查,可以在服務注冊時指定健康檢查的方式

consul根據(jù)interval變量來決定多少時間間隔來通訊

根據(jù)timeout變量來決定發(fā)送請求后多久未收到回應算作失敗

這里我們介紹三種, 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"
  }
}

只檢查服務器上的某一個服務

{
  "check": {
    "id": "mem-util",
    "name": "Service health status",
    "grpc": "127.0.0.1:12345/my_service",
    "grpc_use_tls": true,
    "interval": "10s"
  }
}

go使用官方api包來定義服務\查詢服務

console的github官網(wǎng)提供了一個go包操作consul服務端的實現(xiàn), 我們可以使用這個包來實現(xiàn)服務發(fā)現(xiàn)

那么編寫一個使用consul注冊服務的服務端程序的核心邏輯是這樣:

  • 創(chuàng)建consul客戶端
  • 使用創(chuàng)建的consul客戶端連接相應的consul agent
  • 向consul注冊服務
  • 運行服務
  • 運行完畢后向consul注銷服務

示例代碼:

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)
	}
	// 注冊服務
	// consulClient.Agent()先獲取當前機器上的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",
		},
	})
	// 運行完成后注銷服務
	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 

那么服務的請求端(客戶端)需要通過consul來獲取服務的地址和端口,則需要這么幾步:

  • 創(chuàng)建consul客戶端
  • 使用創(chuàng)建的consul客戶端連接相應的consul agent
  • 向consul請求相應服務id的注冊信息
  • 如果獲取到了相應的注冊信息, 就通過地址和端口請求服務

代碼示例:

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)
}

保證服務端運行的情況運行客戶端:

$ go run .
Got Service: ip-127.0.0.1, port-5050

Consul使用Raft算法保證集群一致性

到此這篇關于Golang使用Consul詳解的文章就介紹到這了,更多相關Golang Consul內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang MarshalJson的實現(xiàn)

    golang MarshalJson的實現(xiàn)

    本文主要介紹了golang MarshalJson的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • Go 類型轉換工具包strconv包的用法

    Go 類型轉換工具包strconv包的用法

    Go 語言的?strconv?包提供了用于基本數(shù)據(jù)類型之間轉換的函數(shù),本文主要介紹了Go 類型轉換工具包strconv包的用法,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • go語言中數(shù)據(jù)接口set集合的實現(xiàn)

    go語言中數(shù)據(jù)接口set集合的實現(xiàn)

    set集合是一種常見的數(shù)據(jù)結構,它代表了一個唯一元素的集合,本文主要介紹了set的基本特性,包括唯一性、無序性、可變性和集合運算,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • 深入了解Golang為什么需要超時控制

    深入了解Golang為什么需要超時控制

    本文將介紹為什么需要超時控制,然后詳細介紹Go語言中實現(xiàn)超時控制的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • Golang編寫自定義IP限流中間件的方法詳解

    Golang編寫自定義IP限流中間件的方法詳解

    這篇文章給大家詳細的介紹了Golang編寫自定義IP限流中間件的方法,文章通過代碼實例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • GO語言獲取系統(tǒng)環(huán)境變量的方法

    GO語言獲取系統(tǒng)環(huán)境變量的方法

    這篇文章主要介紹了GO語言獲取系統(tǒng)環(huán)境變量的方法,實例分析了Getenv方法操作環(huán)境變量的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 詳解golang中make與new的異同點和用法

    詳解golang中make與new的異同點和用法

    這篇文章將給大家介紹了go語言中函數(shù)new與make的使用和區(qū)別,關于go語言中new和make是內(nèi)建的兩個函數(shù),主要用來創(chuàng)建分配類型內(nèi)存,文中通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-01-01
  • Go語言的管道Channel用法實例

    Go語言的管道Channel用法實例

    這篇文章主要介紹了Go語言的管道Channel用法,實例分析了Go語言中管道的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang實現(xiàn)KV存儲引擎實例探究

    Golang實現(xiàn)KV存儲引擎實例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)KV存儲引擎實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 使用Go語言解決Scan空格結束輸入問題

    使用Go語言解決Scan空格結束輸入問題

    這篇文章主要為大家介紹了使用Go語言來解決Scan空格結束輸入問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11

最新評論

铜梁县| 华蓥市| 安平县| 平阳县| 哈巴河县| 台江县| 盈江县| 安平县| 盈江县| 崇左市| 巫山县| 赤壁市| 荥阳市| 淮北市| 新龙县| 高密市| 白朗县| 郯城县| 唐海县| 龙岩市| 西充县| 德令哈市| 若尔盖县| 东莞市| 望都县| 绍兴县| 腾冲县| 永泰县| 鄢陵县| 长乐市| 巴彦淖尔市| 松溪县| 齐河县| 正蓝旗| 通许县| 民和| 顺平县| 吉木乃县| 越西县| 周宁县| 浮梁县|