mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-10-17 02:41:43 +00:00
The limiter is installed on the engine and the probes are routes like any other, so above the threshold they are answered with 429 too. Point a liveness probe at one and the failure mode writes itself: traffic crosses the threshold, the probe collects three 429s, the kubelet restarts the container, the capacity that was already short gets shorter, and the instances that are left are pushed further past the threshold. The limiter working exactly as designed is what kills the pod. It is the argument common/health already makes about restarting a process whose database is unreachable, applied to load: turning one outage into a crash loop is not an improvement on the outage. Nothing points a liveness probe at these routes yet. The manifest that will is two commits away, and this has to land first, because that manifest without this change would be actively harmful. The exemption wraps the middleware rather than teaching the limiter about these paths. common/ may not import app/ - the contract check enforces it - so the limiter cannot name routes that are registered over there. Wrapping it in the command package, which imports both, is what keeps the boundary. Naming those routes needs them exported, so the group prefix and the two paths become constants and the router function becomes RegisterMonitorRouter. That also gives a test something real to mount: a probe asserted against a re-implementation of itself is a test of the copy. The check that the middleware never runs is separate from the check that the answer is not 429, because a probe can produce a 429 on its own. What has to be true is that the request never reached the limiter.
50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package router
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
jwt "github.com/go-admin-team/go-admin-core/v2/jwtauth"
|
|
)
|
|
|
|
var (
|
|
routerNoCheckRole = make([]func(*gin.RouterGroup), 0)
|
|
routerCheckRole = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)
|
|
)
|
|
|
|
// APIPrefix is the group every route below is registered under.
|
|
//
|
|
// Exported because the middleware chain in cmd/api has to name two of those
|
|
// routes in full - the rate limiter is installed on the engine and must skip
|
|
// the probes - and a prefix spelled in two places is a prefix that drifts.
|
|
const APIPrefix = "/api/v1"
|
|
|
|
// initRouter 路由示例
|
|
func initRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {
|
|
|
|
// 无需认证的路由
|
|
noCheckRoleRouter(r)
|
|
// 需要认证的路由
|
|
checkRoleRouter(r, authMiddleware)
|
|
|
|
return r
|
|
}
|
|
|
|
// noCheckRoleRouter 无需认证的路由示例
|
|
func noCheckRoleRouter(r *gin.Engine) {
|
|
// 可根据业务需求来设置接口版本
|
|
v1 := r.Group(APIPrefix)
|
|
|
|
for _, f := range routerNoCheckRole {
|
|
f(v1)
|
|
}
|
|
}
|
|
|
|
// checkRoleRouter 需要认证的路由示例
|
|
func checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) {
|
|
// 可根据业务需求来设置接口版本
|
|
v1 := r.Group(APIPrefix)
|
|
|
|
for _, f := range routerCheckRole {
|
|
f(v1, authMiddleware)
|
|
}
|
|
}
|