系統中實現服務註冊與發現所需的基本功能有
在分布式系統中,如何管理節點間的狀態一直是乙個難題,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...