介绍
下面介绍 jupiter-0.2.7 版本中 grpc 通过 etcd 实现服务发现与注册。
服务发现与注册的实现解析
服务注册
服务注册的流程图:
etcd的服务注册代码模块在 jupiter/pkg/registry/etcdv3 中。
下面让我们来看看实际的代码
// Registry register/unregister service
// registry impl should control rpc timeout
type Registry interface {
RegisterService(context.Context, *server.ServiceInfo) error
UnregisterService(context.Context, *server.ServiceInfo) error
ListServices(context.Context, string, string) ([]*server.ServiceInfo, error)
WatchServices(context.Context, string, string) (chan Endpoints, error)
io.Closer
}
复制代码
在 pkg/registry/registry.go 中定义了注册服务对象的接口。不同的服务只要实现了这些接口,jupiter 就能使用。
首先我们来看看注册方法
// RegisterService register service to registry
func (reg *etcdv3Registry) RegisterService(ctx context.Context, info *server.ServiceInfo) error {
err := reg.registerBiz(ctx, info)
...
}
// 业务信息注册
func (reg *etcdv3Registry) registerBiz(ctx context.Context, info *server.ServiceInfo) error {
...
// 提交信息到 etcd
_, err := reg.client.Put(readCtx, key, val, opOptions...)
...
}
复制代码
这里主要的部分是 reg