ETCD:gRPC命名与发现

原文地址: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
相关文章
相关标签/搜索