如何实现Golang的http请求处理中间件

Python014

如何实现Golang的http请求处理中间件,第1张

大多数现代Web组件栈允许通过栈式/组件式中间件“过滤”请求,这样就能干净地从web应用中分离出横切关注点(译注:面向方面程序设计中的概念?)。 本周我尝试在Go语言的 http.FileServer 中植入钩子,发现实现起来十分简便,让我非常惊讶。

让我们从一个基本的文件服务器开始说起:

func main() {

http.ListenAndServe(":8080", http.FileServer(http.Dir("/tmp")))

}

为什么突然又绕到了apisix,其实是因为调研nginx-ingress就很容易联想到是不是要替换为其他网关ingress实现,比如apisix-ingress,进而想到的肯定是apisix;

这些概念到底有什么区别?

apisix 和 apisix-ingress-controller: apisix是一套体系,apisix-ingress-controller是k8s环境下基于go语言开发的一套自定义CRD,他负责响应apisix自定义资源的创建,监听k8s服务资源的创建变更,同步到apisix网关,apisix网关本身由openresty、nginx组成,主要是由Lua语言在nginx执行的各个阶段插入钩子,实现动态化,且基于etcd+灵活的插件机制,让变更更灵活且立即生效;

nginx-ingress和apisix-ingress-controller: nginx-ingress是k8s体系中目前使用最广的路由网关,比如阿里默认的控制台ingress创建就是使用的它;他集合了nginx+nginx-ingress-controller,拉代码可以看出,nginx-ingress-controller完成了与k8sapiserver交互,获取最新的服务配置变更,生成最新nginx配置,除此之外的通讯机制是通过Httppost请求将变更通知到到luanginx侧,ngx.timer在balancer中通过定时器进行动态化

apisix-ingress-controller监控k8s服务变更、自定义CRD及资源创建、将配置同步到apisix;网络请求通过apisix网关作为入口,通过apisix-ingress-controller同步k8s的上游变更

apisix比其他的有啥好?插件灵活,功能多,周边