Skip to content

Commit

Permalink
Override environment variables using YAML configuration (#118)
Browse files Browse the repository at this point in the history
* Override environment variables using YAML configuration

* Configure variables from environment, file, default

* make code elegant and add a test

* fix some golangci-lint errors

* remove useless fmt.Println sentence
  • Loading branch information
AbigailJixiangyuyu authored Mar 4, 2024
1 parent 6afd1d1 commit 25303f7
Show file tree
Hide file tree
Showing 19 changed files with 316 additions and 128 deletions.
19 changes: 13 additions & 6 deletions applications/api/initialize/init_hertz.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,15 @@ func InitHertz() (*server.Hertz, func()) {
}))
}

// 链路追踪
p := provider.NewOpenTelemetryProvider(
provider.WithServiceName(ServiceName),
provider.WithExportEndpoint(fmt.Sprintf("%s:%s", ViperConfig.Viper.GetString("Otel.Host"), ViperConfig.Viper.GetString("Otel.Port"))),
provider.WithInsecure(),
)
var p provider.OtelProvider
if ViperConfig.Viper.GetBool("Otel.Enable") {
//链路追踪
p = provider.NewOpenTelemetryProvider(
provider.WithServiceName(ServiceName),
provider.WithExportEndpoint(fmt.Sprintf("%s:%s", ViperConfig.Viper.GetString("Otel.Host"), ViperConfig.Viper.GetString("Otel.Port"))),
provider.WithInsecure(),
)
}

tracer, tracerCfg := hertztracing.NewServerTracer()
opts = append(opts, tracer)
Expand Down Expand Up @@ -183,6 +186,10 @@ func InitHertz() (*server.Hertz, func()) {
}
}

if ViperConfig.Viper.GetBool("Otel.Enable") {
return h, func() {
}
}
return h, func() {
p.Shutdown(context.Background()) //nolint
}
Expand Down
38 changes: 25 additions & 13 deletions applications/comment/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,61 @@ package main

import (
"context"

"github.com/TremblingV5/DouTok/applications/comment/handler"
"github.com/TremblingV5/DouTok/applications/comment/rpc"
"github.com/TremblingV5/DouTok/config/configStruct"
"github.com/TremblingV5/DouTok/kitex_gen/comment/commentservice"
"github.com/TremblingV5/DouTok/pkg/DouTokContext"
"github.com/TremblingV5/DouTok/pkg/DouTokLogger"
"github.com/TremblingV5/DouTok/pkg/constants"
"github.com/TremblingV5/DouTok/pkg/dtviper"
"github.com/TremblingV5/DouTok/pkg/services"
"go.uber.org/zap"
"reflect"
)

type Config struct {
Base configStruct.Base `envPrefix:"DOUTOK_COMMENT_"`
Etcd configStruct.Etcd `envPrefix:"DOUTOK_COMMENT_"`
Jwt configStruct.Jwt `envPrefix:"DOUTOK_COMMENT_"`
Otel configStruct.Otel `envPrefix:"DOUTOK_COMMENT_"`
Server configStruct.Base
Etcd configStruct.Etcd
Otel configStruct.Otel
}

type LoggerConfig struct {
Logger configStruct.Logger `envPrefix:"DOUTOK_COMMENT_"`
}

var (
logger *zap.Logger
config = &Config{}
logger *zap.Logger
commentConfig Config
logcfg LoggerConfig
ViperConfig *dtviper.Config
)

func init() {
ctx := context.Background()
cfg, err := configStruct.Load[*Config](ctx, &Config{})
config = cfg
logger = DouTokLogger.InitLogger(config.Logger)
commentConfig = Config{}
logcfg = LoggerConfig{}
ViperConfig = dtviper.ConfigInit("DOUTOK_COMMENT", "comment")
ViperConfig.UnmarshalStructTags(reflect.TypeOf(commentConfig), "")
ViperConfig.UnmarshalStruct(&commentConfig)

logcfg, err := configStruct.Load[*LoggerConfig](ctx, &logcfg)

logger = DouTokLogger.InitLogger(logcfg.Logger)
DouTokContext.DefaultLogger = logger
DouTokContext.AddLoggerToContext(ctx, logger)
if err != nil {
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", config))
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", logcfg))
}
}

func main() {
options, shutdown := services.InitRPCServerArgs(constants.COMMENT_SERVER_NAME, config.Base, config.Etcd, config.Otel)

options, shutdown := services.InitRPCServerArgs(constants.COMMENT_SERVER_NAME, commentConfig.Server, commentConfig.Etcd, commentConfig.Otel)
defer shutdown()

svr := commentservice.NewServer(
handler.New(rpc.New(services.InitRPCClientArgs(constants.COMMENT_SERVER_NAME, config.Etcd))),
handler.New(rpc.New(services.InitRPCClientArgs(constants.COMMENT_SERVER_NAME, commentConfig.Etcd))),
options...,
)

Expand Down
60 changes: 35 additions & 25 deletions applications/commentDomain/cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,76 +2,86 @@ package main

import (
"context"
"strconv"

"github.com/TremblingV5/DouTok/applications/commentDomain/handler"
"github.com/TremblingV5/DouTok/applications/commentDomain/redis/commentTotalCountRedis"
"github.com/TremblingV5/DouTok/applications/commentDomain/service"
"github.com/TremblingV5/DouTok/config/configStruct"
"github.com/TremblingV5/DouTok/kitex_gen/commentDomain/commentdomainservice"
"github.com/TremblingV5/DouTok/pkg/DouTokContext"
"github.com/TremblingV5/DouTok/pkg/DouTokLogger"
"github.com/TremblingV5/DouTok/pkg/dtviper"
"github.com/TremblingV5/DouTok/pkg/hbaseHandle"
"github.com/TremblingV5/DouTok/pkg/initHelper"
"github.com/TremblingV5/DouTok/pkg/mysqlIniter"
redishandle "github.com/TremblingV5/DouTok/pkg/redisHandle"
"go.uber.org/zap"
"reflect"
"strconv"
)

type Config struct {
Base configStruct.Base `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Etcd configStruct.Etcd `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Jwt configStruct.Jwt `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
MySQL configStruct.MySQL `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Snowflake configStruct.Snowflake `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
HBase configStruct.HBase `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Redis configStruct.Redis `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Otel configStruct.Otel `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Logger configStruct.Logger `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
Server configStruct.Base
Etcd configStruct.Etcd
Otel configStruct.Otel
MySQL configStruct.MySQL
Snowflake configStruct.Snowflake
HBase configStruct.HBase
Redis configStruct.Redis
}

type LoggerConfig struct {
Logger configStruct.Logger `envPrefix:"DOUTOK_COMMENT_DOMAIN_"`
}

var (
logger *zap.Logger
handle = &handler.CommentDomainHandler{}
config = &Config{}
logger *zap.Logger
commentDomainConfig Config
logcfg LoggerConfig
viperConfig *dtviper.Config
handle *handler.CommentDomainHandler
)

func init() {
ctx := context.Background()
commentDomainConfig = Config{}
logcfg = LoggerConfig{}
viperConfig = dtviper.ConfigInit("DOUTOK_COMMENT_DOMAIN", "commentDomain")
viperConfig.UnmarshalStructTags(reflect.TypeOf(commentDomainConfig), "")
viperConfig.UnmarshalStruct(&commentDomainConfig)

cfg, err := configStruct.Load[*Config](ctx, &Config{})
config = cfg
logger = DouTokLogger.InitLogger(config.Logger)
DouTokContext.DefaultLogger = logger
DouTokContext.AddLoggerToContext(ctx, logger)
logcfg, err := configStruct.Load[*LoggerConfig](ctx, &logcfg)

logger = DouTokLogger.InitLogger(logcfg.Logger)
DouTokContext.DefaultLogger = logger
ctx = DouTokContext.AddLoggerToContext(ctx, logger)
if err != nil {
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", config))
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", logcfg))
}

logger = DouTokContext.Extract(ctx)

db, err := mysqlIniter.InitDb(
config.MySQL.Username, config.MySQL.Password, config.MySQL.Host, strconv.Itoa(config.MySQL.Port), config.MySQL.Database,
commentDomainConfig.MySQL.Username, commentDomainConfig.MySQL.Password, commentDomainConfig.MySQL.Host, strconv.Itoa(commentDomainConfig.MySQL.Port), commentDomainConfig.MySQL.Database,
)
if err != nil {
panic(err)
}

hb := hbaseHandle.InitHB(config.HBase.Host)
hb := hbaseHandle.InitHB(commentDomainConfig.HBase.Host)

redisClient := redishandle.NewRedisClient(config.Redis.Dsn, config.Redis.Password, 1)
redisClient := redishandle.NewRedisClient(commentDomainConfig.Redis.Dsn, commentDomainConfig.Redis.Password, 1)
commentTotalCountRedisClient := commentTotalCountRedis.NewClient(redisClient)
commentDomainService := service.NewCommentDomainService(
db, &hb, commentTotalCountRedisClient, config.Snowflake.Node,
db, &hb, commentTotalCountRedisClient, commentDomainConfig.Snowflake.Node,
)

handle = handler.NewCommentDomainHandler(commentDomainService)
}

func main() {

options, shutdown := initHelper.InitRPCServerArgsV2(
config.Base, config.Etcd, config.Otel,
commentDomainConfig.Server, commentDomainConfig.Etcd, commentDomainConfig.Otel,
)
defer shutdown()

Expand Down
39 changes: 25 additions & 14 deletions applications/favorite/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,60 @@ package main

import (
"context"

"github.com/TremblingV5/DouTok/applications/favorite/handler"
"github.com/TremblingV5/DouTok/applications/favorite/rpc"
"github.com/TremblingV5/DouTok/config/configStruct"
"github.com/TremblingV5/DouTok/kitex_gen/favorite/favoriteservice"
"github.com/TremblingV5/DouTok/pkg/DouTokContext"
"github.com/TremblingV5/DouTok/pkg/DouTokLogger"
"github.com/TremblingV5/DouTok/pkg/constants"
"github.com/TremblingV5/DouTok/pkg/dtviper"
"github.com/TremblingV5/DouTok/pkg/services"
"go.uber.org/zap"
"reflect"
)

type Config struct {
Base configStruct.Base `envPrefix:"DOUTOK_FAVORITE_"`
Etcd configStruct.Etcd `envPrefix:"DOUTOK_FAVORITE_"`
Jwt configStruct.Jwt `envPrefix:"DOUTOK_FAVORITE_"`
Otel configStruct.Otel `envPrefix:"DOUTOK_FAVORITE_"`
Server configStruct.Base
Etcd configStruct.Etcd
Otel configStruct.Otel
}

type LoggerConfig struct {
Logger configStruct.Logger `envPrefix:"DOUTOK_FAVORITE_"`
}

var (
logger *zap.Logger
config = &Config{}
logger *zap.Logger
favoriteConfig Config
logcfg LoggerConfig
viperConfig *dtviper.Config
)

func init() {
ctx := context.Background()
cfg, err := configStruct.Load[*Config](ctx, &Config{})
config = cfg
logger = DouTokLogger.InitLogger(config.Logger)
favoriteConfig = Config{}
logcfg = LoggerConfig{}
viperConfig = dtviper.ConfigInit("DOUTOK_FAVORITE", "favorite")
viperConfig.UnmarshalStructTags(reflect.TypeOf(favoriteConfig), "")
viperConfig.UnmarshalStruct(&favoriteConfig)

logcfg, err := configStruct.Load[*LoggerConfig](ctx, &logcfg)

logger = DouTokLogger.InitLogger(logcfg.Logger)
DouTokContext.DefaultLogger = logger
DouTokContext.AddLoggerToContext(ctx, logger)
if err != nil {
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", config))
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", logcfg))
}
}

func main() {
options, shutdown := services.InitRPCServerArgs(constants.FAVORITE_SERVER_NAME, config.Base, config.Etcd, config.Otel)

options, shutdown := services.InitRPCServerArgs(constants.FAVORITE_SERVER_NAME, favoriteConfig.Server, favoriteConfig.Etcd, favoriteConfig.Otel)
defer shutdown()

svr := favoriteservice.NewServer(
handler.New(rpc.New(services.InitRPCClientArgs(constants.FAVORITE_SERVER_NAME, config.Etcd))),
handler.New(rpc.New(services.InitRPCClientArgs(constants.FAVORITE_SERVER_NAME, favoriteConfig.Etcd))),
options...,
)

Expand Down
46 changes: 26 additions & 20 deletions applications/user/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,52 +2,58 @@ package main

import (
"context"

"go.uber.org/zap"

"github.com/TremblingV5/DouTok/applications/user/handler"
"github.com/TremblingV5/DouTok/applications/user/rpc"
"github.com/TremblingV5/DouTok/config/configStruct"
"github.com/TremblingV5/DouTok/kitex_gen/user/userservice"
"github.com/TremblingV5/DouTok/pkg/DouTokContext"
"github.com/TremblingV5/DouTok/pkg/DouTokLogger"
"github.com/TremblingV5/DouTok/pkg/constants"
"github.com/TremblingV5/DouTok/pkg/dtviper"
"github.com/TremblingV5/DouTok/pkg/services"
"go.uber.org/zap"
"reflect"
)

type Config struct {
Base configStruct.Base `envPrefix:"DOUTOK_USER_"`
Etcd configStruct.Etcd `envPrefix:"DOUTOK_USER_"`
Jwt configStruct.Jwt `envPrefix:"DOUTOK_USER_"`
MySQL configStruct.MySQL `envPrefix:"DOUTOK_USER_"`
Snowflake configStruct.Snowflake `envPrefix:"DOUTOK_USER_"`
HBase configStruct.HBase `envPrefix:"DOUTOK_USER_"`
Redis configStruct.Redis `envPrefix:"DOUTOK_USER_"`
Otel configStruct.Otel `envPrefix:"DOUTOK_USER_"`
Logger configStruct.Logger `envPrefix:"DOUTOK_USER_"`
Server configStruct.Base
Etcd configStruct.Etcd
Otel configStruct.Otel
}

type LoggerConfig struct {
Logger configStruct.Logger `envPrefix:"DOUTOK_USER_"`
}

var (
logger *zap.Logger
config = &Config{}
logger *zap.Logger
userConfig Config
logcfg LoggerConfig
viperConfig *dtviper.Config
)

func init() {
ctx := context.Background()
cfg, err := configStruct.Load[*Config](ctx, &Config{})
config = cfg
logger = DouTokLogger.InitLogger(config.Logger)
userConfig = Config{}
logcfg = LoggerConfig{}
viperConfig = dtviper.ConfigInit("DOUTOK_USER", "user")
viperConfig.UnmarshalStructTags(reflect.TypeOf(userConfig), "")
viperConfig.UnmarshalStruct(&userConfig)

logcfg, err := configStruct.Load[*LoggerConfig](ctx, &logcfg)

logger = DouTokLogger.InitLogger(logcfg.Logger)
DouTokContext.DefaultLogger = logger
DouTokContext.AddLoggerToContext(ctx, logger)
if err != nil {
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", config))
logger.Fatal("could not load env variables", zap.Error(err), zap.Any("config", logcfg))
}
}

func main() {
clients := rpc.New(services.InitRPCClientArgs(constants.USER_SERVER_NAME, config.Etcd))
clients := rpc.New(services.InitRPCClientArgs(constants.USER_SERVER_NAME, userConfig.Etcd))

options, shutdown := services.InitRPCServerArgs(constants.USER_SERVER_NAME, config.Base, config.Etcd, config.Otel)
options, shutdown := services.InitRPCServerArgs(constants.USER_SERVER_NAME, userConfig.Server, userConfig.Etcd, userConfig.Otel)
defer shutdown()

svr := userservice.NewServer(handler.New(clients), options...)
Expand Down
Loading

0 comments on commit 25303f7

Please sign in to comment.