de34f259ba
fixing test failed issue change back error type change registry.ErrNotFound back to selector.ErrNotFound change back error type change registry.ErrNotFound back to selector.ErrNotFound remove the single node tunnel test Fix read yaml config from memory package main import ( "fmt" "github.com/micro/go-micro/config" "github.com/micro/go-micro/config/source/memory" ) var configData = []byte(` --- a: 1234 `) func main() { memorySource := memory.NewSource( memory.WithYAML(configData), ) // Create new config conf := config.NewConfig() // Load file source conf.Load(memorySource) fmt.Println(string(conf.Bytes())) }
110 lines
1.9 KiB
Go
110 lines
1.9 KiB
Go
package selector
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/micro/go-micro/registry"
|
|
"github.com/micro/go-micro/registry/cache"
|
|
)
|
|
|
|
type registrySelector struct {
|
|
so Options
|
|
rc cache.Cache
|
|
}
|
|
|
|
func (c *registrySelector) newCache() cache.Cache {
|
|
ropts := []cache.Option{}
|
|
if c.so.Context != nil {
|
|
if t, ok := c.so.Context.Value("selector_ttl").(time.Duration); ok {
|
|
ropts = append(ropts, cache.WithTTL(t))
|
|
}
|
|
}
|
|
return cache.New(c.so.Registry, ropts...)
|
|
}
|
|
|
|
func (c *registrySelector) Init(opts ...Option) error {
|
|
for _, o := range opts {
|
|
o(&c.so)
|
|
}
|
|
|
|
c.rc.Stop()
|
|
c.rc = c.newCache()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *registrySelector) Options() Options {
|
|
return c.so
|
|
}
|
|
|
|
func (c *registrySelector) Select(service string, opts ...SelectOption) (Next, error) {
|
|
sopts := SelectOptions{
|
|
Strategy: c.so.Strategy,
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(&sopts)
|
|
}
|
|
|
|
// get the service
|
|
// try the cache first
|
|
// if that fails go directly to the registry
|
|
services, err := c.rc.GetService(service)
|
|
if err != nil {
|
|
if err == registry.ErrNotFound {
|
|
return nil, ErrNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
// apply the filters
|
|
for _, filter := range sopts.Filters {
|
|
services = filter(services)
|
|
}
|
|
|
|
// if there's nothing left, return
|
|
if len(services) == 0 {
|
|
return nil, ErrNoneAvailable
|
|
}
|
|
|
|
return sopts.Strategy(services), nil
|
|
}
|
|
|
|
func (c *registrySelector) Mark(service string, node *registry.Node, err error) {
|
|
}
|
|
|
|
func (c *registrySelector) Reset(service string) {
|
|
}
|
|
|
|
// Close stops the watcher and destroys the cache
|
|
func (c *registrySelector) Close() error {
|
|
c.rc.Stop()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *registrySelector) String() string {
|
|
return "registry"
|
|
}
|
|
|
|
func NewSelector(opts ...Option) Selector {
|
|
sopts := Options{
|
|
Strategy: Random,
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(&sopts)
|
|
}
|
|
|
|
if sopts.Registry == nil {
|
|
sopts.Registry = registry.DefaultRegistry
|
|
}
|
|
|
|
s := ®istrySelector{
|
|
so: sopts,
|
|
}
|
|
s.rc = s.newCache()
|
|
|
|
return s
|
|
}
|