123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- // Package gsvc provides service registry and discovery definition.
- package gsvc
- import (
- "context"
- "time"
- "github.com/gogf/gf/v2/errors/gerror"
- )
- // Registry interface for service.
- type Registry interface {
- Registrar
- Discovery
- }
- // Registrar interface for service registrar.
- type Registrar interface {
- // Register registers `service` to Registry.
- // Note that it returns a new Service if it changes the input Service with custom one.
- Register(ctx context.Context, service Service) (Service, error)
- // Deregister off-lines and removes `service` from the Registry.
- Deregister(ctx context.Context, service Service) error
- }
- // Discovery interface for service discovery.
- type Discovery interface {
- // Search searches and returns services with specified condition.
- Search(ctx context.Context, in SearchInput) ([]Service, error)
- // Watch watches specified condition changes.
- Watch(ctx context.Context, key string) (Watcher, error)
- }
- // Watcher interface for service.
- type Watcher interface {
- // Proceed proceeds watch in blocking way.
- // It returns all complete services that watched by `key` if any change.
- Proceed() ([]Service, error)
- // Close closes the watcher.
- Close() error
- }
- // Service interface for service definition.
- type Service interface {
- // GetName returns the name of the service.
- // The name is necessary for a service, and should be unique among services.
- GetName() string
- // GetVersion returns the version of the service.
- // It is suggested using GNU version naming like: v1.0.0, v2.0.1, v2.1.0-rc.
- // A service can have multiple versions deployed at once.
- // If no version set in service, the default version of service is "latest".
- GetVersion() string
- // GetKey formats and returns a unique key string for service.
- // The result key is commonly used for key-value registrar server.
- GetKey() string
- // GetValue formats and returns the value of the service.
- // The result value is commonly used for key-value registrar server.
- GetValue() string
- // GetPrefix formats and returns the key prefix string.
- // The result prefix string is commonly used in key-value registrar server
- // for service searching.
- //
- // Take etcd server for example, the prefix string is used like:
- // `etcdctl get /services/prod/hello.svc --prefix`
- GetPrefix() string
- // GetMetadata returns the Metadata map of service.
- // The Metadata is key-value pair map specifying extra attributes of a service.
- GetMetadata() Metadata
- // GetEndpoints returns the Endpoints of service.
- // The Endpoints contain multiple host/port information of service.
- GetEndpoints() Endpoints
- }
- // Endpoint interface for service.
- type Endpoint interface {
- // Host returns the IPv4/IPv6 address of a service.
- Host() string
- // Port returns the port of a service.
- Port() int
- // String formats and returns the Endpoint as a string.
- String() string
- }
- // Endpoints are composed by multiple Endpoint.
- type Endpoints []Endpoint
- // Metadata stores custom key-value pairs.
- type Metadata map[string]interface{}
- // SearchInput is the input for service searching.
- type SearchInput struct {
- Prefix string // Search by key prefix.
- Name string // Search by service name.
- Version string // Search by service version.
- Metadata Metadata // Filter by metadata if there are multiple result.
- }
- const (
- Schema = `services`
- DefaultHead = `services`
- DefaultDeployment = `default`
- DefaultNamespace = `default`
- DefaultVersion = `latest`
- EnvPrefix = `GF_GSVC_PREFIX`
- EnvDeployment = `GF_GSVC_DEPLOYMENT`
- EnvNamespace = `GF_GSVC_NAMESPACE`
- EnvName = `GF_GSVC_Name`
- EnvVersion = `GF_GSVC_VERSION`
- MDProtocol = `protocol`
- MDInsecure = `insecure`
- MDWeight = `weight`
- DefaultProtocol = `http`
- DefaultSeparator = "/"
- defaultTimeout = 5 * time.Second
- endpointHostPortDelimiter = ":"
- endpointsDelimiter = ","
- )
- var defaultRegistry Registry
- // SetRegistry sets the default Registry implements as your own implemented interface.
- func SetRegistry(registry Registry) {
- if registry == nil {
- panic(gerror.New(`invalid Registry value "nil" given`))
- }
- defaultRegistry = registry
- }
- // GetRegistry returns the default Registry that is previously set.
- // It returns nil if no Registry is set.
- func GetRegistry() Registry {
- return defaultRegistry
- }
|