Golang ReverseProxy 如何实现反向代理?

2022-12-22 1580阅读

温馨提示:这篇文章已超过830天没有更新,请注意相关的内容是否还可用!

如果❤️我的文章对您有帮助,请点赞关注。 这是对我继续技术创作最大的鼓励。 更多系列文章在我的博客[1]

Golang ReverseProxy源码初探

高朗版本 1.16

使用ReverseProxy实现反向代理的例子

‍♀️废话不多说,直接举例

测试代理服务器

$ curl 'http://127.0.0.1:2002/sda?sda=111'
# 2003 设置了 打印请求地址代码: upath := fmt.Sprintf("http://%s%s\n", r.Addr, req.URL.Path)
http://127.0.0.1:2003/base/sda
RemoteAddr=127.0.0.1:51738,X-Forwarded-For=127.0.0.1,X-Real-Ip=
headers =map[Accept:[*/*] Accept-Encoding:[gzip] User-Agent:[curl/7.69.1] X-Forwarded-For:[127.0.0.1]]

查看httputil.NewSingleHostReverseProxy()函数,可以找到ReverseProxy的源码。 文件 go/src/net/http/httputil/reverseproxy.go 位于此路径

核心源码ReverseProxy结构

用于处理请求的 ReverseProxy 方法 ServeHTTP()

ReverseProxy 实现了 ServeHTTP() 方法,当请求到达代理服务器代理服务器,最终会被监听方法 ListenAndServe() 调用。 调用链接是:

http.ListenAndServe(addr string, handler Handler)  
-> Server.ListenAndServeTLS(certFile, keyFile) 
-> Server.ServeTLS(ln, certFile, keyFile)
-> Server.Serve(l net.Listener)
-> go c.serve(connCtx)
-> serverHandler{c.server}.ServeHTTP(w, w.req)

所以ReverseProxy结构体也实现了ServeHTTP方法,该方法的作用是:

1.将上游请求的上下文复制到下游请求 2.使用指定的director(修改请求的函数)修改请求(如协议、参数、url等) 3.根据请求Header[ "Connection"]判断是否升级协议(Upgrade) 4.删除上游请求中的hop-by-hop Header,保持上游持久(相对)连接,不需要透传给下游 5.设置X-Forward-For Header,添加当前节点IP6。 使用连接池发送 Downstream 发起请求 7. 处理httpcode 101 协议升级:(WebSocket, h2c等) 8. 删除请求中的hop-by-hop Header代理服务器,不返回upstream 9. 判断是否根据结构ReverseProxy.ModifyResponse(function)修改响应体内容 10.复制下游响应头到上游响应请求 11.返回下游请求的HTTP状态码 12.复制下游响应内容到上游响应request 13.刷新内容到response

其他源码NewSingleHostReverseProxy函数

NewSingleHostReverseProxy中的URL拼接方法

参考

[1] 更多系列文章在我的博客:

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]