diff --git a/go.mod b/go.mod index 90ac20d7d..518071099 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/go-micro/plugins/v4/registry/etcd v1.1.0 github.com/go-micro/plugins/v4/registry/kubernetes v1.1.0 github.com/go-micro/plugins/v4/registry/mdns v1.1.0 + github.com/go-micro/plugins/v4/registry/memory v1.1.0 github.com/go-micro/plugins/v4/registry/nats v1.1.0 github.com/go-micro/plugins/v4/server/grpc v1.1.1 github.com/go-micro/plugins/v4/server/http v1.1.0 diff --git a/go.sum b/go.sum index 40ad14b7a..ee2ed6998 100644 --- a/go.sum +++ b/go.sum @@ -440,6 +440,8 @@ github.com/go-micro/plugins/v4/registry/kubernetes v1.1.0 h1:JfkrimhACDviPtKT7Fh github.com/go-micro/plugins/v4/registry/kubernetes v1.1.0/go.mod h1:6SNUr4g/JTzmR8OWU1KaIOS+lCFaqDnCRvbH3L5uUro= github.com/go-micro/plugins/v4/registry/mdns v1.1.0 h1:qRB93cviMeY4n3/r9T/5zJF3PF+Ol5tw/VW5e6TSG4s= github.com/go-micro/plugins/v4/registry/mdns v1.1.0/go.mod h1:k71V05hytGwaO3jqKKf8NmBPo07NFlCLmeIwPNr6n50= +github.com/go-micro/plugins/v4/registry/memory v1.1.0 h1:omyL8l12mzNCjNSDxMkAReEWOiv58j62X7sIa6aRCj8= +github.com/go-micro/plugins/v4/registry/memory v1.1.0/go.mod h1:7gsV2dwpFr+1rFhncmnxA9Tjv/NjQr9Zy8KpVKS7/jQ= github.com/go-micro/plugins/v4/registry/nats v1.1.0 h1:oqQzP5P2FkfoYZiBRuCWsKqh4BCJG6MQkxYmLw2lNrU= github.com/go-micro/plugins/v4/registry/nats v1.1.0/go.mod h1:4tTfa958PiYUOZNBBNoY1awmgfxFcqQOmix8cR3UM+E= github.com/go-micro/plugins/v4/server/grpc v1.1.1 h1:7V5K8RTQhzzFsJCPkKXTJr4YrWyIw5xebUTtDY27l3k= diff --git a/ocis-pkg/registry/registry.go b/ocis-pkg/registry/registry.go index fcee90921..8cbe6b389 100644 --- a/ocis-pkg/registry/registry.go +++ b/ocis-pkg/registry/registry.go @@ -3,52 +3,77 @@ package registry import ( "os" "strings" + "sync" "time" consulr "github.com/go-micro/plugins/v4/registry/consul" etcdr "github.com/go-micro/plugins/v4/registry/etcd" kubernetesr "github.com/go-micro/plugins/v4/registry/kubernetes" mdnsr "github.com/go-micro/plugins/v4/registry/mdns" + memr "github.com/go-micro/plugins/v4/registry/memory" natsr "github.com/go-micro/plugins/v4/registry/nats" "go-micro.dev/v4/registry" "go-micro.dev/v4/registry/cache" ) -var ( +const ( registryEnv = "MICRO_REGISTRY" registryAddressEnv = "MICRO_REGISTRY_ADDRESS" ) +var ( + once sync.Once + regPlugin string + reg registry.Registry +) + +func Configure(plugin string) { + if reg == nil { + regPlugin = plugin + } +} + // GetRegistry returns a configured micro registry based on Micro env vars. // It defaults to mDNS, so mind that systems with mDNS disabled by default (i.e SUSE) will have a hard time // and it needs to explicitly use etcd. Os awareness for providing a working registry out of the box should be done. func GetRegistry() registry.Registry { - addresses := strings.Split(os.Getenv(registryAddressEnv), ",") - - var r registry.Registry - switch os.Getenv(registryEnv) { - case "nats": - r = natsr.NewRegistry( - registry.Addrs(addresses...), - ) - case "kubernetes": - r = kubernetesr.NewRegistry( - registry.Addrs(addresses...), - ) - case "etcd": - r = etcdr.NewRegistry( - registry.Addrs(addresses...), - ) - case "consul": - r = consulr.NewRegistry( - registry.Addrs(addresses...), - ) - default: - r = mdnsr.NewRegistry() - } + once.Do(func() { + addresses := strings.Split(os.Getenv(registryAddressEnv), ",") + // prefer env of setting from Configure() + plugin := os.Getenv(registryEnv) + if plugin == "" { + plugin = regPlugin + } + switch plugin { + case "nats": + reg = natsr.NewRegistry( + registry.Addrs(addresses...), + ) + case "kubernetes": + reg = kubernetesr.NewRegistry( + registry.Addrs(addresses...), + ) + case "etcd": + reg = etcdr.NewRegistry( + registry.Addrs(addresses...), + ) + case "consul": + reg = consulr.NewRegistry( + registry.Addrs(addresses...), + ) + case "memory": + reg = memr.NewRegistry() + default: + reg = mdnsr.NewRegistry() + } + // No cache needed for in-memory registry + if plugin == "memory" { + reg = cache.New(reg, cache.WithTTL(20*time.Second)) + } + }) // always use cached registry to prevent registry // lookup for every request - return cache.New(r, cache.WithTTL(20*time.Second)) + return reg } diff --git a/ocis/pkg/command/server.go b/ocis/pkg/command/server.go index a83ffd585..60d450cf9 100644 --- a/ocis/pkg/command/server.go +++ b/ocis/pkg/command/server.go @@ -4,6 +4,7 @@ import ( "github.com/owncloud/ocis/v2/ocis-pkg/config" "github.com/owncloud/ocis/v2/ocis-pkg/config/configlog" "github.com/owncloud/ocis/v2/ocis-pkg/config/parser" + "github.com/owncloud/ocis/v2/ocis-pkg/registry" "github.com/owncloud/ocis/v2/ocis/pkg/register" "github.com/owncloud/ocis/v2/ocis/pkg/runtime" "github.com/urfave/cli/v2" @@ -19,6 +20,8 @@ func Server(cfg *config.Config) *cli.Command { return configlog.ReturnError(parser.ParseConfig(cfg, false)) }, Action: func(c *cli.Context) error { + // Prefer the in-memory registry as the default when running in single-binary mode + registry.Configure("memory") r := runtime.New(cfg) return r.Start() },