原文地址:gRPC naming and discovery
etcd提供一個gRPC解析器支持備用的命名系統,該命名系統從etcd獲取主機以發現gRPC服務。如下機制基於監視對以服務名稱爲前綴的Key的更新。
經過go-grpc使用etcd發現服務git
etcd客戶端提供一個gRPC解析器經過etcd後端解析gRPC主機,解析器經過etcd客戶端初始化並指定了解析目標:github
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將主機從服務中刪除。golang
一個新的主機能夠經過etcdctl
添加到服務中:後端
ETCDCTL_API=3 etcdctl put my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'
etcd客戶端的GRPCResolver.Update
方法也能夠經過key匹配Addr
註冊一個新的主機到服務中:ide
r.Update(context.TODO(), "my-service", naming.Update{Op: naming.Add, Addr: "1.2.3.4", Metadata: "..."})
經過etcdctl能夠從服務中刪除一個主機:ui
ETCDCTL_API=3 etcdctl del my-service/1.2.3.4
etcd 客戶端的GRPCResolver.Update
方法也能夠刪除一個主機:google
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