在微服务框架kratos中,通过中间件对请求进行扩展处理。有点像java里的servlet,也是用的责任链实现的,但实现方式很巧妙,这里详细说一下。
┌───────────────────┐
│MIDDLEWARE 1 │
│ ┌────────────────┐│
│ │MIDDLEWARE 2 ││
│ │ ┌─────────────┐││
│ │ │MIDDLEWARE 3 │││
│ │ │ ┌─────────┐ │││
REQUEST │ │ │ │ YOUR │ │││ RESPONSE
──────┼─┼─┼─▷ HANDLER ○─┼┼┼───▷
│ │ │ └─────────┘ │││
│ │ └─────────────┘││
│ └────────────────┘│
└───────────────────┘
type Handler func(ctx context.Context, req interface{}) (interface{}, error)
type Middleware func(Handler) Handler
func loggingMiddleware(handler Handler) Handler {
return func(ctx context.Context, req interface{}) (interface{}, error) {
println("logging middleware in, req:", req.(string))
reply, err := handler(ctx, req)
println("logging middleware out, reply:", reply.(string))
return reply, err
}
}
func authMiddleware(handler Handler) Handler {
return func(ctx context.Context, req interface{}) (interface{}, error) {
println("auth middleware in, req:", req.(string))
reply, err := handler(ctx, req)
println("auth middleware out, reply:", reply.(string))
return reply, err
}
}
func Chain(m ...Middleware) Middleware {
return func(next Handler) Handler {
for i := len(m) - 1; i >= 0; i-- {
next = m[i](next)
}
return next
}
}
func main() {
controllerHandler := func(ctx context.Context, req interface{}) (interface{}, error) {
println("hand req")
return "hello " + req.(string), nil
}
handlerChain := Chain(loggingMiddleware, authMiddleware)
chainHeader := handlerChain(controllerHandler)
req := "world"
println("send req:", req)
reply, _ := chainHeader(context.Background(), req)
println("received: ", reply.(string))
}
Post Views: 4