ETCD:gRPC命名與發現


原文地址:gRPC naming and discovery
etcd提供一個gRPC解析器支持備用的命名系統,該命名系統從etcd獲取主機以發現gRPC服務。以下機制基於監視對以服務名稱為前綴的Key的更新。
通過go-grpc使用etcd發現服務


etcd客戶端提供一個gRPC解析器通過etcd后端解析gRPC主機,解析器通過etcd客戶端初始化並指定了解析目標:

import (
        "go.etcd.io/etcd/clientv3"
        etcdnaming "go.etcd.io/etcd/clientv3/naming"

        "google.golang.org/grpc"
)

...

cli, cerr := clientv3.NewFromURL("http://localhost:2379")
r := &etcdnaming.GRPCResolver{Client: cli}
b := grpc.RoundRobin(r)
conn, gerr := grpc.Dial("my-service", grpc.WithBalancer(b), grpc.WithBlock(), ...)

管理服務主機

etcd解析器對於解析目標前綴下所有Keys后面跟一個"/"(例如"my-service/"),使用JSON編碼go-grpcnaming.Update值作為潛在的服務主機。通過創建一個新的Key將主機添加到服務中,通過刪除Keys將主機從服務中刪除。

添加一個主機

一個新的主機可以通過etcdctl添加到服務中:

ETCDCTL_API=3 etcdctl put my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'

etcd客戶端的GRPCResolver.Update方法也可以通過key匹配Addr注冊一個新的主機到服務中:

r.Update(context.TODO(), "my-service", naming.Update{Op: naming.Add, Addr: "1.2.3.4", Metadata: "..."})

刪除一個主機

通過etcdctl可以從服務中刪除一個主機:

ETCDCTL_API=3 etcdctl del my-service/1.2.3.4

etcd 客戶端的GRPCResolver.Update方法也可以刪除一個主機:

r.Update(context.TODO(), "my-service", naming.Update{Op: naming.Delete, Addr: "1.2.3.4"})

注冊一個主機並綁定一個租約

注冊一個主機ging綁定一個租約確保如果主機不能維護保持存活的心跳(例如機器宕機),該主機將會從服務中移除。

lease=`ETCDCTL_API=3 etcdctl lease grant 5 | cut -f2 -d' '`
ETCDCTL_API=3 etcdctl put --lease=$lease my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'
ETCDCTL_API=3 etcdctl lease keep-alive $lease


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM