8.01 课后复习-AOP
对责任链模式不太了解的读者建议先翻看一下责任链模式简介
PART1. 非集中式的设计方案--洋葱模式
1.1 定义Middleware
middleware.go:
package web
// Middleware 中间件
type Middleware func(HandleFunc) HandleFunc这种入参和返回值均为函数类型的设计,是函数式编程.
1.2 编排Middleware的顺序
实际上这一步就是将多个Middleware组建成一条责任链
1.2.1 定义中间件链
httpServer.go:
package web
import (
"net"
"net/http"
)
// HTTPServer HTTP服务器
type HTTPServer struct {
router // router 路由树
middlewares []Middleware // middlewares Server级别的中间件链 实际上就是责任链 所有的请求都会经过这个链的处理
}1.2.2 构建中间件链
需要注意的是,构建中间件链的顺序,和中间件的执行顺序是相反的.换言之,也就是说最后一个被执行的中间件是最先被组装到责任链上的
httpServer.go:
这里之所以要先找到请求对应的HandleFunc,是因为请求在经过了整条中间件链后,最终还是要去执行这个HandleFunc.
你可能有所疑问的地方在于:如果我找不到请求对应的HandleFunc,那为什么还要走这一整条中间件链?
我个人的理解是:因为这条中间件链是Server级别的.就如同Nginx的access.log,即使访问了一个不存在的url,同样也会在access.log中记录一条404的日志
PART2. 测试
middleware_test.go:
测试结果:
Last updated