欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

consul服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)的巨坑-創(chuàng)新互聯(lián)

最近使用consul作為項(xiàng)目的服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)的基礎(chǔ)功能。在塔建集群使用中遇到一些坑,下面一個(gè)個(gè)的記錄下來(lái)。

成都創(chuàng)新互聯(lián)是一家以網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站推廣、小程序App開(kāi)發(fā)等移動(dòng)開(kāi)發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都雨棚定制等眾行業(yè)中小客戶(hù)提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開(kāi)發(fā)服務(wù)。

consul集群多node

consul集群的node也就是我們所說(shuō)的consul實(shí)例。集群由多個(gè)node組成,為了集群的可用性,需要超過(guò)半數(shù)的node啟用server。如5個(gè)node中建議3個(gè)啟用server模式,3個(gè)node組成的集群就2個(gè)node啟用server模式。
看到這里的時(shí)候你一定覺(jué)得沒(méi)有什么問(wèn)題呀,但是consul坑就是多。加入你的集群組成如下:

Node          Address              Status  Type    Build  Protocol  DC                    Segment
BJ-MQTEST-01  10.163.145.117:8301  alive   server  1.0.6  2         iget-topology-aliyun  <all>
BJ-MQTEST-02  10.163.147.47:8301   alive   server  1.0.6  2         iget-topology-aliyun  <all>
BJ-TGO-01     10.163.145.110:8301     alive   client  1.0.6  2         iget-topology-aliyun  <default>

那么client可以使用上述的3個(gè)ip連接到consul集群,假設(shè)client A使用使用10.163.145.117注冊(cè)了service,重啟后使用地址10.163.145.110注冊(cè)之前的service信息,此時(shí)你就會(huì)驚喜的發(fā)現(xiàn),UI可以同時(shí)看到在同一個(gè)servicename下存在兩個(gè)相同的serviceid。

這就是consul集群多node的坑,因?yàn)閟ervice底層雖然使用了KV存儲(chǔ),但是service的KEY與serviceid無(wú)關(guān),所以在集群中可以重復(fù)。

解決方案一

集群中只有一個(gè)node使用server模式,其他的都是client模式。缺點(diǎn)很明顯,如果server的node掛了,那么集群的可用性就沒(méi)有了。

解決方案二

相同的客戶(hù)端使用相同的node地址,這樣就可以確保同一個(gè)servicename下不存在兩個(gè)相同的serviceid。缺點(diǎn)是如果客戶(hù)端綁定的node掛了,那么client就不能使用。
代碼給出

package registry

import (
    "fmt"
    "math"
    "net"
    "sort"
    "strings"

    log "github.com/golang/glog"
)

type ConsulBind struct {
    Addr  string
    IpInt float64
}
type ConsulBindList []ConsulBind

func (s ConsulBindList) Len() int {
    return len(s)
}
func (s ConsulBindList) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s ConsulBindList) Less(i, j int) bool {
    return s[i].IpInt < s[j].IpInt
}
func (s ConsulBindList) ToStrings() []string {
    ret := make([]string, 0, len(s))
    for _, cbl := range s {
        ret = append(ret, cbl.Addr)
    }
    return ret
}

func BingConsulSort(consulAddrs []string) []string {
    localIpStr, err := GetAgentLocalIP()
    if err != nil {
        return consulAddrs
    }
    localIp := net.ParseIP(localIpStr)
    localIpInt := int64(0)
    if localIp != nil {
        localIpInt = util.InetAton(localIp)
    }
    addrslist := make([]ConsulBind, 0, len(consulAddrs))
    for _, addr := range consulAddrs {
        ads := strings.Split(addr, ":")
        if len(ads) == 2 {
            ip := net.ParseIP(ads[0])
            if ip != nil {
                ipInt := util.InetAton(ip)
                fmt.Println("ip:", ip, ipInt, localIpInt, (ipInt - localIpInt))
                addrslist = append(addrslist, ConsulBind{
                    Addr:  addr,
                    IpInt: math.Abs(float64(ipInt - localIpInt)),
                })
            }
        }
    }
    consulBindList := ConsulBindList(addrslist)
    sort.Sort(consulBindList)
    log.Infof("sort addrs %v", consulBindList)
    return consulBindList.ToStrings()
}

解決方案三

客戶(hù)端隨機(jī)使用集群中的任意一個(gè)地址,但是注冊(cè)之前先判斷該servicename是否已經(jīng)存在要注冊(cè)的serviceid了,如果存在就刪除重新注冊(cè)。缺點(diǎn)就是watch會(huì)有較多事件,可以升級(jí)為如果存在并且是健康的就不允許重復(fù)注冊(cè),我使用的就是該方案。

刪除service

一開(kāi)始很多人都會(huì)覺(jué)得服務(wù)出現(xiàn)問(wèn)題了下架了掛了,那么就會(huì)被移出了。但是在consul中刪除service沒(méi)有那么簡(jiǎn)單!
請(qǐng)查看官網(wǎng)文檔:
catalog文檔
consul服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)的巨坑
agent/service文檔
consul服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)的巨坑

看著似乎任選一個(gè)就可以做到正確刪除service了!可以繼續(xù)說(shuō)一聲,沒(méi)有那么簡(jiǎn)單,consul的坑就是多。

選擇了/agent/service/deregister/:service_id接口,會(huì)發(fā)現(xiàn)你無(wú)法刪除別的node的service。比如10.163.145.117中有個(gè)serviceid為agent_xxxx_v1,但是客戶(hù)端連接consul使用的IP為10.163.145.110,那么就無(wú)法刪除掉agent_xxxx_v1

沒(méi)事不是還有一個(gè)接口沒(méi)有使用嗎?再來(lái)看看/catalog/deregister,執(zhí)行完成后看了UI,嗯嗯的確是刪除了agent_xxxx_v1。等等。。。 。。。 30s后發(fā)現(xiàn)agent_xxxx_v1又出現(xiàn)了,這是怎么回事????

請(qǐng)查看consul的bugUnable to deregister a service #1188。

解決方案

第一步:查詢(xún)出serviceid所屬的servicename所有的列表;
第二步:遍歷列表獲取到node的地址后刪除所有的serviceid;

if len(c.Options.Addrs) > 0 {
        addrMap := make(map[string]string, len(c.Options.Addrs))
        for _, host := range c.Options.Addrs {
            addr, _, err := net.SplitHostPort(host)
            if err != nil {
                log.Warningf("%v is err=%v", host, err)
                continue
            }
            addrMap[addr] = host
        }
        rsp, _, _ := c.Client.Health().Service(s.Name, "", false, nil)
        for _, srsp := range rsp {
            if srsp.Service.ID == serviceId {

                if host, ok := addrMap[srsp.Node.Address]; ok {
                    config := consul.DefaultNonPooledConfig()
                    config.Address = host
                    // 創(chuàng)建consul連接
                    client, err := consul.NewClient(config)
                    if err != nil {
                        log.Warningf("NewClient is err=%v", host, err)
                    }
                    err = client.Agent().ServiceDeregister(serviceId)
                    log.Infof("ServiceDeregister host=%v , serviceId=%v", host, serviceId)
                }
            }
        }
    } else {
        err = c.Client.Agent().ServiceDeregister(serviceId)
        log.Infof("ServiceDeregister  serviceId=%v", serviceId)
    }

可以肯定的是consul還有其他的坑的,但是這兩個(gè)坑讓我記憶深刻,記錄下來(lái)給準(zhǔn)備使用consul或者已經(jīng)遇到這些坑的同學(xué)一個(gè)提醒。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

本文名稱(chēng):consul服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)的巨坑-創(chuàng)新互聯(lián)
鏈接分享:http://www.chinadenli.net/article26/dgeojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化商城網(wǎng)站面包屑導(dǎo)航營(yíng)銷(xiāo)型網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)