学习Golang的HTTP中间件机制

栏目: Go · 发布时间: 5年前

内容简介:因为 Golang 内置的假如你不了解 Golang 的 HTTP 中间件机制的话,那么可以把它看成是一个洋葱:每一个中间件都是一层洋葱皮,其中每一个中间件都可以改变请求和响应,我们可以很自然的把不同的业务逻辑放到不同的洋葱皮里,下面看看例子:

因为 Golang 内置的 net/http 天生就支持 HTTP 中间件机制,所以即便不用 gin 之类的 Web 框架,我们也可以写出扩展性很好的 Web 应用。

假如你不了解 Golang 的 HTTP 中间件机制的话,那么可以把它看成是一个洋葱:

学习Golang的HTTP中间件机制

通过洋葱看中间件

每一个中间件都是一层洋葱皮,其中每一个中间件都可以改变请求和响应,我们可以很自然的把不同的业务逻辑放到不同的洋葱皮里,下面看看例子:

package main

import (
	"net/http"
)

func foo(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("foo("))
		next(w, r)
		w.Write([]byte(")"))
	}
}

func bar(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("bar("))
		next(w, r)
		w.Write([]byte(")"))
	}
}

func test(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("test"))
}

func main() {
	http.Handle("/test", foo(bar(test)))
	http.ListenAndServe(":8080", nil)
}

运行结果显示如下,它形象的说明了中间件的执行过程:

foo(bar(test))

联想一下洋葱的结构,基本就能明白 Golang 的 HTTP 中间件机制了,不过不爽的是构建方式不易扩展,假如中间件很多的话,视觉上会呈现出复杂的嵌套,比如:

middleware(middleware(middleware(middleware(handler))))

我可不想维护这样的代码,下面看看如何简化编码方式:

func main() {
	http.Handle("/test", new(foo).pipe(bar).process(test))
	http.ListenAndServe(":8080", nil)
}

type middleware func(http.HandlerFunc) http.HandlerFunc

type pipeline struct {
	middlewares []middleware
}

func new(ms ...middleware) pipeline {
	return pipeline{append([]middleware(nil), ms...)}
}

func (p pipeline) pipe(ms ...middleware) pipeline {
	return pipeline{append(p.middlewares, ms...)}
}

func (p pipeline) process(h http.HandlerFunc) http.HandlerFunc {
	for i := range p.middlewares {
		h = p.middlewares[len(p.middlewares)-1-i](h)
	}

	return h
}

对比一下在修改代码前后调用方式发生了什么改变,:

  • 修改前:foo(bar(test))
  • 修改后:new(foo).pipe(bar).process(test)

虽然表面上看好像代码更长了,但是对代码的可维护性而言,这并不是问题的关键,重要的是通过使用 Pipeline 模式,我们把原本嵌套结构改成了链式结构。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

操作系统基础教程

操作系统基础教程

戴维斯 / 第1版 (2006年7月1日) / 2006-7 / 34.0

这是一本关于操作系统基本原理的教科书,其最大特点就是从操作系统的分层概念出发,深入浅出地介绍了操作系统的基本概念和基本框架。本书可以作为高等院校非计算机专业相关课程的教材或参考书,也适合具有高中以上数学基础的计算机用户自学,还可以作为社会上计算机培训机构的教材。对所有想了解计算机操作系统,但又不需要或不打算深入学习其理论和实现细节的读者来说,本书是一本极具价值的入门指导书。一起来看看 《操作系统基础教程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具