go-wind-bootstrap 支持通过 YAML 声明中间件链,无需在代码中手动编排。
server:
http:
addr: ":8080"
middleware:
- cors
- logger
- recovery
- request_id
- tracing
- rate_limit
- jwt_auth
- metrics
| 名称 | 说明 | 配置前缀 |
|---|
cors | 跨域资源共享 | middleware.cors |
logger | 请求日志 | middleware.logger |
recovery | Panic 恢复 | middleware.recovery |
request_id | 请求 ID 注入 | middleware.request_id |
gzip | 响应压缩 | middleware.gzip |
| 名称 | 说明 | 配置前缀 |
|---|
jwt_auth | JWT 认证 | middleware.jwt_auth |
casbin | RBAC 授权 | middleware.casbin |
rate_limit | 限流 | middleware.rate_limit |
helmet | 安全头 | middleware.helmet |
| 名称 | 说明 | 配置前缀 |
|---|
tracing | 链路追踪 | middleware.tracing |
metrics | 指标采集 | middleware.metrics |
prometheus | Prometheus 指标 | middleware.prometheus |
middleware:
cors:
allow_origins:
- "https://app.example.com"
- "https://admin.example.com"
allow_methods: [GET, POST, PUT, DELETE, OPTIONS]
allow_headers: [Authorization, Content-Type, X-Trace-ID]
allow_credentials: true
expose_headers: [X-Total-Count]
max_age: 86400
middleware:
logger:
format: json
skip_paths:
- /health
- /metrics
output: stdout
fields:
service: my-service
middleware:
recovery:
stack_all: false
stack_size: 4096
log_level: error
middleware:
request_id:
header: X-Request-ID
generate: true
format: uuid
middleware:
jwt_auth:
signing_method: HS256
key: ${JWT_SECRET}
skip_paths:
- /api/login
- /api/register
- /health
token_lookup: header:Authorization
token_prefix: Bearer
middleware:
rate_limit:
strategy: token_bucket
rate: 100
burst: 50
key_type: ip
skip_paths:
- /health
- /metrics
middleware:
tracing:
tracer: jaeger
skip_paths:
- /health
- /metrics
middleware:
metrics:
path: /metrics
namespace: myapp
buckets: [0.01, 0.05, 0.1, 0.5, 1, 5]
package audit
import (
"net/http"
"github.com/tx7do/go-wind-bootstrap/middleware"
)
func AuditLog(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
auditLogger.Log(r.Method, r.URL.Path, r.RemoteAddr)
next.ServeHTTP(w, r)
})
}
func init() {
middleware.Register("audit_log", AuditLog)
}
server:
http:
middleware:
- cors
- jwt_auth
- audit_log
type AuditConfig struct {
LogLevel string `yaml:"log_level"`
SkipPaths []string `yaml:"skip_paths"`
}
func AuditLog(config AuditConfig) middleware.Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if contains(config.SkipPaths, r.URL.Path) {
next.ServeHTTP(w, r)
return
}
next.ServeHTTP(w, r)
})
}
}
func init() {
middleware.RegisterWithConfig("audit_log", func(raw map[string]interface{}) middleware.Middleware {
cfg := AuditConfig{}
mapstructure.Decode(raw, &cfg)
return AuditLog(cfg)
})
}
middleware:
audit_log:
log_level: info
skip_paths:
- /health
server:
http:
middleware:
- recovery
- cors
- request_id
- tracing
- logger
- rate_limit
- jwt_auth
- audit_log
洋葱模型:请求按声明顺序穿过每一层,响应按逆序返回。
routes:
- path: /api/public/*
middleware: [cors, logger]
- path: /api/admin/*
middleware: [cors, logger, jwt_auth, casbin]
- path: /api/internal/*
middleware: [cors, logger, ip_whitelist]