Documentation
¶
Overview ¶
Package nns 提供 Nacos Naming Service 高级封装,是 ekit 服务治理的官方推荐入口。
基于 registry 接口构建,提供 mock、静态实例、缓存、singleflight、多级降级等治理能力。 新服务应通过 NNSClient 接入,而非直接使用 registry/* 薄适配。
核心特性 ¶
- 构造注入:每次 New 返回独立实例,推荐通过构造注入传递,不依赖全局状态
- 服务初始化:自动加载本地和依赖服务配置
- HTTP/gRPC Endpoint:自动生成服务端点
- 服务注册/注销:与 Nacos Naming 集成;RegisterAs 支持同一连接注册多个服务名
- 实例订阅:实时监听服务实例变更
- 多级降级:静态实例 > 缓存 > 注册中心(降级序可配置,支持注册中心优先 + 静态兜底)
- 框架适配:通过 ServiceClient() 暴露给 nns/kitex、nns/hertz 适配器
快速接入 ¶
创建 NNSClient(推荐通过构造注入传递):
ctx := context.Background()
nnsc := nns.New(cfg)
err := nnsc.Init(ctx, "my-service", []string{"user-service", "order-service"})
if err != nil {
log.Fatal(err)
}
defer nnsc.Close()
注册服务:
err = nnsc.Register(ctx, port, registry.WithMetadata(version.Metadata()))
获取服务实例:
instances, err := nnsc.GetInstances(ctx, "user-service")
创建 HTTP Endpoint(nns-endpoint 模块,工厂由调用方持有;nns 包自拆分起 不再内置 MakeHTTPEndpoint——此前包注释仍展示已移除方法,照抄会编译失败, oekit/oekit.github.io#12):
import "github.com/oekit/nns-endpoint/endpoint"
factory := endpoint.NewHTTPEndpointFactory(nnsc.ServiceClient())
ep := factory("user-service")
框架适配:
// Kitex
cli, _ := echo.NewClient("dep",
client.WithResolver(nnskitex.NewResolver(nnsc.ServiceClient())))
svr, _ := echo.NewServer(handler,
server.WithRegistry(nnskitex.NewRegistry(nnsc.ServiceClient())))
// Hertz
cli.Use(sd.Discovery(nnshertz.NewResolver(nnsc.ServiceClient())))
svr := server.New(..., server.WithRegistry(nnshertz.NewRegistry(nnsc.ServiceClient())))
配置选项 ¶
- WithCacheExpiry: 缓存过期时间,默认 30s
- WithMockMode: 启用模拟模式(本地开发)
- WithStaticInstance: 静态实例配置(短路语义)
- WithStaticFallback: 静态兜底实例(注册中心优先,注册中心无果时参与)
- WithFallbackOrder: 全局降级序(默认 client.FallbackStaticFirst)
- WithLocalServiceConfig: 本地服务配置(不从 Nacos 获取)
多端点服务 ¶
一个服务对外暴露多个端点(HTTP + RPC 双协议)时,用 RegisterAs 把每个名字 各注册一次即可——同一个 SDK 连接,不必为每个名字各开一个门面实例:
err = nnsc.RegisterAs(ctx, "shop-http", 8080) err = nnsc.RegisterAs(ctx, "com.example.shop.order", 9090) // 关停时对称注销 err = nnsc.DeregisterAs(ctx, "shop-http", 8080) err = nnsc.DeregisterAs(ctx, "com.example.shop.order", 9090)
与 bootstrap 集成 ¶
使用 bootstrap.Run 并设置 DepServices 自动初始化 NNS:
b, _ := bootstrap.New(bootstrap.WithServiceName("my-service"),
bootstrapnacos.WithNNS(nacosCfg, port, []string{"dep.service"})) // bootstrap/nacos
b.Run(func(app *bootstrap.App) error {
// ...
})
Index ¶
- type NNSClient
- func (n *NNSClient) AddStaticInstance(serviceName string, instances ...registry.Instance)
- func (n *NNSClient) Close()
- func (n *NNSClient) Deregister(ctx context.Context, port int, opts ...registry.RegisterOptionFunc) error
- func (n *NNSClient) DeregisterAs(ctx context.Context, serviceName string, port int, ...) error
- func (n *NNSClient) Discoverer() registry.Discoverer
- func (n *NNSClient) GetAllInstances(ctx context.Context, serviceName string) ([]registry.Instance, error)
- func (n *NNSClient) GetInstances(ctx context.Context, serviceName string) ([]registry.Instance, error)
- func (n *NNSClient) GetService(ctx context.Context, serviceName string) (*metadata.ServiceBasic, error)
- func (n *NNSClient) Init(ctx context.Context, serviceName string, depServices []string) error
- func (n *NNSClient) Register(ctx context.Context, port int, opts ...registry.RegisterOptionFunc) error
- func (n *NNSClient) RegisterAs(ctx context.Context, serviceName string, port int, ...) error
- func (n *NNSClient) Registrar() registry.Registrar
- func (n *NNSClient) ServiceClient() *client.ServiceClient
- func (n *NNSClient) SetStaticInstances(serviceName string, instances []registry.Instance)
- func (n *NNSClient) Subscribe(ctx context.Context, serviceName string, callback func([]registry.Instance)) error
- func (n *NNSClient) Unsubscribe(ctx context.Context, serviceName string) error
- type NNSOption
- func WithCacheExpiry(d time.Duration) NNSOption
- func WithFallbackOrder(order client.FallbackOrder) NNSOption
- func WithLocalServiceConfig(serviceName string, basic *metadata.ServiceBasic) NNSOption
- func WithMockMode(enabled bool) NNSOption
- func WithStaticFallback(serviceName string, instances []registry.Instance) NNSOption
- func WithStaticInstance(serviceName string, instances []registry.Instance) NNSOption
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type NNSClient ¶
type NNSClient struct {
// contains filtered or unexported fields
}
NNSClient NNS 服务客户端,封装了服务发现、负载均衡和端点管理功能。
门面是 provider 选择点:nns.New(cfg) 负责把 Nacos 配置构造为 registry/nacos 实现并注入 provider 无关的 ServiceClient(2026-09-19 重构:默认构造从 nns/client 上提至此,治理核心不再绑定 provider)。
func New ¶
New 创建 NNS 客户端。 cfg 是 Nacos 连接配置,opts 可选配置 mock 模式、静态实例、缓存过期等。 返回的 NNSClient 需调用 Init 初始化后使用。
Provider 默认构造(非 mock 时):创建 naming/config SDK 客户端并注入 registry/nacos 的 Discoverer/Subscriber/Registrar/ConfigStore;构造失败 只 Warn 降级(缓存/静态实例路径),不阻断启动——与既有降级语义一致。 默认路径创建的 SDK 客户端归本实例所有,Close 时释放。
func (*NNSClient) AddStaticInstance ¶
AddStaticInstance 向指定服务追加静态实例地址。
func (*NNSClient) Close ¶
func (n *NNSClient) Close()
Close 关闭 NNSClient 持有的所有资源(ServiceClient 的配置/实例订阅、 回调状态、门面默认路径创建的 Nacos SDK 客户端)。 Close 是终结操作:默认路径下 SDK gRPC 连接已关闭,复用需重新 New。 端点工厂自 Round-4 起移至 ekit-nns-endpoint,其生命周期由构造方管理。
func (*NNSClient) Deregister ¶
func (n *NNSClient) Deregister(ctx context.Context, port int, opts ...registry.RegisterOptionFunc) error
Deregister 从注册中心注销当前服务实例。
func (*NNSClient) DeregisterAs ¶ added in v0.5.0
func (n *NNSClient) DeregisterAs(ctx context.Context, serviceName string, port int, opts ...registry.RegisterOptionFunc) error
DeregisterAs 从注册中心注销指定服务名下的当前服务实例。
与 RegisterAs 配套:注销的实例与服务名、端口必须与注册时一致,否则注册 中心匹配不到实例、注销会静默失效。
func (*NNSClient) Discoverer ¶ added in v0.5.0
func (n *NNSClient) Discoverer() registry.Discoverer
Discoverer 返回底层注入的发现器;未注入时返回 nil。
逃生口:与 Registrar 配套,让调用方直接驱动发现路径,连接与生命周期 仍归本门面。
func (*NNSClient) GetAllInstances ¶
func (n *NNSClient) GetAllInstances(ctx context.Context, serviceName string) ([]registry.Instance, error)
GetAllInstances 获取指定服务的全部实例列表(包括不健康的实例)。
func (*NNSClient) GetInstances ¶
func (n *NNSClient) GetInstances(ctx context.Context, serviceName string) ([]registry.Instance, error)
GetInstances 获取指定服务的健康实例列表。
func (*NNSClient) GetService ¶
func (n *NNSClient) GetService(ctx context.Context, serviceName string) (*metadata.ServiceBasic, error)
GetService 获取指定服务的基本配置信息。
func (*NNSClient) Register ¶
func (n *NNSClient) Register(ctx context.Context, port int, opts ...registry.RegisterOptionFunc) error
Register 向注册中心注册当前服务实例。
func (*NNSClient) RegisterAs ¶ added in v0.5.0
func (n *NNSClient) RegisterAs(ctx context.Context, serviceName string, port int, opts ...registry.RegisterOptionFunc) error
RegisterAs 向注册中心注册当前服务实例到**指定服务名**下。
与 Register 的区别只有一处:服务名由调用方显式给出,而不是取 Init 记录的 自身服务名。因此 RegisterAs 不要求先 Init。
一个服务对外暴露多个端点(HTTP + RPC 双协议、分别注册在短名与完整 RPC 服务名下)时,用同一个 SDK 连接把每个名字各注册一次即可——不必为每个名字 各开一个门面实例(那会翻倍 Nacos gRPC 长连接与后台 goroutine)。
端口各自传入(同一进程的两个端点端口不同)。IP 取 GetPodIP 探测的本机 IP。 opts 控制权重、元数据等注册选项。
配套的注销入口是 DeregisterAs:注册了几个名字就要注销几个名字,否则注册 中心里会留下无人回收的实例。
func (*NNSClient) Registrar ¶ added in v0.5.0
Registrar 返回底层注入的注册器;未注入时返回 nil。
逃生口:把「注册什么」交还给调用方(如注册与本进程不同的实例地址), 而 SDK 连接与生命周期仍由本门面持有与释放。与 Discoverer 配套。
func (*NNSClient) ServiceClient ¶
func (n *NNSClient) ServiceClient() *client.ServiceClient
ServiceClient 返回底层 *client.ServiceClient,供 nns/kitex、nns/hertz 等适配器使用。
推荐用法:
nnskitex.NewResolver(nnsc.ServiceClient()) nnshertz.NewRegistry(nnsc.ServiceClient())
不应绕过此访问器直接访问内部 ServiceClient 字段。
func (*NNSClient) SetStaticInstances ¶
SetStaticInstances 设置指定服务的静态实例列表(覆盖原有)。
type NNSOption ¶
type NNSOption func(*clientOptions)
NNSOption NNSClient 的配置选项函数类型。
func WithFallbackOrder ¶ added in v0.5.0
func WithFallbackOrder(order client.FallbackOrder) NNSOption
WithFallbackOrder 设置全局降级序:静态实例与注册中心谁优先。
缺省为 client.FallbackStaticFirst(静态实例短路注册中心,与既有行为 一致)。设为 client.FallbackRegistryFirst 后,全部服务的静态实例降级 为「兜底」:注册中心路径失败或返回空时才参与取值。
单服务可用 WithStaticFallback 单独指定兜底语义,不受全局序影响。
func WithLocalServiceConfig ¶
func WithLocalServiceConfig(serviceName string, basic *metadata.ServiceBasic) NNSOption
WithLocalServiceConfig 配置本地服务配置(不从 Nacos 获取) 用于本地开发或测试环境,直接指定服务的超时、重试等配置
func WithMockMode ¶
WithMockMode 设置是否启用 Mock 模式,Mock 模式下不连接 Nacos。
func WithStaticFallback ¶ added in v0.5.0
WithStaticFallback 配置指定服务的**兜底**静态实例。
与 WithStaticInstance 的区别只在参与时机:
- WithStaticInstance:短路静态——配了就直接返回,注册中心不被查询;
- WithStaticFallback:兜底静态——只有注册中心路径失败或返回空时才返回它。
典型用法是生产形态的「注册中心优先、静态地址兜底」:静态地址 (如 k8s Service DNS)与注册中心同时配置,注册中心有健康实例时以 注册中心为准(静态地址在实例换 IP 后不会跟着变),注册中心冷启动或 故障时才用静态地址兜底。
同一服务上重复配置以最后一次调用为准。
func WithStaticInstance ¶
WithStaticInstance 配置指定服务的静态实例列表,用于本地开发或特殊场景。
默认是**短路**语义:配了该服务的静态实例后,GetInstances 直接返回它们, 不再查询注册中心。需要「注册中心优先、静态地址兜底」的生产形态请用 WithStaticFallback(或全局 WithFallbackOrder(FallbackRegistryFirst))。
Directories
¶
| Path | Synopsis |
|---|---|
|
Package client 提供 NNS(enjoydream Naming Service)治理核心: 服务发现、配置管理、实例订阅与注册的 provider 无关实现。
|
Package client 提供 NNS(enjoydream Naming Service)治理核心: 服务发现、配置管理、实例订阅与注册的 provider 无关实现。 |
|
Package metadata 定义了 NNS(enjoydream Naming Service)中使用的核心元数据类型和常量。
|
Package metadata 定义了 NNS(enjoydream Naming Service)中使用的核心元数据类型和常量。 |