feat: load explicit configuration references and remove implicit env overlays
This commit is contained in:
@@ -10,10 +10,10 @@
|
||||
go run ./examples/reference
|
||||
```
|
||||
|
||||
默认监听 `127.0.0.1:8080`,可通过环境变量调整:
|
||||
默认读取 `examples/reference/config.yaml`,监听 `127.0.0.1:8080`。文件已显式引用地址变量:
|
||||
|
||||
```sh
|
||||
GO_OMNI_ADDR=127.0.0.1:8081 go run ./examples/reference
|
||||
GO_OMNI_HTTP_ADDR=127.0.0.1:8081 go run ./examples/reference
|
||||
```
|
||||
|
||||
如果终端提示找不到 `go`,需要先把 Go 的 `bin` 目录加入 `PATH`。不要与 `examples/basic` 同时占用同一个端口。
|
||||
@@ -133,14 +133,10 @@ curl -i http://127.0.0.1:8080/api/v1/users/1
|
||||
- 列表按 ID 排序、返回总数,空列表使用 `[]`。
|
||||
- 使用传入的 `context.Context` 执行查询,保留创建时间,修改时更新时间。
|
||||
|
||||
MySQL 运行配置通过环境变量传入:
|
||||
此手写示例显式读取 `GO_OMNI_DB_DSN`;驱动固定 mysql,连接池使用 database.DefaultConfig()。项目可将数据库配置放入自己的 Config 并通过 LoadProject 统一加载(见 [配置指南](../../CONFIG.md)),框架不再自动读取数据库环境变量:
|
||||
|
||||
```sh
|
||||
export GO_OMNI_DB_DRIVER=mysql
|
||||
export GO_OMNI_DB_DSN='root:password@tcp(127.0.0.1:3306)/go_omni?parseTime=true&loc=UTC'
|
||||
export GO_OMNI_DB_MAX_OPEN_CONNS=10
|
||||
export GO_OMNI_DB_MAX_IDLE_CONNS=5
|
||||
export GO_OMNI_DB_PING_TIMEOUT=5s
|
||||
go run ./examples/reference
|
||||
```
|
||||
|
||||
|
||||
9
examples/reference/config.yaml
Normal file
9
examples/reference/config.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
address: "${GO_OMNI_HTTP_ADDR:-127.0.0.1:8080}"
|
||||
transport: "${GO_OMNI_TRANSPORT:-nethttp}"
|
||||
tls:
|
||||
certFile: "${GO_OMNI_TLS_CERT_FILE:-}"
|
||||
keyFile: "${GO_OMNI_TLS_KEY_FILE:-}"
|
||||
log:
|
||||
service: reference-api
|
||||
environment: local
|
||||
output: stdout
|
||||
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
@@ -42,6 +43,7 @@ func registerRoutes(application *omni.App, users service.UserRepository, logger
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
if err := runReference(ctx); err != nil {
|
||||
@@ -49,29 +51,9 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
func referenceConfig() (omni.Config, error) {
|
||||
settings, err := omni.LoadConfig("")
|
||||
if err != nil {
|
||||
return settings, err
|
||||
}
|
||||
// Preserve the example's loopback default and legacy address variable.
|
||||
if strings.TrimSpace(os.Getenv("GO_OMNI_HTTP_ADDR")) == "" {
|
||||
settings.Address = strings.TrimSpace(os.Getenv("GO_OMNI_ADDR"))
|
||||
if settings.Address == "" {
|
||||
settings.Address = "127.0.0.1:8080"
|
||||
}
|
||||
}
|
||||
if settings.Log.Service == "" {
|
||||
settings.Log.Service = "reference-api"
|
||||
}
|
||||
if settings.Log.Environment == "" {
|
||||
settings.Log.Environment = "local"
|
||||
}
|
||||
if strings.TrimSpace(os.Getenv("GO_OMNI_LOG_OUTPUT")) == "" {
|
||||
settings.Log.Output = "stdout"
|
||||
}
|
||||
return settings, nil
|
||||
}
|
||||
var configPath = flag.String("config", "examples/reference/config.yaml", "configuration file")
|
||||
|
||||
func referenceConfig() (omni.Config, error) { return omni.LoadConfig(*configPath) }
|
||||
|
||||
func runReference(ctx context.Context) error {
|
||||
settings, err := referenceConfig()
|
||||
@@ -106,10 +88,9 @@ func openUsers(ctx context.Context, logger *logx.Logger) (service.UserRepository
|
||||
if strings.TrimSpace(os.Getenv("GO_OMNI_DB_DSN")) == "" {
|
||||
return repository.NewMemoryUsers(), func() error { return nil }, "memory", nil
|
||||
}
|
||||
cfg, err := database.ConfigFromEnv("GO_OMNI_DB_")
|
||||
if err != nil {
|
||||
return nil, nil, "", err
|
||||
}
|
||||
cfg := database.DefaultConfig()
|
||||
cfg.Driver = "mysql"
|
||||
cfg.DSN = os.Getenv("GO_OMNI_DB_DSN")
|
||||
db, err := database.Open(ctx, cfg)
|
||||
if err != nil {
|
||||
return nil, nil, "", err
|
||||
|
||||
@@ -7,6 +7,8 @@ import (
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
@@ -99,7 +101,11 @@ func TestBusinessConfiguredTransports(t *testing.T) {
|
||||
t.Setenv("REFERENCE_TEST_TLS_CERT_FILE", cert)
|
||||
t.Setenv("REFERENCE_TEST_TLS_KEY_FILE", key)
|
||||
}
|
||||
settings, err := omni.LoadConfig("REFERENCE_TEST_")
|
||||
path := filepath.Join(t.TempDir(), "config.yaml")
|
||||
if err := os.WriteFile(path, []byte("transport: ${REFERENCE_TEST_TRANSPORT}\nshutdownTimeout: 3s\ntls:\n certFile: \"${REFERENCE_TEST_TLS_CERT_FILE:-}\"\n keyFile: \"${REFERENCE_TEST_TLS_KEY_FILE:-}\""), 0600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
settings, err := omni.LoadConfig(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -159,24 +165,26 @@ func TestBusinessConfiguredTransports(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestReferenceAddressCompatibility(t *testing.T) {
|
||||
func TestReferenceExplicitConfig(t *testing.T) {
|
||||
previous := *configPath
|
||||
*configPath = "config.yaml"
|
||||
defer func() { *configPath = previous }()
|
||||
t.Setenv("GO_OMNI_TRANSPORT", "native")
|
||||
t.Setenv("GO_OMNI_HTTP_ADDR", "")
|
||||
t.Setenv("GO_OMNI_TLS_CERT_FILE", "")
|
||||
t.Setenv("GO_OMNI_TLS_KEY_FILE", "")
|
||||
t.Setenv("GO_OMNI_HTTP_ADDR", "")
|
||||
t.Setenv("GO_OMNI_ADDR", "")
|
||||
settings, err := referenceConfig()
|
||||
if err != nil || settings.Address != "127.0.0.1:8080" || settings.Transport != "native" {
|
||||
t.Fatalf("default: %+v %v", settings, err)
|
||||
c, err := referenceConfig()
|
||||
if err != nil || c.Address != "127.0.0.1:8080" || c.Transport != "native" {
|
||||
t.Fatal(c, err)
|
||||
}
|
||||
t.Setenv("GO_OMNI_ADDR", "127.0.0.1:8081")
|
||||
settings, err = referenceConfig()
|
||||
if err != nil || settings.Address != "127.0.0.1:8081" {
|
||||
t.Fatalf("legacy: %+v %v", settings, err)
|
||||
t.Setenv("GO_OMNI_ADDR", "127.0.0.1:1234")
|
||||
c, err = referenceConfig()
|
||||
if err != nil || c.Address != "127.0.0.1:8080" {
|
||||
t.Fatal("implicit alias", err)
|
||||
}
|
||||
t.Setenv("GO_OMNI_HTTP_ADDR", "127.0.0.1:8082")
|
||||
settings, err = referenceConfig()
|
||||
if err != nil || settings.Address != "127.0.0.1:8082" {
|
||||
t.Fatalf("standard: %+v %v", settings, err)
|
||||
c, err = referenceConfig()
|
||||
if err != nil || c.Address != "127.0.0.1:8082" {
|
||||
t.Fatal(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user