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

sdbridge

package
v0.5.2 Latest Latest
Warning

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

Go to latest
Published: Nov 2, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

Package sdbridge 提供服务发现适配器的框架无关共享核心。

registry/{kitex,hertz} 与 nns/{kitex,hertz} 共 4 个 Resolver 适配器的 "拉取 + 校验 + 错误包装" 骨架、Hertz 服务描述中的 "?tags" 后缀解析、 实例列表校验与注册信息转换,原先各自拷贝一份;本包将其下沉为唯一实现, 各框架适配层只保留实例类型转换(kitex 仓 kitex/registry 与 hertz 仓 hertz/registry 的 convert.go) 与框架 Result 组装的薄壳。

本包只允许 import 标准库与 ekit/registry(oekit 平台契约 github.com/oekit/oekit.github.io/blob/main/docs/PLATFORM_CONTRACT.md), 禁止依赖 Hertz/Kitex 等具体框架。

用法(框架适配层侧)

core := sdbridge.NewResolverCore(fetch, "ekit", "kitex resolver",
    sdbridge.WithFetchErr(sdbridge.DiscoverFetchErr))
insts, err := core.Fetch(ctx, service) // 拉取 + 校验 + 统一错误前缀

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func DiscoverFetchErr

func DiscoverFetchErr(errPrefix, service string, err error) error

DiscoverFetchErr 返回 "<errPrefix>: discover <service>: <err>" 格式的错误 (registry 系适配器风格,附加服务名与动词)。

func PlainFetchErr

func PlainFetchErr(errPrefix, _ string, err error) error

PlainFetchErr 返回 "<errPrefix>: <err>" 格式的错误(nns 系适配器风格, 数据源错误已自带服务上下文,不再重复服务名)。

func ServiceNameFromDesc

func ServiceNameFromDesc(desc string) string

ServiceNameFromDesc 去掉 Hertz 服务描述中的 "?tags" 后缀,返回纯服务名。

Hertz 的缓存 key(由 registry.EncodeTargetTags 编码)形如 "host?k=v", 而服务发现只认服务名,解析逻辑原先在 hertz/registry 与 hertz/nns 各拷贝一份。

func ToInstance

func ToInstance(name string, addr net.Addr, weight, defaultWeight int, tags map[string]string) (registry.Instance, error)

ToInstance 从框架注册信息的通用字段构造 registry.Instance, weight <= 0 时使用 defaultWeight 兜底。内部委托 registry.InfoFrom, 作为 4 个 registry.go 适配文件权重兜底逻辑的唯一入口。

func Validate

func Validate(instances []registry.Instance, service string) ([]registry.Instance, error)

Validate 校验实例列表:空列表返回包装了 registry.ErrNoInstances 的错误 (可通过 errors.Is 判定),非空列表原样返回。

错误消息为 "no instances for %q",不含前缀——由调用方(如 ResolverCore.Fetch) 按需附加各自的 resolver 前缀。

Types

type FetchErrFunc

type FetchErrFunc func(errPrefix, service string, err error) error

FetchErrFunc 包装实例拉取阶段的错误。

errPrefix 是错误消息前缀,service 是(已剥离 "?tags" 的)服务名, err 是数据源返回的底层错误。

type FetchFunc

type FetchFunc func(ctx context.Context, service string) ([]registry.Instance, error)

FetchFunc 拉取指定服务的实例列表。

各框架适配层将自身的数据源(Discoverer.Discover、nns ServiceClient.GetInstances) 包装为本类型,交给 ResolverCore 统一调度。

type ResolverCore

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

ResolverCore 服务发现解析器的框架无关核心骨架。

封装 registry/{kitex,hertz} 与 nns/{kitex,hertz} 四个 Resolver 适配器共用的 "拉取 + 校验 + 错误包装" 逻辑;框架适配层只负责:

  1. Target 的框架类型适配;
  2. 实例列表 → 框架实例类型的转换(InstancesToKitex / InstancesToHertz);
  3. 框架 Result 的组装(Cacheable/CacheKey 等框架特有字段)。

func NewResolverCore

func NewResolverCore(fetch FetchFunc, name, errPrefix string, opts ...ResolverCoreOption) *ResolverCore

NewResolverCore 创建解析器核心。

fetch 是实例拉取函数;name 是 resolver 名称(Name() 返回值); errPrefix 是错误消息前缀(如 "kitex resolver"),错误格式为 "<errPrefix> ..."(不含尾冒号,冒号由错误格式函数添加)。

func (*ResolverCore) Cacheable

func (c *ResolverCore) Cacheable() bool

Cacheable 报告解析结果是否可被框架缓存。

Kitex Result.Cacheable 恒为 true(lbcache 按 CacheKey 缓存增量 Diff); Hertz 无此字段,忽略。

func (*ResolverCore) Fetch

func (c *ResolverCore) Fetch(ctx context.Context, service string) ([]registry.Instance, error)

Fetch 拉取并校验指定服务的实例列表("拉取 + 校验" 公共骨架)。

service 必须是纯服务名(Hertz 场景先用 ServiceNameFromDesc 剥离 "?tags")。 拉取失败返回 fetchErr 定义的格式;实例列表为空返回 "<errPrefix>: no instances for <service>"(errors.Is 可匹配 registry.ErrNoInstances)。

func (*ResolverCore) Name

func (c *ResolverCore) Name() string

Name 返回 resolver 名称。

type ResolverCoreOption

type ResolverCoreOption func(*ResolverCore)

ResolverCoreOption 是 ResolverCore 的配置选项函数类型。

func WithFetchErr

func WithFetchErr(fn FetchErrFunc) ResolverCoreOption

WithFetchErr 自定义实例拉取阶段的错误包装格式。 fn 为 nil 时忽略(保持默认 PlainFetchErr)。

Jump to

Keyboard shortcuts

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