101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"atom/container"
|
|
"atom/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
|
|
}
|