registry

package
v1.1.58 Latest Latest
Warning

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

Go to latest
Published: Jan 25, 2025 License: MIT Imports: 2 Imported by: 0

README

registry

Service registry, corresponding to service discovery corresponds to and supports etcd, consul and nacos.

Example of use

import "github.com/18721889353/sunshine/pkg/servicerd/registry"

func registerService(scheme string, host string, port int) (registry.Registry, *registry.ServiceInstance) {
	var (
		instanceEndpoint = fmt.Sprintf("%s://%s:%d", scheme, host, port)
		cfg              = config.Get()

		iRegistry registry.Registry
		instance  *registry.ServiceInstance
		err       error

		id       = cfg.App.Name + "_" + scheme + "_" + host
		logField logger.Field
	)

	switch cfg.App.RegistryDiscoveryType {
	// registering service with etcd
	case "etcd":
		iRegistry, instance, err = etcd.NewRegistry(
			cfg.Etcd.Addrs,
			id,
			cfg.App.Name,
			[]string{instanceEndpoint},
		)
		if err != nil {
			panic(err)
		}
		logField = logger.Any("etcdAddress", cfg.Etcd.Addrs)
	}

	if instance != nil {
		msg := fmt.Sprintf("register service address to %s", cfg.App.RegistryDiscoveryType)
		logger.Info(msg, logField, logger.String("id", id), logger.String("name", cfg.App.Name), logger.String("endpoint", instanceEndpoint))
		return iRegistry, instance
	}

	return nil, nil
}

// ------------------------------------------------------------------------------------------

    iRegistry, serviceInstance := registerService("http", "127.0.0.1", 8080)
    
    // register service
    ctx, _ := context.WithTimeout(context.Background(), 3*time.Second)
    if err := iRegistry.Register(ctx, serviceInstance); err != nil {
        panic(err)
    }
    
    // deregister service
    ctx, _ = context.WithTimeout(context.Background(), 3*time.Second)
    if err := iRegistry.Deregister(ctx, serviceInstance); err != nil {
        return err
    }

Documentation

Overview

Package registry 是一个服务注册库,支持 etcd、consul 和 nacos。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Discovery

type Discovery interface {
	// GetService 根据服务名称返回内存中的服务实例列表。
	GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
	// Watch 根据服务名称创建一个观察者。
	Watch(ctx context.Context, serviceName string) (Watcher, error)
}

Discovery 是服务发现接口。

type Option

type Option func(*options)

Option 定义服务实例的选项类型。

func WithMetadata

func WithMetadata(metadata map[string]string) Option

WithMetadata 设置服务实例的元数据。

func WithVersion

func WithVersion(version string) Option

WithVersion 设置服务实例的版本号。

type Registry

type Registry interface {
	// Register 注册服务实例。
	Register(ctx context.Context, service *ServiceInstance) (*clientv3.Client, error)
	// Deregister 取消注册服务实例。
	Deregister(ctx context.Context, service *ServiceInstance) error
}

Registry 是服务注册器接口。

type ServiceInstance

type ServiceInstance struct {
	// ID 是注册时的唯一实例 ID。
	ID string `json:"id"`
	// Name 是注册时的服务名称。
	Name string `json:"name"`
	// Version 是编译版本。
	Version string `json:"version"`
	// Metadata 是与服务实例关联的键值对元数据。
	Metadata map[string]string `json:"metadata"`
	// Endpoints 是服务实例的端点地址。
	// 格式示例:
	//   http://127.0.0.1:8000?isSecure=false
	//   grpc://127.0.0.1:9000?isSecure=false
	Endpoints []string `json:"endpoints"`
}

ServiceInstance 是发现系统中的一个服务实例。

func NewServiceInstance

func NewServiceInstance(id string, name string, endpoints []string, opts ...Option) *ServiceInstance

NewServiceInstance 创建一个新的服务实例。

type Watcher

type Watcher interface {
	// Next 返回服务实例列表,在以下两种情况下:
	// 1. 第一次观察且服务实例列表不为空。
	// 2. 发现任何服务实例变化。
	// 如果上述两个条件都不满足,则会阻塞,直到 context 到期或取消。
	Next() ([]*ServiceInstance, error)
	// Stop 关闭观察者。
	Stop() error
}

Watcher 是服务观察者接口。

Directories

Path Synopsis
Package etcd is registered as a service using etcd.
Package etcd is registered as a service using etcd.

Jump to

Keyboard shortcuts

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