From 47f1203e979dcb9c2a558641576efaea4ec94015 Mon Sep 17 00:00:00 2001 From: ben-toogood Date: Thu, 12 Mar 2020 18:13:03 +0000 Subject: [PATCH] Add Config to service options (#1336) Co-authored-by: Ben Toogood Co-authored-by: Asim Aslam --- config/cmd/cmd.go | 23 +++++++++++++++++-- config/cmd/options.go | 3 +++ config/config.go | 2 ++ config/default.go | 38 +++++++++++++++++--------------- config/source/service/service.go | 8 +++---- options.go | 10 +++++++++ 6 files changed, 60 insertions(+), 24 deletions(-) diff --git a/config/cmd/cmd.go b/config/cmd/cmd.go index 5daad43f..a43a4886 100644 --- a/config/cmd/cmd.go +++ b/config/cmd/cmd.go @@ -7,12 +7,13 @@ import ( "strings" "time" - "github.com/micro/go-micro/v2/auth/provider" - "github.com/micro/go-micro/v2/auth" + "github.com/micro/go-micro/v2/auth/provider" "github.com/micro/go-micro/v2/broker" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/client/selector" + "github.com/micro/go-micro/v2/config" + configSrv "github.com/micro/go-micro/v2/config/source/service" "github.com/micro/go-micro/v2/debug/profile" "github.com/micro/go-micro/v2/debug/profile/http" "github.com/micro/go-micro/v2/debug/profile/pprof" @@ -305,6 +306,11 @@ var ( EnvVars: []string{"MICRO_AUTH_PROVIDER_SCOPE"}, Usage: "The scope to be used for oauth", }, + &cli.StringFlag{ + Name: "config", + EnvVars: []string{"MICRO_CONFIG"}, + Usage: "The source of the config to be used to get configuration", + }, } DefaultBrokers = map[string]func(...broker.Option) broker.Broker{ @@ -373,6 +379,10 @@ var ( "http": http.NewProfile, "pprof": pprof.NewProfile, } + + DefaultConfigs = map[string]func(...config.Option) (config.Config, error){ + "service": config.NewConfig, + } ) func init() { @@ -392,6 +402,7 @@ func newCmd(opts ...Option) Cmd { Store: &store.DefaultStore, Tracer: &trace.DefaultTracer, Profile: &profile.DefaultProfile, + Config: &config.DefaultConfig, Brokers: DefaultBrokers, Clients: DefaultClients, @@ -404,6 +415,7 @@ func newCmd(opts ...Option) Cmd { Tracers: DefaultTracers, Auths: DefaultAuths, Profiles: DefaultProfiles, + Configs: DefaultConfigs, } for _, o := range opts { @@ -700,6 +712,13 @@ func (c *cmd) Before(ctx *cli.Context) error { } } + if ctx.String("config") == "service" { + opt := config.WithSource(configSrv.NewSource()) + if err := (*c.opts.Config).Init(opt); err != nil { + logger.Fatalf("Error configuring config: %v", err) + } + } + // client opts if r := ctx.Int("client_retries"); r >= 0 { clientOpts = append(clientOpts, client.Retries(r)) diff --git a/config/cmd/options.go b/config/cmd/options.go index da58938f..2e4956ff 100644 --- a/config/cmd/options.go +++ b/config/cmd/options.go @@ -7,6 +7,7 @@ import ( "github.com/micro/go-micro/v2/broker" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/client/selector" + "github.com/micro/go-micro/v2/config" "github.com/micro/go-micro/v2/debug/profile" "github.com/micro/go-micro/v2/debug/trace" "github.com/micro/go-micro/v2/registry" @@ -34,6 +35,7 @@ type Options struct { Tracer *trace.Tracer Auth *auth.Auth Profile *profile.Profile + Config *config.Config Brokers map[string]func(...broker.Option) broker.Broker Clients map[string]func(...client.Option) client.Client @@ -46,6 +48,7 @@ type Options struct { Tracers map[string]func(...trace.Option) trace.Tracer Auths map[string]func(...auth.Option) auth.Auth Profiles map[string]func(...profile.Option) profile.Profile + Configs map[string]func(...config.Option) (config.Config, error) // Other options for implementations of the interface // can be stored in a context diff --git a/config/config.go b/config/config.go index bd780874..d70d5778 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,8 @@ import ( type Config interface { // provide the reader.Values interface reader.Values + // Init the config + Init(opts ...Option) error // Stop the config loader/watcher Close() error // Load config sources diff --git a/config/default.go b/config/default.go index 2c050462..e50024ed 100644 --- a/config/default.go +++ b/config/default.go @@ -31,38 +31,40 @@ type watcher struct { } func newConfig(opts ...Option) (Config, error) { - options := Options{ + var c config + + c.Init(opts...) + go c.run() + + return &c, nil +} + +func (c *config) Init(opts ...Option) error { + c.opts = Options{ Loader: memory.NewLoader(), Reader: json.NewReader(), } for _, o := range opts { - o(&options) + o(&c.opts) } - if err := options.Loader.Load(options.Source...); err != nil { - return nil, err - } - - snap, err := options.Loader.Snapshot() + err := c.opts.Loader.Load(c.opts.Source...) if err != nil { - return nil, err + return err } - vals, err := options.Reader.Values(snap.ChangeSet) + + c.snap, err = c.opts.Loader.Snapshot() if err != nil { - return nil, err + return err } - c := &config{ - exit: make(chan bool), - opts: options, - snap: snap, - vals: vals, + c.vals, err = c.opts.Reader.Values(c.snap.ChangeSet) + if err != nil { + return err } - go c.run() - - return c, nil + return nil } func (c *config) run() { diff --git a/config/source/service/service.go b/config/source/service/service.go index 29e1bf65..cc5499eb 100644 --- a/config/source/service/service.go +++ b/config/source/service/service.go @@ -13,7 +13,6 @@ var ( DefaultName = "go.micro.config" DefaultNamespace = "global" DefaultPath = "" - DefaultClient = client.DefaultClient ) type service struct { @@ -25,7 +24,8 @@ type service struct { } func (m *service) Read() (set *source.ChangeSet, err error) { - req, err := m.client.Read(context.Background(), &proto.ReadRequest{ + client := proto.NewConfigService(m.serviceName, client.DefaultClient) + req, err := client.Read(context.Background(), &proto.ReadRequest{ Namespace: m.namespace, Path: m.path, }) @@ -37,7 +37,8 @@ func (m *service) Read() (set *source.ChangeSet, err error) { } func (m *service) Watch() (w source.Watcher, err error) { - stream, err := m.client.Watch(context.Background(), &proto.WatchRequest{ + client := proto.NewConfigService(m.serviceName, client.DefaultClient) + stream, err := client.Watch(context.Background(), &proto.WatchRequest{ Namespace: m.namespace, Path: m.path, }) @@ -91,7 +92,6 @@ func NewSource(opts ...source.Option) source.Source { opts: options, namespace: namespace, path: path, - client: proto.NewConfigService(addr, DefaultClient), } return s diff --git a/options.go b/options.go index 289b224b..c90c17f3 100644 --- a/options.go +++ b/options.go @@ -9,6 +9,7 @@ import ( "github.com/micro/go-micro/v2/broker" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/client/selector" + "github.com/micro/go-micro/v2/config" "github.com/micro/go-micro/v2/config/cmd" "github.com/micro/go-micro/v2/debug/profile" "github.com/micro/go-micro/v2/debug/trace" @@ -27,6 +28,7 @@ type Options struct { Registry registry.Registry Transport transport.Transport Profile profile.Profile + Config config.Config // Before and After funcs BeforeStart []func() error @@ -46,6 +48,7 @@ func newOptions(opts ...Option) Options { Auth: auth.DefaultAuth, Broker: broker.DefaultBroker, Cmd: cmd.DefaultCmd, + Config: config.DefaultConfig, Client: client.DefaultClient, Server: server.DefaultServer, Registry: registry.DefaultRegistry, @@ -143,6 +146,13 @@ func Auth(a auth.Auth) Option { } } +// Config sets the config for the service +func Config(c config.Config) Option { + return func(o *Options) { + o.Config = c + } +} + // Selector sets the selector for the service client func Selector(s selector.Selector) Option { return func(o *Options) {