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