Middleware调用顺序
Zekiee opened this issue · 1 comments
Zekiee commented
版本:v2
问题:使用Middleware时,会在Middleware调用栈全部结束之后才调用业务逻辑,希望能在Middleware栈最深处就调用业务。
n.Proxy().Router().Group(func(group *node.RouterGroup) {
group.Middleware(middleware.RecordMetric1)
group.Middleware(middleware.RecordMetric2)
group.AddRouteHandler(int32(pb_lobby.ROUTE_Echo1), false, EchoHandler)
})
// RecordMetric1 指标
func RecordMetric1(ctx *node.Context) {
logger.Info("RecordMetric1 in")
start := time.Now()
ctx.Middleware.Next(ctx)
logger.Info("RecordMetric1 out", time.Since(start))
}
// RecordMetric2 指标
func RecordMetric2(ctx *node.Context) {
logger.Info("RecordMetric2 in")
start := time.Now()
ctx.Middleware.Next(ctx)
logger.Info("RecordMetric2 out", time.Since(start))
}
func EchoHandler(ctx *node.Context) {
logger.Info("EchoHandler in")
time.Sleep(2 * time.Second)
logger.Info("EchoHandler out")
}
得到的日志
[RecordMetric1 in]
[RecordMetric2 in]
[RecordMetric2 out 128ns]
[RecordMetric1 out 121.798µs]
[EchoHandler in]
[EchoHandler out]
期望得到
[RecordMetric1 in]
[RecordMetric2 in]
[EchoHandler in]
[EchoHandler out]
[RecordMetric2 out 128ns]
[RecordMetric1 out 121.798µs]
我在本地修改以下代码可以实现
- cluster/node/middleware.go
type Middleware struct {
index int
middlewares []MiddlewareHandler
+ routeHandler RouteHandler
}
// 重置中间件
-func (m *Middleware) reset(middlewares []MiddlewareHandler) {
+func (m *Middleware) reset(middlewares []MiddlewareHandler, routeHandler RouteHandler) {
m.index = -1
m.middlewares = middlewares
+ m.routeHandler = routeHandler
}
func (m *Middleware) Skip(ctx *Context, skip int) {
m.index += skip
if m.isFinished() {
+ m.routeHandler(ctx)
return
}
- cluster/node/router.go
if ok {
if len(route.middlewares) > 0 {
- ctx.Middleware.reset(route.middlewares)
+ ctx.Middleware.reset(route.middlewares, route.handler)
ctx.Middleware.Next(ctx)
-
- if ctx.Middleware.isFinished() {
- route.handler(ctx)
- }
} else {
dobyte commented
感谢你的代码分享,已经做出了相应修改