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
 | |
| }
 |