這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
咱們這不講安裝, 只講使用.
etcd,consul 都是分布式KV, 一般用於服務發現;
1 註冊服務
這裡使用 etcd.clientv3搞事情, GoDoc在 這, 以下是虛擬碼
// key 隨你制定, 只要能標識是那個伺服器(比如 root/game/node_1)即可. value 可以包含addr, 狀態, 優先度等資訊client.OpPut(key,value)
這裡的小提示: 最好實現健全狀態檢查, 再好的代碼也有跑不動的一天, 好像etcd的健全狀態檢查只支援ttl(服務向etcd定時重新PUT), 所以記得設定TTL並整一個Tick定時執行以上代碼吧.
不過consul支援兩種健全狀態檢查, 一種是ttl, 一種是consul主動去檢查服務狀態(詳情看最底下 ↓ 的參考), 個人更喜歡consul. 因為我更喜歡年輕(=無限可能)的東西, 就像Golang一樣.
TTL?
// ttl: 10sresp, _:= cli.Grant(context.TODO(), 10)ctx, _:= context.WithTimeout(context.Background(), 5*time.Second)rsp,err:=cli.Put(ctx,"root/game/node-2",`{"addr":"192.168.1.1:9999"}`,clientv3.WithLease(resp.ID))
現在root/game/node-2在10s後就會自動移除
哦 就這麼簡單
2 擷取服務
你可以看到上面的key是用/分層級的, 就像檔案目錄一樣. 不過其實這個結構不是必須的, 只是推薦吧~.
擷取一個value只需要:
rsp,_ := cli.Get(ctx,"root/game/node_1")log.Print(rsp)
那麼你要擷取root下的所有kv怎麼辦呢? 這樣:
// clientv3.WithPrefix() 這個option的意思就是以首碼擷取,就是只要有這個首碼的key都返回. 現在明白了吧, 為什麼推薦用/分割key, 是不是很優雅?// 將返回一個數組rsp,_ := cli.Get(ctx,"root/",clientv3.WithPrefix())log.Print(rsp)
哦 就這麼簡單
3 watch
剛剛我說設定了TTL將在10s後刪除key, 這麼確定刪除了呢? 那就是watch.
watch的作用就是在新服務改變(重新註冊,下線等)後, 告知各個服務執行相應的邏輯(重新串連新服務,警示等).
ctx := context.TODO()ch := cli.Watch(ctx, "root/", clientv3.WithPrefix())for { log.Print("rev") select { case c := <-ch: for _, e := range c.Events { log.Printf("%+v", e) } }}
以上代碼在root/下的key有變化就會列印出相應的變化.
Consul我也沒用過, 這裡給個連結consul api, 裡面說的也易懂, 等用到了再來小記吧~ 完.
參考
etcd 使用入門
使用consul實現服務的註冊和發現