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

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基于Mutex實(shí)現(xiàn)可重入鎖

    golang基于Mutex實(shí)現(xiàn)可重入鎖

    鎖可重入也就是當(dāng)前已經(jīng)獲取到鎖的goroutine繼續(xù)調(diào)用Lock方法獲取鎖,Go標(biāo)準(zhǔn)庫中提供了sync.Mutex實(shí)現(xiàn)了排他鎖,但并不是可重入的,所以本文給大家介紹了golang基于Mutex實(shí)現(xiàn)可重入鎖,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-03-03
  • go語言中函數(shù)的用法示例詳解

    go語言中函數(shù)的用法示例詳解

    Go語言中函數(shù)是基本的代碼組織單元,用于封裝一段代碼,使代碼結(jié)構(gòu)更清晰、可復(fù)用,本文詳細(xì)講解了基本函數(shù)定義、參數(shù)傳遞、返回值、多返回值、匿名函數(shù)、遞歸和defer語句的使用,感興趣的朋友一起看看吧
    2024-10-10
  • Go語言生成素?cái)?shù)的方法

    Go語言生成素?cái)?shù)的方法

    這篇文章主要介紹了Go語言生成素?cái)?shù)的方法,實(shí)例分析了Go語言生成素?cái)?shù)的技巧,需要的朋友可以參考下
    2015-03-03
  • Golang必知必會(huì)之Go?Mod命令詳解

    Golang必知必會(huì)之Go?Mod命令詳解

    go mod可以使項(xiàng)目從GOPATH的強(qiáng)制依賴中獨(dú)立出來,也就是說你的項(xiàng)目依賴不再需要放在在GOPATH下面了,下面這篇文章主要給大家介紹了關(guān)于Golang必知必會(huì)之Go?Mod命令的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 基于Golang實(shí)現(xiàn)延遲隊(duì)列(DelayQueue)

    基于Golang實(shí)現(xiàn)延遲隊(duì)列(DelayQueue)

    延遲隊(duì)列是一種特殊的隊(duì)列,元素入隊(duì)時(shí)需要指定到期時(shí)間(或延遲時(shí)間),從隊(duì)頭出隊(duì)的元素必須是已經(jīng)到期的。本文將用Golang實(shí)現(xiàn)延遲隊(duì)列,感興趣的可以了解下
    2022-09-09
  • Go語言等待組sync.WaitGrou的使用示例

    Go語言等待組sync.WaitGrou的使用示例

    本文主要介紹了Go語言等待組sync.WaitGrou的使用示例,sync.WaitGroup只有3個(gè)方法,Add(),Done(),Wait(),下面就來具體的介紹一下如何使用,感興趣的可以了解一下
    2024-08-08
  • Golang map實(shí)現(xiàn)原理深入分析

    Golang map實(shí)現(xiàn)原理深入分析

    map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng),需要的朋友可以參考下
    2023-01-01
  • Beego AutoRouter工作原理解析

    Beego AutoRouter工作原理解析

    這篇文章主要為大家介紹了Beego AutoRouter工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語言基礎(chǔ)函數(shù)包的使用學(xué)習(xí)

    Go語言基礎(chǔ)函數(shù)包的使用學(xué)習(xí)

    本文通過一個(gè)實(shí)現(xiàn)加減乘除運(yùn)算的小程序來介紹go函數(shù)的使用,以及使用函數(shù)的注意事項(xiàng),并引出了對(duì)包的了解和使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解golang中make與new的異同點(diǎn)和用法

    詳解golang中make與new的異同點(diǎn)和用法

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

最新評(píng)論

仁布县| 开阳县| 博客| 葵青区| 宿松县| 滨州市| 益阳市| 九江县| 池州市| 衢州市| 靖宇县| 阿勒泰市| 岚皋县| 成都市| 社旗县| 宁德市| 时尚| 梓潼县| 丰镇市| 邻水| 兴安盟| 石渠县| 侯马市| 万州区| 临猗县| 西平县| 陇西县| 长兴县| 富宁县| 通州市| 昂仁县| 左云县| 旌德县| 阳东县| 民乐县| 霍山县| 西峡县| 宁明县| 巴青县| 肇东市| 平度市|