Documentation
¶
Overview ¶
Package registry 提供与服务注册中心无关的服务注册与发现抽象接口。
本包定义核心接口(Registrar、Discoverer、Subscriber、ConfigStore), 不依赖任何具体的注册中心 SDK。各注册中心(如 Nacos)的实现放在子包中 (例如 registry/nacos)。
注意:registry 是底层 SPI 和框架薄适配,只供 NNS、测试、极简接入使用。 不包含缓存、降级、singleflight 等治理能力。新服务推荐通过 nns 包接入。
设计目标 ¶
- 解耦:上层(如 nns 包)依赖接口而非具体 SDK,便于测试和替换实现。
- 可测试:通过接口可以轻松注入 mock,解决上层核心逻辑难以测试的问题。
- 可扩展:未来新增 etcd/consul/k8s 等实现时,上层无需改动。
三层架构 ¶
ekit/nacos SDK 薄封装(Bootstrap 配置、client 工厂、config 加载) ekit/registry provider 无关的抽象接口(本包) ekit/registry/nacos Nacos 实现(封装 naming_client/config_client)
上层门面 nns 依赖 registry 接口,默认使用 registry/nacos 实现, 也可通过依赖注入替换为 mock 或其他 provider。
快速接入 ¶
使用 Nacos 实现:
reg, err := nacosimpl.NewRegistrar(namingClient, nacosimpl.WithGroup("DEFAULT_GROUP"))
if err != nil {
log.Fatal(err)
}
err = reg.Register(ctx, registry.Instance{
Service: "my-service",
IP: "10.0.0.1",
Port: 8080,
Metadata: version.Metadata(),
})
发现服务实例:
disc, err := nacosimpl.NewDiscoverer(namingClient) instances, err := disc.Discover(ctx, "user-service")
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNoInstances = errors.New("registry: no instances found")
ErrNoInstances 表示服务发现未找到任何实例。
Functions ¶
func EncodeTargetTags ¶
EncodeTargetTags 将 host 和 tags 编码为确定性的缓存 key。 tags 的 key 按字典序排序,确保相同 tags 产生相同结果(Go map 迭代顺序不确定)。 当 tags 为空时直接返回 host。
func ParseAddr ¶
ParseAddr 从 net.Addr 解析出 IP 和端口号。 当 host 为未指定地址(空、"::" 或 "0.0.0.0"——kitex/hertz 对 ":9090" 这类 通配监听时,listener.Addr() 与 WithServiceAddr 会产生这些形式)时, 自动使用 network.GetPodIP() 获取本机 IP(支持 K8s POD_IP),保证注册出去 的实例地址对其他节点可拨号。 这是 ekit 中解析注册地址的唯一实现,kitex/registry、hertz/registry、kitex/nns 应委托至此,避免逻辑重复。
Types ¶
type ConfigStore ¶
type ConfigStore interface {
// GetConfig 拉取指定 dataID 的配置内容。
//
// 返回空字符串表示配置不存在(非错误)。
GetConfig(ctx context.Context, dataID, group string) (string, error)
// ListenConfig 监听指定 dataID 的配置变更,内容变化时回调 onChange。
//
// onChange 接收最新的配置内容字符串。实现应确保回调在独立 goroutine
// 中执行或不会阻塞监听循环。
ListenConfig(ctx context.Context, dataID, group string, onChange func(data string)) error
// StopListenConfig 停止监听指定 dataID 的配置变更。
StopListenConfig(ctx context.Context, dataID, group string) error
}
ConfigStore 提供服务配置的拉取和动态监听能力。
这与服务发现(Discoverer/Subscriber)是正交关注点: 服务发现返回实例列表(IP/Port),而 ConfigStore 返回服务的运行时配置 (如超时、重试、负载均衡策略等,通常以 JSON 等格式存储)。
nns 包的 ServiceClient 同时使用 ConfigStore 和服务发现接口, 将配置和实例信息组合为完整的 ServiceBasic。
type Discoverer ¶
type Discoverer interface {
// Discover 根据服务名称返回健康实例列表。
Discover(ctx context.Context, serviceName string) ([]Instance, error)
// DiscoverAll 根据服务名称返回全部实例列表(包括不健康的实例)。
// 用于调试、监控等场景;生产调用应优先使用 Discover。
DiscoverAll(ctx context.Context, serviceName string) ([]Instance, error)
}
Discoverer 提供服务实例的拉取发现能力。
type Instance ¶
type Instance struct {
// Service 是服务名称。
Service string
// IP 是实例的 IP 地址。
IP string
// Port 是实例的端口。
Port int
// Weight 是实例的权重,用于加权负载均衡。
Weight float64
// Metadata 是实例的元数据,可携带版本、颜色、区域等信息。
Metadata map[string]string
// Group 是分组名称。空值时使用 Registrar 的默认 Group。
Group string
// Cluster 是集群名称。空值时使用 Registrar 的默认 Cluster。
Cluster string
}
Instance 表示注册中心中的一个服务实例,与具体 provider 无关。
type RegisterOption ¶
type RegisterOption struct {
// Weight 是实例权重,默认 10。
Weight float64
// Metadata 是实例元数据。
Metadata map[string]string
// Cluster 是集群名称(部分 provider 支持)。
Cluster string
// Group 是分组名称(部分 provider 支持)。
Group string
}
RegisterOption 是服务注册的可选配置,与具体 provider 无关。
各 provider 实现会将这些字段映射到自身 SDK 的参数。 如果某个字段在目标 provider 中不存在,实现应安全地忽略它。
func Apply ¶
func Apply(opts ...RegisterOptionFunc) *RegisterOption
Apply 将多个选项函数应用到一个新的 RegisterOption 上,返回最终配置。
用法:
opt := Apply(registry.WithWeight(20), registry.WithMetadata(meta))
type RegisterOptionFunc ¶
type RegisterOptionFunc func(*RegisterOption)
RegisterOptionFunc 是配置 RegisterOption 的函数选项类型。
func WithMetadata ¶
func WithMetadata(metadata map[string]string) RegisterOptionFunc
WithMetadata 设置服务实例的元数据。
多次调用会合并而非覆盖。
Directories
¶
| Path | Synopsis |
|---|---|
|
Package nacos 提供 Nacos 配置中心和服务注册发现客户端。
|
Package nacos 提供 Nacos 配置中心和服务注册发现客户端。 |
|
Package nacos 提供 registry 接口的 Nacos 实现。
|
Package nacos 提供 registry 接口的 Nacos 实现。 |
|
Package registrymocks 提供 registry 包 4 个接口(Registrar/Discoverer/Subscriber/ConfigStore) 的统一 mock 实现,供单元测试使用(原为 ekit internal 包,拆分后跨模块复用故公开)。
|
Package registrymocks 提供 registry 包 4 个接口(Registrar/Discoverer/Subscriber/ConfigStore) 的统一 mock 实现,供单元测试使用(原为 ekit internal 包,拆分后跨模块复用故公开)。 |
|
Package sdbridge 提供服务发现适配器的框架无关共享核心。
|
Package sdbridge 提供服务发现适配器的框架无关共享核心。 |