Files
atom/providers/config/loader.go
2023-01-28 11:09:11 +08:00

101 lines
2.0 KiB
Go

package config
import (
"app/container"
"app/utils"
"log"
"os"
"strings"
"time"
"github.com/go-micro/plugins/v4/config/encoder/toml"
"github.com/go-micro/plugins/v4/config/source/etcd"
"github.com/rogeecn/fabfile"
"go-micro.dev/v4/config"
"go-micro.dev/v4/config/reader"
"go-micro.dev/v4/config/reader/json"
"go-micro.dev/v4/config/source"
"go-micro.dev/v4/config/source/env"
"go-micro.dev/v4/config/source/file"
"go-micro.dev/v4/logger"
)
var c *Config
type Config struct {
App App
Http Http
Log Log
}
func init() {
if err := container.Container.Provide(Load); err != nil {
log.Fatal(err)
}
}
func Load() (*Config, error) {
var err error
confFile := utils.ShareConfigFile
if confFile == "" {
confFile, err = fabfile.Find("config.toml")
if err != nil {
return nil, err
}
}
options := []config.Option{}
options = append(options, config.WithSource(file.NewSource(
file.WithPath(confFile),
source.WithEncoder(toml.NewEncoder()),
)))
etcdEndpoints := etcdEndpoints()
if len(etcdEndpoints) > 0 {
logger.Info("etcd endpoints: ", etcdEndpoints, len(etcdEndpoints))
options = append(options, config.WithSource(etcd.NewSource(
etcd.WithAddress(etcdEndpoints...),
etcd.WithPrefix("/micro/config/api.web"),
etcd.StripPrefix(true),
)))
}
options = append(options, config.WithSource(env.NewSource()))
options = append(options, config.WithReader(json.NewReader(reader.WithEncoder(toml.NewEncoder()))))
conf, err := config.NewConfig(options...)
if err != nil {
return nil, err
}
if err := conf.Scan(&c); err != nil {
return nil, err
}
go func() {
ticker := time.NewTicker(time.Second * 10)
defer ticker.Stop()
for range ticker.C {
if err := conf.Scan(&c); err != nil {
logger.Fatal(err)
}
}
}()
return c, nil
}
func etcdEndpoints() []string {
var endpoints []string
envVars := strings.Split(os.Getenv("ETCD_ENDPOINTS"), ",")
for _, env := range envVars {
if strings.TrimSpace(env) == "" {
continue
}
endpoints = append(endpoints, strings.TrimSpace(env))
}
return endpoints
}