91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/unistack-org/micro/v3/metadata"
|
|
"github.com/unistack-org/micro/v3/registry"
|
|
"github.com/unistack-org/micro/v3/util/addr"
|
|
"github.com/unistack-org/micro/v3/util/backoff"
|
|
)
|
|
|
|
var (
|
|
// DefaultRegisterFunc uses backoff to register service
|
|
DefaultRegisterFunc = func(svc *registry.Service, config Options) error {
|
|
var err error
|
|
|
|
opts := []registry.RegisterOption{
|
|
registry.RegisterTTL(config.RegisterTTL),
|
|
registry.RegisterDomain(config.Namespace),
|
|
}
|
|
|
|
for i := 0; i <= config.RegisterAttempts; i++ {
|
|
err = config.Registry.Register(config.Context, svc, opts...)
|
|
if err == nil {
|
|
break
|
|
}
|
|
// backoff then retry
|
|
time.Sleep(backoff.Do(i + 1))
|
|
continue
|
|
}
|
|
return err
|
|
}
|
|
// DefaultDeregisterFunc uses backoff to deregister service
|
|
DefaultDeregisterFunc = func(svc *registry.Service, config Options) error {
|
|
var err error
|
|
|
|
opts := []registry.DeregisterOption{
|
|
registry.DeregisterDomain(config.Namespace),
|
|
}
|
|
|
|
for i := 0; i <= config.DeregisterAttempts; i++ {
|
|
err = config.Registry.Deregister(config.Context, svc, opts...)
|
|
if err == nil {
|
|
break
|
|
}
|
|
// backoff then retry
|
|
time.Sleep(backoff.Do(i + 1))
|
|
continue
|
|
}
|
|
return err
|
|
}
|
|
)
|
|
|
|
// NewRegistryService returns *registry.Service from Server
|
|
func NewRegistryService(s Server) (*registry.Service, error) {
|
|
opts := s.Options()
|
|
|
|
advt := opts.Address
|
|
if len(opts.Advertise) > 0 {
|
|
advt = opts.Advertise
|
|
}
|
|
|
|
host, port, err := net.SplitHostPort(advt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
addr, err := addr.Extract(host)
|
|
if err != nil {
|
|
addr = host
|
|
}
|
|
|
|
node := ®istry.Node{
|
|
Id: opts.Name + "-" + opts.Id,
|
|
Address: net.JoinHostPort(addr, port),
|
|
}
|
|
node.Metadata = metadata.Copy(opts.Metadata)
|
|
|
|
node.Metadata["server"] = s.String()
|
|
node.Metadata["broker"] = opts.Broker.String()
|
|
node.Metadata["registry"] = opts.Registry.String()
|
|
|
|
return ®istry.Service{
|
|
Name: opts.Name,
|
|
Version: opts.Version,
|
|
Nodes: []*registry.Node{node},
|
|
Metadata: metadata.New(0),
|
|
}, nil
|
|
}
|