registry

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jul 28, 2026 License: MIT Imports: 19 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func BuildConsulTarget

func BuildConsulTarget(serviceName string) string

BuildConsulTarget 构建 Consul 目标地址。

func BuildTarget added in v0.2.0

func BuildTarget(scheme, serviceName string) string

BuildTarget 构建指定 resolver scheme 的目标地址。

func NewGRPCResolverBuilder

func NewGRPCResolverBuilder(discovery Discovery) resolver.Builder

NewGRPCResolverBuilder 创建 gRPC 解析器构建器。

func NewGRPCResolverBuilderWithScheme added in v0.2.0

func NewGRPCResolverBuilderWithScheme(scheme string, discovery Discovery) resolver.Builder

NewGRPCResolverBuilderWithScheme 创建指定 scheme 的 gRPC 解析器构建器。

func RegisterConsulResolver

func RegisterConsulResolver(discovery Discovery)

RegisterConsulResolver 注册 Consul 解析器。

Types

type Discovery

type Discovery interface {
	GetService(ctx context.Context, serviceName string) ([]*core.ServiceNode, error)   // 获取服务实例
	Watch(ctx context.Context, serviceName string) (<-chan []*core.ServiceNode, error) // 监控服务变化
}

Discovery 服务发现接口

Example

ExampleDiscovery 客户端示例:使用 Discovery 接口发现服务

registry, err := NewConsulRegistry("127.0.0.1:8500")
if err != nil {
	log.Fatalf("Failed to create registry: %v", err)
}

RegisterConsulResolver(registry)

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

services, err := registry.GetService(ctx, "hello-service")
if err != nil {
	log.Printf("Failed to get services: %v", err)
	return
}

for _, svc := range services {
	fmt.Printf("ID: %s, Version: %s, Endpoints: %v\n", svc.ID, svc.Version, svc.Endpoints())
}

type K8sRegistry

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

K8sRegistry 基于 Kubernetes Endpoints 实现服务发现。 在 K8s 环境中,服务的注册由 Kubernetes 本身(Deployment+Service)完成, 因此 Register/Unregister 是空操作。 发现逻辑通过 Endpoints 资源实现。

func NewK8sRegistry

func NewK8sRegistry(namespace string) (*K8sRegistry, error)

NewK8sRegistry 创建 K8s 服务发现实例。 优先使用 InClusterConfig,回退到本地 kubeconfig。

func (*K8sRegistry) Close

func (r *K8sRegistry) Close() error

Close 关闭 K8s informer。

func (*K8sRegistry) GetService

func (r *K8sRegistry) GetService(ctx context.Context, serviceName string) ([]*core.ServiceNode, error)

GetService 从 K8s Endpoints 获取服务实例列表。

func (*K8sRegistry) Register

func (r *K8sRegistry) Register(ctx context.Context, node *core.ServiceNode) error

Register 在 K8s 中是空操作(由 K8s 平台自身完成注册)。

func (*K8sRegistry) Unregister

func (r *K8sRegistry) Unregister(ctx context.Context, node *core.ServiceNode) error

Unregister 在 K8s 中是空操作。

func (*K8sRegistry) Watch

func (r *K8sRegistry) Watch(ctx context.Context, serviceName string) (<-chan []*core.ServiceNode, error)

Watch 监控服务实例变化,返回变化通道。 当 context 取消时,informer 停止并关闭通道。 informers factory 仅在首次 Watch 时启动(通过 startOnce 保证)。

type Registrar

type Registrar interface {
	Register(ctx context.Context, node *core.ServiceNode) error   // 注册
	Unregister(ctx context.Context, node *core.ServiceNode) error // 注销
}

Registrar 服务注册接口

Example

ExampleRegistrar 服务端示例:从配置构建 ServiceNode,注册到 Consul

registry, err := NewConsulRegistry("127.0.0.1:8500")
if err != nil {
	log.Fatalf("Failed to create registry: %v", err)
}

// 从配置构建 ServiceNode(一个实例可以包含多个 Transport)
node := core.NewServiceNode(
	"hello-service", "v1.0.0",
	core.Transport{Protocol: "grpc", Address: "127.0.0.1", Port: 18001},
)

ctx := context.Background()
if err := registry.Register(ctx, node); err != nil {
	log.Fatalf("Failed to register: %v", err)
}
defer func() { _ = registry.Unregister(ctx, node) }()

// 启动 gRPC 服务...
fmt.Println("registered:", node.ID)

type Registry

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

Registry 瀹炵幇浜?Registrar 鍜?Discovery 鎺ュ彛

func NewConsulRegistry

func NewConsulRegistry(addr string) (*Registry, error)

NewConsulRegistry 鍒涘缓涓€涓柊鐨?Consul 娉ㄥ唽涓績瀹炰緥

func (*Registry) GetService

func (c *Registry) GetService(ctx context.Context, serviceName string) ([]*core.ServiceNode, error)

GetService 浠?Consul 鑾峰彇鏈嶅姟瀹炰緥鍒楄〃

func (*Registry) Register

func (c *Registry) Register(ctx context.Context, node *core.ServiceNode) error

Register 娉ㄥ唽鏈嶅姟鍒?Consul銆?// 涓€涓?ServiceNode 鍙兘鍖呭惈澶氫釜 Transport锛堝鍚屾椂鏆撮湶 HTTP 鍜?gRPC锛夛紝 姣忎釜 Transport 娉ㄥ唽涓轰竴鏉$嫭绔嬬殑 Consul 鏈嶅姟璁板綍锛孖D 浠?transport 鍚庣紑鍖哄垎銆?

func (*Registry) Unregister

func (c *Registry) Unregister(ctx context.Context, node *core.ServiceNode) error

Unregister 浠?Consul 娉ㄩ攢鏈嶅姟鐨勬墍鏈?Transport 璁板綍

func (*Registry) Watch

func (c *Registry) Watch(ctx context.Context, serviceName string) (<-chan []*core.ServiceNode, error)

Watch 鐩戞帶鏈嶅姟瀹炰緥鍙樺寲锛岃繑鍥炲彉鍖栭€氶亾

Jump to

Keyboard shortcuts

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