dobyte/due

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]

我在本地修改以下代码可以实现

  1. 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
	}

  1. 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

感谢你的代码分享,已经做出了相应修改