您的位置 首页 golang

Golang ReverseProxy 如何实现反向代理?

初探 Golang ReverseProxy 源码

Golang 版本 1.16

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

‍♀️不废话, 直接举例

测试 代理服务器

 $ curl '#39;


# 2003 设置了 打印请求地址代码: upath := fmt.Sprintf("#34;, r.Addr, req.URL.Path)

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.拷贝上游请求的 context 到下游请求2.使用 指定 director(对请求进行修改的函数)修改请求(例如协议、参数、url 等)3.根据请求 Header[“Connection”] 判断是否需要升级协议(Upgrade)4.删除上游请求中的 hop-by-hop Header, 维持上游持久(相对)连接, 不需要透传到下游5.设置 X-Forward-For Header,追加当前节点 IP6.使用连接池,向下游发起请求7.处理 httpcode 101 协议升级:(WebSocket、h2c 等)8.删除请求中的 hop-by-hop Header, 不要返回给上游9.根据结构体 ReverseProxy.ModifyResponse(函数)判断是否修改响应体内容10.拷贝下游响应头部到上游响应请求11.返回 下游请求 HTTP 状态码12.拷贝 下游响应内容 到 上游响应请求13.刷新内容到 response

其他源码

NewSingleHostReverseProxy 函数

NewSingleHostReverseProxy 中 URL 拼接方法

References

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

文章来源:智云一二三科技

文章标题:Golang ReverseProxy 如何实现反向代理?

文章地址:https://www.zhihuclub.com/87465.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图