feat: load explicit configuration references and remove implicit env overlays

This commit is contained in:
2026-09-26 16:14:54 +08:00
parent 4bf6e88cfe
commit d598b2ebee
94 changed files with 1355 additions and 1759 deletions

View File

@@ -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
```

View 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

View File

@@ -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

View File

@@ -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)
}
}