07 说一说什么是正向代理,反向代理

世界上最快乐的事,莫过于为理想而奋斗。

——苏格拉底

引言

05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识服务间通讯框架(RPC) 确实了解了。

接下来又开始问我网络相关的知识,但不是直接问HTTP三次握手,TCP,UPD这些,因为这些基础已经在一面问完了,这一面只围绕分布式系统相关的网络概念,从最基本的代理开始。

1.面试官:完看你简历提到使用过Nginx做代理,你是如何理解“正向代理”,“反向代理”的?

问题分析: 即使作为业务开发人员也会经常遇到需要配置Nginx或其他负载均衡的问题,比如你做了一个文件上传服务,上线后发现文件被拦截了,看看报错信息一看是被Nginx 代理拦截了,Nginx限制了文件大小,这个时候代理的概念是啥怎么看明白这个问题呢?

我:

正向代理: 代理用户端请求服务端,相对于服务器用户端是匿名的,比如单位内网使用了正向代理软件,所有员工都访问百度,但是百度看到的只有一个IP地址,百度也不知道到底是哪个员工访问的。

反向代理: 代理服务端提供服务,相对于用户服务端是匿名的,同样是访问www.baidu.com,所有用户输入的都是一个网站或者一个IP,但是百度背后有成千上万的服务器,你也不知道你访问的是哪一个。

2.面试官:那服务端为什么要使用代理?有啥好处?

问题分析: 面试官点点头,对我理解的代理表示认可,随后问我使用代理有什么用,考察代理技术的原理。

我:

比如用 Nginx 做代理,这样就可以开buffer,Nginx 可以把 Request 请求和 Response 在读取完整之前 buffer 住,好比饭店服务员,所有顾客要什么菜和一个服务员说一下就行了,不会直接找厨师,一个服务员接待10个顾客,最后把点的20道菜分发给5个厨子做就行了,厨子好比服务器,这样厨子就可以专心做菜了,接待这种事就有Nginx代理做,同时,还可以根据顾客数量多增加或者减少厨师数量,把任务均匀分给每个厨师,这就是负载均衡的作用,Nginx 就可以有效分发流量。

总的来说:

  1. 让IO和服务器分离,突破IO性能,提高服务器吞吐能力。
  2. 控制流量分发,管理服务集群,起到负载均衡作用。
  3. 安全性和匿名性:通过拦截前端服务器的请求,反向代理服务器可以保护其身份,并可以抵御安全攻击。它还确保可以从单个记录定位器或URL访问多个服务器,而不管服务端网络的结构如何。

3.面试官:那你知道哪些负载均衡算法?

问题分析: 聊到了负载面试官要继续深挖算法了。

我:

  1. 轮询算法:简单的理解就好比性感荷官在线发牌,从左到右依次发牌,最后每个人获得的纸牌张数一样,轮询算法就是将多个用户请求按顺序依次分发到1-10号机器上,目的就是让每台机器承受相同的压力,100W次查询理论上每台机器分摊了10W次查询。
  2. 加权轮询算法:轮询算法和加权轮询算法有什么区别?想象一下,如果10台服务器的配置不相同,8台机器是8核32G,剩下两台是4核16G,如果按照算法1轮询,每台机器分担10W次请求,那两台低配的服务器说我扛不住呀,你们配置比我好,这不公平,我要宕机休息一下,加权轮询算法就是为了应对这种情况,设置不同机器的权重不同,10台同配置机器分别均摊10%的流量,如果机器性能不同,那让两台低配的权重降低,只承担5%的流量,这样就公平了,能者多劳。每台机器都不闲着发挥自己最大的性能。
  3. 随机算法:随机算法和轮询算法类似,让所有请求随机分配到不同的机器上,请求越多最后分散在每台机器上的请求数约接近相等。
  4. 加权随机算法:和加权轮询算法道理相似,这里不多说了。
  5. 最小连接数算法:最小链接数就是请求分发以前,先看当前10台机器谁最清闲,谁当前处理的链接数最少那就把活分给谁,最后的分工也相对公平。
  6. Hash 算法:前5种算法有一个问题,就是同一个用户的请求多次,可能每次都会被分配到不同机器上,这样有什么不好?如果服务器缓存了用户 Session,那每次请求不同服务器都需要保存用户的 Session,最坏的结果就是用户请求10次,10台服务器都缓存了同一个用户的 Session,这显然是浪费服务器资源。这个时候 Hash 算法就出现了,如果读者还不知道 Hash,建议先 Google 下 Hash,hash(client:ip) % N,N就是服务器的数量,只要用户的 IP不变,最后 Hash 取余的结果就不会变,这样就能保证同一个用户每次请求都会在同一台机器上,这里的IP还可以是用户的其他唯一ID。
  7. 一致性Hashhash(client:ip) % N 上面的公式中如果N变了怎么办?比如一台服务器断电了,那最后 Hash 取余的结果就全变了,所有用户会被分配到哪台机器需要全部重新计算,这对有 Session 状态的服务就是一场灾难,一致性Hash 就是为了解决这个问题。

深入分析:

负载均衡几乎是各大互联网公司搭建系统必用的技术了,也会有初学者学习分布式系统时会问我,什么是负载均衡,为什么要使用负载均衡,多加一层负载均衡会让服务调用变慢吗?带着这些问题学习一下这一章。

先看下没有负载均衡的网站架构

不知道你有没有发现,如果服务端是单台服务器,直接通过网络就可以链接。为什么说负载均衡几乎是各大互联网公司搭建系统必用的技术,除了个人网站,比如我的博客还是单体服务器以外,相信没有哪家互联网公司的服务敢这样,一台机器如果宕机怎么办?让用户等一会儿吗?那估计这家公司离倒闭就不远了。

那怎么解决单机故障的问题,再看下面的图。

可以看出,多台服务器的情况,增加了一层负载均衡。

什么是负载均衡

负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群、网络连接、CPU、磁碟驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个伺服器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发高可用的问题。

​ ——— 维基百科

简单地理解负载均衡的作用就是流量分发,将大量用户请求分发到不同服务器上分担压力,如果有机器宕机,负载均衡服务器会负责把故障机器自动摘除。

常用的负载均衡框架

  1. Nginx:https://www.nginx.com/ ,来自俄罗斯的软件,不光可以用作负载均衡,反向代理,还是出色的web服务器,使用广泛,所以也是面试常问的知识点。如果英文不错可以参考。
  2. LVS:http://www.linuxvirtualserver.org/ ,Linux Virtual Server的缩写,一个Linux下的开源服务器集群系统,章⽂文嵩博⼠士于1998年5月创立。
  3. HAProxy:http://www.haproxy.org/ ,一款高可用http/TCP负载均衡。
  4. F5:https://www.f5.com/ 硬件负载均衡。

上述都是常见负载均衡,在企业里具体使用哪种框架并不是绝对的,主要取决于系统的需求和工程师对每个框架的了解程度。

一个框架能存活下来一定是具有自己的优点,没有最好,适合自己的就是最好的。

比如F5,性能出色价格昂贵而出名,从十几万到上百万不等,有强大的售后和技术支持,我工作多年只有工作第一年参加国家电网项目上使用过F5,当时还给了我们一台测试用的机器,后来辞职后面试别的公司,面试官问我以前的项目组是使用的什么负载均衡,我说F5,面试官感叹国家队果然财大气粗,我那个时候不了解还有什么其他解决方案,表示F5很奇怪吗?面试完回家才慢慢了解,原来有很多解决方案,阿里使用LVS,也使用Nginx,美团最初使用Nginx + LVS,以及后来独立研发的MGW。

有人会问,怎么一个负载均衡就这么多种算法,心好累,企业开发里能用这么多算法吗?真正到企业开发中,一般都只用一种,比如我负责的服务器没有带状态的 Session,也不存在机器配置不相同的情况,那就可以用轮询或随机算法,工程师根据实际情况选择最合适自己的算法。

正向代理&反向代理

正向代理

生活中的正向代理,打个比方,你想去美国旅行,需要去使馆办理签证,手续麻烦,你完全不知道从何下手,这个时候你想到找旅行社,有专门的导游可你帮你代办,你只需提供资料就在家等着拿签证就可以了,你是客户端,美国使馆是服务端,导游就是代理端。服务器架构中正向代理也很容易理解,如果想使用Google,需要用的一些“科学上网”的工具,这就是一个典型的正向代理。

正向代理就是代理客户端,服务端不知道客户端是谁。

反向代理

互联网不够发达的时候,我们都打过10086,有事儿就找客服,全国31个省都有自己的客服中心,每个客服中心都有上百个客服小哥小姐姐,我们不关心给你分配的是谁,只需要接通10086后会自动给你分配客服给你,这就是反向代理。

反向代理就是代理服务端,客户端不知道服务端是谁。

反向代理服务器可以充当“交通警察”,如上图,位于后端服务器(baidu)前面,并以最大化速度和容量利用率的方式在一组服务器上分发客户端请求,同时确保没有一个服务器过载,可以降低性能。如果服务器出现故障,负载均衡器会将流量重定向到其它正常的服务器上。

总结

这一节主要讲了负载均衡在网站后台建设中的应用和代理的概念,负载均衡算法和正/反向代理的概念也是面试中容易碰到的基础问题,是初学者必须掌握的概念。

面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试

    01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...

  2. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题

    17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓

    03 阿里华为资深HR面试套路全揭晓 HR 面试套路大全 如果你技术面试过了,进入最后一轮 HR 谈薪资,先别高兴太早,千万不要轻视 HR.BAT 大公司,HR 有一票否决权,即使你技术 OK,领导也 ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 08 Redis中有哪些数据结构及底层实现原理

    08 Redis中有哪些数据结构及底层实现原理 不经一翻彻骨寒,怎得梅花扑鼻香. --宋帆 引言 07小节面完了负载均衡,正向代理,反向代理,终于松了一口气,然后话题转向了缓存Redis,为什么是这个 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现

    23 分布式系统下分布式锁的实现 困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人. --茅以升 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等, ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列

    13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 21 限流不能乱用-系统限流最佳实践

    21 限流不能乱用-系统限流最佳实践 没有引发任何行动的思想都不是思想,而是梦想. -- 马丁 引言 19.20小节讲了系统中的降级熔断设计和对 Hystrix 组件的功能了解,关于限流降级还有一个比 ...

  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等

    18谈谈怎么理解幂等,接口如何保证幂等 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故 ...

  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 16 数据库如何做分库分表,读写分离

    16 数据库如何做分库分表,读写分离 宝剑锋从磨砺出,梅花香自苦寒来. --佚名 引言 2016年第一次接触分布式微服务项目后,我在简历上写了我使用了微服务.分库分表技术,那么问题来了,面试官说接下来 ...

最新文章

  1. 《工业大数据白皮书》2019版正式发布
  2. VNX证书过期解决方案(2018-11-02)
  3. 骰子的妙用---课堂答题
  4. java垃圾回收菜鸟_java垃圾回收机制
  5. HTTP协议容易犯的误区
  6. python如何运行一个python程序_在python中,如何运行一个命令行程序,它在发送Ctrl+D之前不会返回...
  7. 第一个脚本-HelloWorld
  8. 网页上的摄影展:等高响应布局实现
  9. 容器入门(3) - docker
  10. 鬼怪出没不害怕,最怕秒杀404
  11. Kubernetes 小白学习笔记(4)--kubernetes是什么
  12. 操作系统概念第六章部分作业题答案
  13. 联想微型计算机改win76,联想ideacentre一体机改win7详细教程
  14. teamviewer介绍及操作
  15. 锁相环(PLL)专题一:鉴相器PD
  16. connect to address IP: No route to host
  17. Metasploit后门渗透Linux系统以及跨平台后门生成
  18. 利用Python实现word文档合并
  19. 回调函数基本介绍和基本使用场景
  20. 【XML】dom4j解析

热门文章

  1. PHP简单方法判断文件是否是图片 PHP best way to check if file is an image
  2. Linux: Nginx 安装
  3. Linux:mysqldump 用法 数据库导出
  4. firebug for IE6+, Firefox, Opera, Safari and Chrome
  5. PHP常见缓存技术分析(cache)
  6. 9个PHP库简介和下载
  7. 认识Javascript数组
  8. 【AI视野·今日Robot 机器人论文速览 第六期】Fri, 11 Jun 2021
  9. 利用三维模型生成点云总结
  10. 【Linux】进程间通信-信号量详解及编程实例