diff --git a/cmd/cmd.go b/cmd/cmd.go index c377b8a4..723e52d5 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -110,7 +110,7 @@ var ( "http": broker.NewBroker, } - DefaultRegistries = map[string]func([]string, ...registry.Option) registry.Registry{ + DefaultRegistries = map[string]func(...registry.Option) registry.Registry{ "consul": registry.NewRegistry, } @@ -216,7 +216,7 @@ func (c *cmd) Before(ctx *cli.Context) error { } if r, ok := c.opts.Registries[name]; ok { - n := r(strings.Split(ctx.String("registry_address"), ",")) + n := r(registry.Addrs(strings.Split(ctx.String("registry_address"), ",")...)) *c.opts.Registry = n } else { return fmt.Errorf("Registry %s not found", name) diff --git a/cmd/options.go b/cmd/options.go index a9fc3a31..0cef27c2 100644 --- a/cmd/options.go +++ b/cmd/options.go @@ -26,7 +26,7 @@ type Options struct { Server *server.Server Brokers map[string]func(...broker.Option) broker.Broker - Registries map[string]func([]string, ...registry.Option) registry.Registry + Registries map[string]func(...registry.Option) registry.Registry Selectors map[string]func(...selector.Option) selector.Selector Transports map[string]func([]string, ...transport.Option) transport.Transport @@ -100,7 +100,7 @@ func NewBroker(name string, b func(...broker.Option) broker.Broker) Option { } // New registry func -func NewRegistry(name string, r func([]string, ...registry.Option) registry.Registry) Option { +func NewRegistry(name string, r func(...registry.Option) registry.Registry) Option { return func(o *Options) { o.Registries[name] = r } diff --git a/registry/consul/consul.go b/registry/consul/consul.go index 92749e71..f8ba2701 100644 --- a/registry/consul/consul.go +++ b/registry/consul/consul.go @@ -9,6 +9,6 @@ func init() { cmd.DefaultRegistries["consul"] = NewRegistry } -func NewRegistry(addrs []string, opts ...registry.Option) registry.Registry { - return registry.NewRegistry(addrs, opts...) +func NewRegistry(opts ...registry.Option) registry.Registry { + return registry.NewRegistry(opts...) } diff --git a/registry/consul_registry.go b/registry/consul_registry.go index 607c24f9..7766e0fd 100644 --- a/registry/consul_registry.go +++ b/registry/consul_registry.go @@ -109,26 +109,26 @@ func decodeVersion(tags []string) (string, bool) { return "", false } -func newConsulRegistry(addrs []string, opts ...Option) Registry { - var opt Options +func newConsulRegistry(opts ...Option) Registry { + var options Options for _, o := range opts { - o(&opt) + o(&options) } // use default config config := consul.DefaultConfig() // set timeout - if opt.Timeout > 0 { - config.HttpClient.Timeout = opt.Timeout + if options.Timeout > 0 { + config.HttpClient.Timeout = options.Timeout } // check if there are any addrs - if len(addrs) > 0 { - addr, port, err := net.SplitHostPort(addrs[0]) + if len(options.Addrs) > 0 { + addr, port, err := net.SplitHostPort(options.Addrs[0]) if ae, ok := err.(*net.AddrError); ok && ae.Err == "missing port in address" { port = "8500" - addr = addrs[0] + addr = options.Addrs[0] config.Address = fmt.Sprintf("%s:%s", addr, port) } else if err == nil { config.Address = fmt.Sprintf("%s:%s", addr, port) @@ -136,10 +136,10 @@ func newConsulRegistry(addrs []string, opts ...Option) Registry { } // requires secure connection? - if opt.Secure || opt.TLSConfig != nil { + if options.Secure || options.TLSConfig != nil { config.Scheme = "https" // We're going to support InsecureSkipVerify - config.HttpClient.Transport = newTransport(opt.TLSConfig) + config.HttpClient.Transport = newTransport(options.TLSConfig) } // create the client @@ -148,7 +148,7 @@ func newConsulRegistry(addrs []string, opts ...Option) Registry { cr := &consulRegistry{ Address: config.Address, Client: client, - Options: opt, + Options: options, } return cr diff --git a/registry/options.go b/registry/options.go index 04e3525b..cac28b49 100644 --- a/registry/options.go +++ b/registry/options.go @@ -8,6 +8,7 @@ import ( ) type Options struct { + Addrs []string Timeout time.Duration Secure bool TLSConfig *tls.Config @@ -24,6 +25,13 @@ type RegisterOptions struct { Context context.Context } +// Addrs is the registry addresses to use +func Addrs(addrs ...string) Option { + return func(o *Options) { + o.Addrs = addrs + } +} + func Timeout(t time.Duration) Option { return func(o *Options) { o.Timeout = t diff --git a/registry/registry.go b/registry/registry.go index 909f8ab3..8a979424 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -21,13 +21,13 @@ type Option func(*Options) type RegisterOption func(*RegisterOptions) var ( - DefaultRegistry = newConsulRegistry([]string{}) + DefaultRegistry = newConsulRegistry() ErrNotFound = errors.New("not found") ) -func NewRegistry(addrs []string, opt ...Option) Registry { - return newConsulRegistry(addrs, opt...) +func NewRegistry(opts ...Option) Registry { + return newConsulRegistry(opts...) } // Register a service node. Additionally supply options such as TTL.