如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。[更多系列文章在我博客] coderdao.github.io/
golang 实现简版反向代理
正向代理 和 反向代理
如果说昨天介绍的 正向代理服务器
是从 用户端
角度出发。使得用户端
能够:
- 访问无法访问的数据 —— 访问谷歌
- 加速页面访问速度的缓存 —— CDN 缓存
- 对客户端访问内容过滤, 访问授权 —— 公司内网不能访问购物网站; 网吧;
- 上网管理记录用户访问记录,对外隐藏特殊信息 —— 路由访问记录
那么今天要说的 反向代理服务器
则从 服务端
考虑
- 负载均衡, 提高服务可扩展、稳定性 —— 服务器集群、多中心机房、灾备
- ip白名单、限制开发端口, 保护内网安全 —— 网关
- 限流、熔断、降级 —— 网关
- 访问数据统计、访问内容权限控制 —— 网关
- 内网、外网通过代理转发,对外隐藏实现细节。增加内部服务安全性 —— 网关
举个现有的例子:就是使用广受欢迎的Nginx
。个人感觉反向代理
在业务上面更多以网关
角色呈现, 而网关
则更像一个定制化 Nginx
简版反向代理实现
《HTTP 权威指南》中概括用一句话概括了 代理的核心功能
:接受客户端的请求,转发到后端服务器,获得响应并返回给客户端
这些都没在下面的代码实现
中一一找到对应:
-
接受客户端的请求:
第 11 行
设置路由, 所有请求代理服务器
由handler()
方法处理 -
handler()
方法内第 27 行
解析下游服务器
的 请求协议、ip地址。并设入请求变量r
-
转发到后端服务器:请求
r
由第 33 行
transport.RoundTrip®, 转发请求至下游服务器
-
获得响应:
下游服务器
请求 Header 信息 在第 40 ~ 44 行
设入代理服务器的响应w
-
返回给客户端:代理服务器的响应
w
并返回
启动 真实服务器
$ go run reverse_proxy_v1/real_server/main.go
2021/06/12 17:59:24 starting httpserver at 127.0.0.1:2003
2021/06/12 17:59:24 starting httpserver at 127.0.0.1:2004
测试 真实服务器
$ curl 'http://127.0.0.1:2003/sda?sda=111'
http://127.0.0.1:2003/sda
RemoteAddr=127.0.0.1:49795,X-Forwarded-For=,X-Real-Ip=
headers =map[Accept:[*/*] User-Agent:[curl/7.69.1]]
$ curl 'http://127.0.0.1:2004/sda?sda=111'
http://127.0.0.1:2003/sda
RemoteAddr=127.0.0.1:49795,X-Forwarded-For=,X-Real-Ip=
headers =map[Accept:[*/*] User-Agent:[curl/7.69.1]]
启动 代理服务器
$ go run reverse_proxy/reverse_proxy_v1/reverse_proxy_base/main.go
2021/06/12 18:32:21 start serving on port2002
测试 代理服务器
$ curl 'http://127.0.0.1:2002/sda?sda=111'
# 转发至 2003 并返回结果
http://127.0.0.1:2003/sda
RemoteAddr=127.0.0.1:57595,X-Forwarded-For=,X-Real-Ip=
headers =map[Accept:[*/*] Accept-Encoding:[gzip] User-Agent:[curl/7.69.1]]