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