Go语言是 如何实现 HTTP代理 和 反向代理

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

代理的功能有很多,事实上整个互联网到处都充斥着代理服务器。如果所有的 HTTP 访问都是客户端和服务器端直接进行的话,我们的网络不仅会变得缓慢,而且性能会大打折扣。

代理服务器根据不同的配置和使用,可能会有不同的功能,这些功能主要包括:

内容过滤:代理可以根据一定的规则限制某些请求的连接。比如有些公司会设置内部网络无法访问某些购物、游戏网站,或者学校的网络不让学生访问色情暴力的网站等

节省成本:代理服务器可以作为缓存使用,对于某些资源只需要第一次访问的时候去下载,以后代理直接把缓存的结果返回给客户端,节约网络带宽的开销。

提高性能:通过代理服务器的缓存(比如 CDN)和负载均衡(比如 nginx lb)功能,服务器端可以加速请求的访问,在更快的时间内返回结果)

增加安全性:公司可以在内网和外网之间通过代理进行转发,这样不仅对外隐藏了实现的细节,而且可以在代理层对爬虫、病毒性请求进行过滤,保护内部服务

所有的这些功能的实现都依赖于代理的特性,它可以在客户端和服务器端做一些事情,根据代理做的事情不同,它的角色和功能也就不同。

那么,代理具体可以做哪些事情呢?比如:

修改 HTTP 请求:url、header、body

过滤请求:根据一定的规则丢弃、过滤请求

决定转发到哪个后端(可以是静态定义的,也可以是动态决定)

保存服务器的应答,后续的请求可以直接使用保存的应答

修改应答:对应答做一些格式的转换,修改数据,甚至返回完全不一样的应答数据

重试机制,如果后端服务器暂时无法响应,隔一段时间重试

正向代理和反向代理

代理可以分为正向代理和反向代理两种。

正向代理需要客户端来配置,一般来说我们会通过浏览器或者操作系统提供的工具或者界面来配置。

这个时候,代理对客户端不是透明的,客户端需要知道代理的地址并且手动配置。配置了代理,浏览器在发送请求的时候会对报文做特殊的修改。

反向代理对客户端是透明的,也就是说客户端一般不知道代理的存在,认为自己是直接和服务器通信。

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

代理服务器怎么知道目的服务器的地址?