关于golang
的http
中间件与java
, python
等有区别, 特别是自go
引入了context概念之后,在实际开发中也遇到过不少问题, 以下作记录:
- 不同的开发框架如net/http, chi, iris, 其中间件写法大同小异, 均返回http.Handler,(因此在
go web
开发过程中,框架切换比较轻松),类似:
func exampleMiddleware(message string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
. ..
w.Write([]byte(message)
})
}
可见其跟处理业务的handler
区别不大。
-
chi中提供了不少中间件的example事例, 包括限流、限
ip
、logger
和timeout
等, 其实现逻辑非常简洁, 日常开发中大部分中间件的开发参考此实现源码便足够。 -
example事例中的中间件数据传递方向均为
from middleware to middleware/handler
, 这里不作举例。 -
中间件值传递之
from middleware to middleware/handler
。golang
引入了context特性(context的使用规范详见此), 对每个http.Request 均带