目录
前言
在分布式场景下,我们经常会听到“代理”、“反向代理”等这样的术语。如果你对它们的概念不是很清楚,那么可能会在具体场景下比较困惑。
本期内容,主要跟大家介绍一下,代理和反向代理是什么?有什么区别?以及它们都有什么作用和使用案例。
没有代理的请求过程
在没有代理服务器时,客户端和服务器之间的请求和响应过程。
代理服务器
代理服务器是位于客户端和服务器之间的软件或硬件服务器。客户端连接到代理以请求真实服务器的连接。
从本质上讲,代理服务器(又名转发代理)是一种软件或硬件,可以代表客户端促进从其他服务器请求资源,从而使客户端与服务器匿名。
通常,转发代理用于缓存数据、过滤请求、记录请求或转换请求(通过添加/删除标头、加密/解密或压缩资源)。
转发代理可以通过代表客户端发送请求,在服务器隐藏客户端的身份。
在上图的代理服务器示例中,客户端想要访问juejin.com访问某些内容,它向代理服务器发送请求,代理服务器再将请求发送到juejin.com的服务器,然后将juejin.com的响应数据再返回给客户端。
代理服务器的作用
缓存
使用代理服务器,可以带来缓存的好处。代理服务器可以缓存一些预计不会发生改变的数据,比如一些静态数据等。
当客户端再次发送相同的请求时,代理服务器可以将缓存数据直接返回,而不用再次请求服务器,来降低请求延迟,减少网络流量的优点。
匿名
代理服务器还有另一个作用,就是可以在服务器端隐藏客户端的身份。服务端只能看到请求方是代理服务器,而不知道具体发出请求的客户端。
访问控制
代理服务器还可以用来做一些访问控制。比如在公司的网络出口建立代理服务器,因为所有员工的客户端请求都会通过代理服务器访问外部网络服务,可以在代理服务器中阻止某些恶意网站的访问,保护客户端免受恶意网站的侵害。
访问记录
同样,由于所有流量都通过代理,因此可以在代理服务器记录请求日志,这些日志可用于识别任何请求记录或对某些站点的缓存需求做出评估。
(所以说,如果你是使用公司的网络上网,那么只要公司想看,是能看到你所有的网络记录的。)
反向代理服务器
反向代理代表的是服务器,在客户端看来反向代理就是一个普通的服务器。
反向代理将请求转发到一个或多个处理请求的普通服务器上。返回来自普通服务器的响应,就好像它直接来自原始服务器一样,让客户端不知道原始服务器的身份。
在上图反向代理的示例中,反向代理服务器隐藏了最终给客户端提供服务的服务器身份。对于客户端来说,只能看到反向代理服务器。
那么反向代理服务器有有哪些作用呢?
反向代理服务器的作用
缓存
反向代理服务器也可以在本地缓存那些不变的数据。因此,当另一个客户端发送对相同内容的请求时,它可以从其本地缓存中获取数据返回,而不用请求真实服务器。这样可以降低请求延迟、减少服务器负载。
匿名
代理最明显的作用就是匿名能力,反向代理也有匿名的作用。但是反向代理和代理的匿名有所区别,反向代理的匿名是为了让客户端不知道最终的目标服务器的身份。这种匿名能力可以保护服务端免受客户端的DDoS攻击等。
负载均衡
反向代理还有一个很大的作用便是做服务器之间的负载均衡。反向代理可以使用一些负载均衡算法,帮助在服务器之间均匀分配流量,从而提高可靠性和可用性。
灰度发布
很多时候我们的项目在发布新功能时,并不会将新功能全量发布。比如掘金社区新增了某界面功能,但是不确定用户对新功能使用的反应,需要在一部分用户中进行测试,而通过反向代理服务器可以进行设置,按照特定的模式请求到不同的服务器上。比如10%的请求到新服务。
路由功能
反向代理还可以作为微服务架构中的网关或路由。它可以将映射到正在运行的实际服务上,例如,如果客户端要查询juejin.com的推荐文章,它会将请求路由到服务1,该服务器提供推荐文章查询服务,如果客户端是发布一篇新文章,则路由到服务器2,该服务提供文章发布功能。
总结
代理和反向代理从字面上很相似,但是在使用上却大有不同,两者都有匿名的能力,代理服务隐藏客户端的身份,而反向代理隐藏服务端的身份。
如果你想保护内网中的客户端,可以使用代理服务转发客户端的请求;如果你想保护服务端,则客户在服务器前面架设反向代理服务。
以上就是本期的全部内容,希望对你有所帮助。
作者:小黑说Java链接: