Help us shape the future of Go! Take the 2026 Go Developer Survey

registry

package
v2.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 13, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type CachedRegistry added in v2.0.4

type CachedRegistry struct {
	// contains filtered or unexported fields
}

CachedRegistry 是 RegistryClient 的装饰器(decorator)。

解决的核心问题:原实现每次微服务调用(client.CallCtx → selectHostByLB → GetServices) 都会同步打一次注册中心(Nacos /list、etcd Get、Consul Health、Polaris GET), 在高 QPS 下既拖慢单次调用、又给注册中心造成巨大压力,且注册中心抖动会直接击穿到业务调用。

本装饰器在内存中缓存 GetServices 结果:

  • 读取命中缓存(未过期)直接返回,零网络开销;
  • 后台定时预热,保持缓存温热、及时感知实例上下线;
  • 回源失败时优先复用旧实例列表(降级),避免注册中心瞬时故障导致全部调用失败;
  • 并发冷命中通过 inFlight 去重,只回源一次;
  • 进程关闭(DeRegister)时停止后台刷新协程,避免泄漏。

该层对调用方与注册中心后端完全透明,不改变 RegistryClient 接口语义。

func NewCachedRegistry added in v2.0.4

func NewCachedRegistry(inner RegistryClient) *CachedRegistry

NewCachedRegistry 用缓存层包裹一个真实的 RegistryClient。 inner 为 nil 时直接返回 nil(与 NewRegistry 的兜底逻辑保持一致)。

func (*CachedRegistry) DeRegister added in v2.0.4

func (c *CachedRegistry) DeRegister()

DeRegister 停止后台刷新协程,再透传注销。

func (*CachedRegistry) GetServiceURL added in v2.0.4

func (c *CachedRegistry) GetServiceURL(servicename string, groupName ...string) (string, string)

GetServiceURL v1 单实例入口:复用缓存的实例列表,随机选 1 个(保持原语义)。 缓存未命中或回源失败时返回 ("", ""),与原 v1 行为一致。

func (*CachedRegistry) GetServices added in v2.0.4

func (c *CachedRegistry) GetServices(servicename string, groupName ...string) ([]string, error)

GetServices v2 多实例入口:优先返回未过期的缓存; 未命中或已过期时回源,并通过 inFlight 抑制并发惊群; 回源出错但存在旧数据则降级返回旧数据,彻底无数据才返回错误。

func (*CachedRegistry) Register added in v2.0.4

func (c *CachedRegistry) Register(data []byte)

Register / DeRegister 直接透传到内层客户端;DeRegister 额外停止后台刷新。

type RegistryClient

type RegistryClient interface {
	// Register 把本服务注册到配置中心。
	Register(registryConfigData []byte)
	// GetServiceURL v1 单实例返回,保留向后兼容。
	// 内部实现通常从多实例中随机选 1 个返回,与 GetServices 等价。
	GetServiceURL(servicename string, groupName ...string) (string, string)
	// GetServices v2 新增:返回该服务的所有可用实例 URL 列表。
	// 用于客户端负载均衡(pkg/loadbalancer)。
	// 找不到实例时返 (nil, nil),错误时返 (nil, err)。
	GetServices(servicename string, groupName ...string) ([]string, error)
	// DeRegister 注销本服务。
	DeRegister()
}

RegistryClient 是 mgin v2 扩展后的统一注册中心客户端接口。

v1 接口:Register / GetServiceURL / DeRegister(保持不变,存量项目无需改动)。 v2 新增:GetServices 多实例列表,供 client.CallCtx 的负载均衡使用。

var Registry RegistryClient

func NewRegistry

func NewRegistry() RegistryClient

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL