调整工厂模式的方法
This commit is contained in:
@@ -34,6 +34,12 @@ go get git.toowon.com/jimmy/go-common@latest
|
||||
"level": "info",
|
||||
"output": "stdout",
|
||||
"async": true
|
||||
},
|
||||
"rateLimit": {
|
||||
"enable": true,
|
||||
"rate": 100,
|
||||
"period": 60,
|
||||
"byIP": true
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -61,18 +67,12 @@ func main() {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// 获取logger
|
||||
logger, _ := fac.GetLogger()
|
||||
defer logger.Close()
|
||||
// 使用factory的黑盒方法获取中间件链
|
||||
// 自动从配置文件读取并配置所有中间件
|
||||
chain := fac.GetMiddlewareChain()
|
||||
|
||||
// 配置中间件链
|
||||
chain := middleware.NewChain(
|
||||
middleware.Recovery(&middleware.RecoveryConfig{Logger: logger}),
|
||||
middleware.Logging(&middleware.LoggingConfig{Logger: logger}),
|
||||
middleware.RateLimitByIP(100, time.Minute),
|
||||
middleware.CORS(nil),
|
||||
middleware.Timezone,
|
||||
)
|
||||
// (可选)如果项目需要额外的中间件,可以继续添加
|
||||
// chain.Append(yourAuthMiddleware, yourMetricsMiddleware)
|
||||
|
||||
// 注册路由
|
||||
http.Handle("/api/hello", chain.ThenFunc(handleHello))
|
||||
@@ -284,21 +284,57 @@ loggerConfig := &config.LoggerConfig{
|
||||
}
|
||||
```
|
||||
|
||||
### Q: 如何按用户ID限流?
|
||||
### Q: 如何添加自定义中间件?
|
||||
|
||||
```go
|
||||
limiter := middleware.NewTokenBucketLimiter(100, time.Minute)
|
||||
rateLimitConfig := &middleware.RateLimitConfig{
|
||||
Limiter: limiter,
|
||||
KeyFunc: func(r *http.Request) string {
|
||||
return r.Header.Get("X-User-ID")
|
||||
},
|
||||
}
|
||||
chain := middleware.NewChain(
|
||||
middleware.RateLimit(rateLimitConfig),
|
||||
// 获取基础中间件链
|
||||
chain := fac.GetMiddlewareChain()
|
||||
|
||||
// 添加自定义中间件
|
||||
chain.Append(
|
||||
yourAuthMiddleware, // 认证中间件
|
||||
yourMetricsMiddleware, // 指标中间件
|
||||
// 更多自定义中间件...
|
||||
)
|
||||
|
||||
// 使用扩展后的中间件链
|
||||
http.Handle("/api/secure", chain.ThenFunc(yourHandler))
|
||||
```
|
||||
|
||||
自定义中间件示例:
|
||||
|
||||
```go
|
||||
func authMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
token := r.Header.Get("Authorization")
|
||||
if token == "" {
|
||||
http.Error(w, "Unauthorized", 401)
|
||||
return
|
||||
}
|
||||
// 验证token...
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### Q: 如何按用户ID限流?
|
||||
|
||||
在配置文件中设置:
|
||||
|
||||
```json
|
||||
{
|
||||
"rateLimit": {
|
||||
"enable": true,
|
||||
"rate": 100,
|
||||
"period": 60,
|
||||
"byUserID": true,
|
||||
"byIP": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
中间件会自动从 `X-User-ID` header 中获取用户ID进行限流。
|
||||
|
||||
## 下一步
|
||||
|
||||
恭喜!你已经掌握了 GoCommon 的基本使用。
|
||||
|
||||
Reference in New Issue
Block a user