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

go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解

 更新時(shí)間:2022年05月19日 10:16:42   作者:dz45693  
這篇文章主要為大家介紹了go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

使用consul四大特性

1. 服務(wù)發(fā)現(xiàn):利用服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)功能來實(shí)現(xiàn)服務(wù)治理。

2. 健康檢查:利用consul注冊(cè)的檢查檢查函數(shù)或腳本來判斷服務(wù)是否健康,若服務(wù)不存在則從注冊(cè)中心移除該服務(wù),減少故障服務(wù)請(qǐng)求。

3. k/v數(shù)據(jù)存儲(chǔ):存儲(chǔ)kv數(shù)據(jù),可以作為服務(wù)配置中心來使用。

4. 多數(shù)據(jù)中心:可以建立多個(gè)consul集群通過inter網(wǎng)絡(luò)進(jìn)行互聯(lián),進(jìn)一步保證數(shù)據(jù)可用性。

通過docker安裝consul

docker pull consul:latest
//運(yùn)行單機(jī)
docker run -d --restart=always --name consul -d -p 8500:8500 consul
/*
8500 http 端口,用于 http 接口和 web ui
8300 server rpc 端口,同一數(shù)據(jù)中心 consul server 之間通過該端口通信
8301 serf lan 端口,同一數(shù)據(jù)中心 consul client 通過該端口通信
8302 serf wan 端口,不同數(shù)據(jù)中心 consul server 通過該端口通信
8600 dns 端口,用于服務(wù)發(fā)現(xiàn)
-bbostrap-expect 2: 集群至少兩臺(tái)服務(wù)器,才能選舉集群leader
-ui:運(yùn)行 web 控制臺(tái)
-bind: 監(jiān)聽網(wǎng)口,0.0.0.0 表示所有網(wǎng)口,如果不指定默認(rèn)未127.0.0.1,則無法和容器通信
-client : 限制某些網(wǎng)口可以訪問
*/
//集群
docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:latest agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0
docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2
docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2

實(shí)現(xiàn)代碼

以下代碼實(shí)現(xiàn)一個(gè)服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn),配置共享的功能:

package main
import (
    "net"
    "github.com/gin-gonic/gin"
    "fmt"
    "log"
    "net/http"
    consulapi "github.com/hashicorp/consul/api"
)
const (
    consulAddress = "192.168.100.19:8500"
    serviceId     = "111"
)
func main() {
    r := gin.Default()
    // consul健康檢查回調(diào)函數(shù)
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "ok",
        })
    })
    go http.ListenAndServe(":8081", r)
    // 注冊(cè)服務(wù)到consul
    ConsulRegister()
    // 從consul中發(fā)現(xiàn)服務(wù)
    ConsulFindServer()
    ConsulCheckHeath()
    ConsulKVTest()
    // 取消consul注冊(cè)的服務(wù)
    //ConsulDeRegister()
    var str string
    fmt.Scan(&str)
}
// 注冊(cè)服務(wù)到consul
func ConsulRegister() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 創(chuàng)建注冊(cè)到consul的服務(wù)到
    registration := new(consulapi.AgentServiceRegistration)
    registration.ID = serviceId                    // 服務(wù)節(jié)點(diǎn)的名稱
    registration.Name = "go-consul-test"           // 服務(wù)名稱
    registration.Port = 8081                       // 服務(wù)端口
    registration.Tags = []string{"go-consul-test"} // tag,可以為空
    registration.Address = "192.168.3.42"          // 服務(wù) IP 要確保consul可以訪問這個(gè)ip
    // 增加consul健康檢查回調(diào)函數(shù)
    check := new(consulapi.AgentServiceCheck)
    check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
    check.Timeout = "5s"
    check.Interval = "5s"                        // 健康檢查間隔
    check.DeregisterCriticalServiceAfter = "30s" // 故障檢查失敗30s后 consul自動(dòng)將注冊(cè)服務(wù)刪除
    registration.Check = check
    // 注冊(cè)服務(wù)到consul
    err = client.Agent().ServiceRegister(registration)
    if err == nil {
        fmt.Println("ConsulRegister done")
    }
}
// 取消consul注冊(cè)的服務(wù)
func ConsulDeRegister() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    client.Agent().ServiceDeregister(serviceId)
}
// 從consul中發(fā)現(xiàn)服務(wù)
func ConsulFindServer() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 獲取所有service
    services, _ := client.Agent().Services()
    for _, value := range services {
        fmt.Println("address:", value.Address)
        fmt.Println("port:", value.Port)
    }
    fmt.Println("=================================")
    // 獲取指定service
    service, _, err := client.Agent().Service(serviceId, nil)
    if err == nil {
        fmt.Println("address:", service.Address)
        fmt.Println("port:", service.Port)
    }
    if err == nil {
        fmt.Println("ConsulFindServer done")
    }
}
func ConsulCheckHeath() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // 健康檢查
    a, b, _ := client.Agent().AgentHealthServiceByID(serviceId)
    fmt.Println("val1:", a)
    fmt.Println("val2:", b)
    fmt.Println("ConsulCheckHeath done")
}
func ConsulKVTest() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        log.Fatal("consul client error : ", err)
    }
    // KV, put值
    values := "test"
    key := "go-consul-test"
    client.KV().Put(&consulapi.KVPair{Key: key, Flags: 0, Value: []byte(values)}, nil)
    // KV get值
    data, _, _ := client.KV().Get(key, nil)
    fmt.Println("data:", string(data.Value))
    // KV list
    datas, _, _ := client.KV().List("go", nil)
    for _, value := range datas {
        fmt.Println("val:", value)
    }
    keys, _, _ := client.KV().Keys("go", "", nil)
    fmt.Println("key:", keys)
    fmt.Println("ConsulKVTest done")
}
func localIP() string {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        return ""
    }
    for _, address := range addrs {
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                return ipnet.IP.String()
            }
        }
    }
    return ""
}

運(yùn)行結(jié)果

以上就是go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于go consul服務(wù)發(fā)現(xiàn)配置共享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang分布式應(yīng)用之Redis示例詳解

    Golang分布式應(yīng)用之Redis示例詳解

    這篇文章主要為大家介紹了Golang分布式應(yīng)用之Redis示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • GO語言實(shí)現(xiàn)日志切割的示例詳解

    GO語言實(shí)現(xiàn)日志切割的示例詳解

    日志記錄對(duì)程序排查問題比較關(guān)鍵,所以本文將選擇Logrus和lumberjack兩個(gè)庫進(jìn)行日志切割以及記錄調(diào)用源,感興趣的小伙伴可以了解一下
    2023-07-07
  • 一文帶你深入了解Go語言中的事務(wù)

    一文帶你深入了解Go語言中的事務(wù)

    事務(wù)中止時(shí),你結(jié)束事務(wù)了嗎?在開發(fā)時(shí)有可能就會(huì)犯這樣的錯(cuò)誤,其問題就是你在提交事務(wù)時(shí),如果中間有其他業(yè)務(wù)就取消操作,那么事務(wù)也關(guān)閉了嗎?本文就來詳細(xì)講講
    2023-04-04
  • Golang中Kafka的重復(fù)消費(fèi)和消息丟失問題的解決方案

    Golang中Kafka的重復(fù)消費(fèi)和消息丟失問題的解決方案

    在Kafka中無論是生產(chǎn)者發(fā)送消息到Kafka集群還是消費(fèi)者從Kafka集群中拉取消息,都是容易出現(xiàn)問題的,比較典型的就是消費(fèi)端的重復(fù)消費(fèi)問題、生產(chǎn)端和消費(fèi)端產(chǎn)生的消息丟失問題,下面將對(duì)這兩個(gè)問題出現(xiàn)的場(chǎng)景以及常見的解決方案進(jìn)行講解
    2023-08-08
  • Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置

    Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置

    這篇文章主要介紹了Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下
    2016-02-02
  • Go語言sync.Pool對(duì)象池使用場(chǎng)景基本示例

    Go語言sync.Pool對(duì)象池使用場(chǎng)景基本示例

    這篇文章主要為大家介紹了Go語言sync.Pool對(duì)象池使用場(chǎng)景的基本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 如何編寫Go語言中間件的實(shí)例教程

    如何編寫Go語言中間件的實(shí)例教程

    不知道大家有沒有寫過中間件呢,它是怎么寫的呢?下面這篇文中就來給大家分享一下使用Go,如何編寫中間件,文中通過示例代碼介紹的非常詳細(xì),供大家參考學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線)

    Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線)

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    libtask一個(gè)C語言的協(xié)程庫,是go語言的前身很早期的原型. 測(cè)試機(jī)器是我的mac air 安裝的centos虛擬機(jī)(只有一個(gè)核), 代碼沒有采用任何優(yōu)化,只是使用默認(rèn)配置
    2022-12-12
  • 如何在Go中使用Casbin進(jìn)行訪問控制

    如何在Go中使用Casbin進(jìn)行訪問控制

    這篇文章主要介紹了如何在Go中使用Casbin進(jìn)行訪問控制,Casbin是一個(gè)強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,Casbin只負(fù)責(zé)訪問控制
    2022-08-08

最新評(píng)論