/go-proxy

golang实现HTTP正向代理和反向代理的简单示例

Primary LanguageGo

代理的核心功能

代理的核心功能可以用一句话概括:接受客户端的请求,转发到后端服务器,获得应答之后返回给客户端

代理服务器根据不同的配置和使用,可能会有不同的功能
- 内容过滤:比如有些公司会设置内部网络无法访问游戏网站
- 节省成本:代理服务器可以作为缓存使用
- 提高性能:通过代理服务器的缓存(比如 CDN)和负载均衡(比如 nginx lb)功能,服务器端可以加速请求的访问,在更快的时间内返回结果)
- 增加安全性:通过代理进行转发,这样不仅对外隐藏了实现的细节,而且可以在代理层对爬虫、病毒性请求进行过滤,保护内部服务

代理具体做的事情如下:
- 修改 HTTP 请求:url、header、body
- 过滤请求:根据一定的规则丢弃、过滤请求
- 决定转发到哪个后端(可以是静态定义的,也可以是动态决定)
- 保存服务器的应答,后续的请求可以直接使用保存的应答
- 修改应答:对应答做一些格式的转换,修改数据,甚至返回完全不一样的应答数据
- 重试机制,如果后端服务器暂时无法响应,隔一段时间重试

正向代理

正向代理需要客户端来配置,一般来说我们会通过浏览器或者操作系统提供的工具或者界面来配置。这个时候,代理对客户
端不是透明的,客户端需要知道代理的地址并且手动配置。配置了代理,浏览器在发送请求的时候会对报文做特殊的修改。

反向代理

反向代理对客户端是透明的,也就是说客户端一般不知道代理的存在,认为自己是直接和服务器通信。我们大部分访问的网站
就是反向代理服务器,反向代理服务器会转发到真正的服务器,一般在反向代理这一层实现负载均衡和高可用的功能。而且这
里也可以看到,客户端是不会知道真正服务器端的 ip 地址和端口的,这在一定程度上起到了安全保护的作用。