用etcd實現服務註冊和發現

2021-10-02 09:41:37 字數 2679 閱讀 4035

系統中實現服務註冊與發現所需的基本功能有

在分布式系統中,如何管理節點間的狀態一直是乙個難題,etcd 是由開發並維護的,它使用 go 語言編寫,並通過raft 一致性演算法處理日誌複製以保證強一致性。etcd像是專門為集群環境的服務發現和註冊而設計,它提供了資料 ttl 失效、資料改變監視、多值、目錄監聽、分布式鎖原子操作等功能,可以方便的跟蹤並管理集群節點的狀態。

我們寫兩個 demo 程式,乙個服務充當service,乙個客戶端程式充當閘道器**。服務執行後會去etcd 以自己服務名命名的目錄中註冊服務節點,並定時續租(更新 ttl)。客戶端從 etcd查詢服務目錄中的節點資訊**服務的請求,並且會在協程中實時監控服務目錄中的變化,維護到自己的服務節點資訊列表中。

// 將服務註冊到etcd上

func registerservicetoetcd(servicetarget string, value string) ,

dialtimeout: 5 * time.second,

})if err != nil

kv := clientv3.newkv(client)

lease := clientv3.newlease(client)

var curleaseid clientv3.leaseid = 0

for

key := servicetarget + fmt.sprintf("%d", leaseresp.id)

if _, err := kv.put(context.todo(), key, value, clientv3.withlease(leaseresp.id)); err != nil

curleaseid = leaseresp.id

} else

}time.sleep(time.duration(1) * time.second)}}

type helloservice struct {}

func (p *helloservice) hello(request string, reply *string) error

var servicetarget = "hello"

var port = ":1234"

var host = "remote_host"// 偽**

func main()

conn, err := listener.accept()

if err != nil

go registerservicetoetcd(servicetarget, host + port)

rpc.serveconn(conn)

}

閘道器通過 etcd獲取到服務目錄下的所有節點的資訊,將他們初始化到自身維護的可訪問服務節點列表中。然後使用watch機制監聽etcd上服務對應的目錄的更新,根據通道傳送過來的put和delete事件來增加和刪除服務的可用節點列表。

var servicetarget = "hello"

type remoteservice struct

// 獲取服務目錄下所有key初始化到服務的可用節點列表中

func getservice(etcdclient clientv3.client) *remoteservice

kv := clientv3.newkv(etcdclient)

rangeresp, err := kv.get(context.todo(), service.name, clientv3.withprefix())

if err != nil

service.mutex.lock()

for _, kv := range rangeresp.kvs

service.mutex.unlock()

go watchserviceupdate(etcdclient, service)

}// 監控服務目錄下的事件

func watchserviceupdate(etcdclient clientv3.client, service *remoteservice)

service.mutex.unlock()}}

}func main () ,

dialtimeout: 5 * time.second,

})service := getservice(client)// 獲取服務的可用節點

......

// 每次有請求過來從服務節點中選取乙個連線,然後給節點傳送請求

rpcclient, _ = rpc.dial("tcp", service.nodes[i])

var reply string

rpcclient.call("helloservice.hello", &reply)

......

}

除了上面說的客戶端或者閘道器發現系統中的已存服務外,系統中的各個服務之間也需要感知到其他角色的存在,服務間的發現方法與上面的例子類似,每個服務都能作為客戶端在 etcd 中發現其他服務的存在。

課程推薦:簡明高效的go語言入門和實戰指南

etcd實現服務發現

etcd環境安裝與使用文章中介紹了etcd的安裝及v3 api使用,本篇將介紹如何使用etcd實現服務發現功能。服務發現要解決的也是分布式系統中最常見的問題之一,即在同乙個分布式集群中的程序或服務,要如何才能找到對方並建立連線。本質上來說,服務發現就是想要了解集群中是否有程序在監聽 udp 或 tc...

etcd註冊服務

etcd作為最簡單 輕量,精簡 的kv服務。etcd可以應用很多方面,但是它有乙個特點,etcd只是基礎,需要你自己實現功能。它不像其其它元件開箱即用,也正是如此,它足夠簡單精巧。回到主題,etcd裡面並沒有服務註冊發現的功能,所以要自己開發。推薦一篇介紹文章 etcd的服務註冊發現,主要就是用了e...

etcd註冊服務

etcd作為最簡單 輕量,精簡 的kv服務。etcd可以應用很多方面,但是它有乙個特點,etcd只是基礎,需要你自己實現功能。它不像其其它元件開箱即用,也正是如此,它足夠簡單精巧。回到主題,etcd裡面並沒有服務註冊發現的功能,所以要自己開發。推薦一篇介紹文章 etcd的服務註冊發現,主要就是用了e...