思维导图
一、负载均衡
1.概念
将用户请求分摊到不同服务器上处理,以提高系统整体的并发处理能力及可靠性。
如图:我们用到负载均衡,实现访问商品服务的请求的分流。
负载均衡是一种常用且简单的提高系统并发和可靠性的手段,单体或微服务架构都会使用
2.分类
2.1 服务端
主要应用于系统外部请求和网关层,软件或硬件都可以实现。
如图使用Nginx:
2.1.1 硬件负载均衡
通过专门的硬件设备(如F5、A10、Array)实现负载均衡
优点性能很强且稳定,缺点是价格太贵。如基础款F5最低也要20万。
2.1.2 软件负载均衡
通过软件(如LVS、Nginx、HAproxy)实现负载均衡
日常开发接触最多,性能差一些,但价格便宜。如基础款的Linux服务器也就几千,好一点的2-3万就不错了。
分类:
一层、二层、三层、四层、七层负载均衡(根据OSI模型)
(1)四层负载均衡
-
工作在主要协议TCP/UDP的传输层
-
负载均衡器能够看到数据包里源端口地址、目的端口地址,基于这些信息通过一定负载均衡算法将数据包转发到后端真实服务器
大部分用LVS(Linux内核的4层负载均衡)
(2)七层负载均衡
-
工作在主要协议HTTP的应用层
-
这一层负载均衡比四层负载均衡路由网络请求的方式更加复杂,它会读取报文的数据部分(如HTTP报文),然后根据读取数据(如URL、Cookie)做出负载均衡决策
大部分使用Nginx
(3)四层与七层负载均衡比较
-
四层性能更强。七层比四层会消耗更多性能
-
七层功能更强。更加灵活,能够更加智能的路由网络请求
比如可以根据请求内容进行缓存、压缩、加密等优化
2.2 客户端
主要应用于系统内部的不同服务器之间,可以使用现成的负载均衡组件来实现。
2.2.1 概念
(1)客户端会自己维护一份服务器的地址列表。
发送请求之前,客户端会根据对应的负载均衡算法来选择具体某一台服务器处理请求。
(2)客户端负载均衡和服务运行在同一个进程或者Java程序里,不存在额外的网络开销。
不过它会受到编程语言的限制,比如SpringCloud Load Balancer 只能用于Java语言
2.2.2 Java框架客户端负载均衡
以下都内置了开箱即用:
2.2.2.1 Dubbo
默认自带
2.2.2.2 SpringCloud
通过可选的组件形式实现,常用的有:
(1)SpringCloud Load Balancer(官方推荐)
<1> 2种基本策略:
-
RandomLoadBalancer:随机
-
RoundRobinLoadBalancer(默认):轮询
<2> 通过ServiceInstanceListSupplier实现类让其他支持类似于Ribbon的负载均衡策略
如:实现基于区域的负载均衡策略、基于hint提示的负载均衡策略等
(2) Ribbon(Netflix)
Netflix开发,功能全面支持的负载均衡策略多
7种策略:
-
RandomRule:随机
-
RoundRobinRule(默认):轮询
-
WeightedResponseTimeRule:权重(根据响应时间决定权重)
-
BestAvailableRule:最小连接数
-
RestryRule:重试
按照轮询策略获取服务,如果获取的服务实例为null或者已经失效,则再指定时间之内不断重试来获取服务,如果超过指定时间依然没有获取到服务实例则返回null -
AvailabilityFilteringRule:可用敏感性
先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例 -
ZoneAvoidanceRule:区域敏感性
根据服务所在区域的性能和服务的可用性来选择服务实例
**备注:**Netflix开发的微服务组件还有:Feign、Zuul、Hystrix、Eureka。
3.常见算法
3.1 随机法
最简单粗暴
(1)未配置权重
-
所有的服务器被访问到的概率都是相同的
-
适合于服务器性能相近的集群,每个服务器承载相同的负载
(2)配置权重
-
权重越高的服务器被访问的概率越大
-
适合服务器性能不等的集群,权重的存在可以使请求更加合理化
(3)随机法缺陷
部分机器在一段时间内无法被随机到
3.2 轮询法
挨个服务器处理
(1)未配置权重
-
每个请求按时间顺序逐一分配到不同的服务器处理
-
适合于服务器性能相近的集群,每个服务器承载相同的负载
(2)配置权重
-
权重越高的服务器被访问的概率越大
-
适合服务器性能不等的集群,权重的存在可以使请求更加合理化
3.3 一致性Hash法
相同参数的请求总是发到同一台服务器处理,比如同个IP的请求
3.4 最小连接法
当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。
活动连接数可以理解为当前正在处理的请求数
(1)可以尽可能最大的请求分配更加合理化,提高服务器的利用率。
(2)实现最复杂,需要监控每一台服务器处理的请求连接数
4.七层均衡怎么做
项目中解决方案:
DNS解析、反向代理、HTTP重定向(少)
4.1 DNS解析
(1)原理
- 在DNS服务器中为同一个主机记录配置多个IP地址,这些IP地址对应不同的服务器。
- 当用户请求域名时,DNS服务器采用轮训算法返回IP地址,实现轮询算法负载均衡。
(2)IP地址的权重配置
在服务器性能不等的集群中请求分配会更加合理化
4.2 反向代理
(1)概念
客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。
对外暴露的是反向代理服务器地址,隐藏了真实服务器IP地址
(2)Nginx
将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上
二、CDN
1.概念
内容分发网络,Content Delivery Network/Content Distribution Network
就是将静态资源分发到多个不同的地方以实现就近访问,进而加快静态资源的访问速度,减轻服务器以及带宽的负担。
可看作服务上一层的特殊缓存服务,分布在全国各地,主要用来处理静态资源的请求。
1.1 内容与分发网络
-
内容
静态资源比如图片、视频、文档、JS、CSS、HTML。 -
分发网络
将这些静态资源分发到位于多个不同的地理位置机房中的服务器上
就可以实现静态资源的就近访问比如北京的用户直接访问北京机房的数据。
1.2 类比
类比京东在各地建立的仓库及系统,用户下单后就从距离用户最近的仓库发货
1.3 与全站加速区别
-
全站加速(腾讯云叫 ECDN、阿里云叫 DCDN),既可以加速静态资源又可以加速动态资源。
-
而内容分发网络(CDN)主要针对的是 静态资源 。
如图:
1.4 其他
1.4.1 为何不自建CDN
-
绝大部分公司都会在项目开发中交使用 CDN 服务,但很少会有自建 CDN 服务的公司。
-
基于成本、稳定性和易用性考虑,建议直接选择专业的云厂商或CDN 厂商提供的开箱即用的 CDN 服务
**云厂商:**阿里云、腾讯云、华为云、青云
**CDN 厂商:**网宿、蓝汛
1.4.1 为何不直接将服务异地部署?
-
成本太高,需要部署多份相同的服务。
-
消耗大量资源甚至影响系统其他服务运行
静态资源通常占用空间比较大且经常会被访问到,如果直接使用服务器或者缓存来处理静态资源请求,对系统资源消耗非常大,可能会影响到系统其他服务的正常运行
同一个服务在多个不同的地方部署多份是为了实现系统的高可用而非就近访问
如:同城灾备、异地灾备、同城多活、异地多活
2.原理
2.1 静态资源如何被缓存到CDN节点中?
2.1.1 预热
提交URL预热请求后,源站将会主动将对应的资源缓存到CDN节点。当您首次请求时,就能直接从CDN缓存中获取到最新的请求资源,无需再回源站获取。
2.1.2 回源
如果未预热,请求访问的资源不在CDN 节点中,这时CDN节点将请求源站获取资源。
2.1.3 刷新
提交 URL刷新或目录刷新请求后,CDN节点缓存内容将会被强制过期,当你向CDN节点请求资源师,CDN会直接回源站获取对应的资源返回给你,并将其缓存。
详细内容可参考如下文章:
秒懂边缘云 | CDN基础入门:CDN缓存刷新与预热
2.2 如何找到最合适的CDN节点?
通过GSLB
2.2.1 GSLB全局负载均衡
Global Server Load Balance
是CDN的大脑,负责多个CDN节点之间的协作
最常用的是基于DNS的GSLB
2.2.2 流程
(1)浏览器向DNS服务器发送域名请求
(2)DNS服务器根据CNAME别名记录向GSLB发送请求
(3)GSLB返回性能最好的CDN节点的地址给浏览器
GSLB如何确定最合适的CDN节点?
- GSLB会根据请求的IP地址、CDN节点状态(如负载情况、性能、响应时间、带宽)等指标来综合判断具体返回哪一个CDN节点的地址。
(4)浏览器直接访问指定的CDN节点
2.3 如何防止资源被盗刷?
最常用最简单的方法是设置Referer防盗链。
2.3.1 Referer防盗链
根据HTTP请求的头信息里面的Referer字段对请求进行限制。
2.3.2 开启防盗链配置
2.3.3 时间戳防盗链
(1)安全性更强
时间戳防盗链加密的URL具有时效性,过期之后就无法再被允许访问
(2)时间戳防盗链URL
- 会有两个参数,分别是签名字符串、过期时间。
签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。
- 时间戳防盗链 URL示例:
http://cdn.wangsu.com/4/123.mp3? wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTime=1601026312
wsSecret:签名字符串
wsTime:过期时间
2.3.4 其他防盗刷
还可以通过IP黑白没名单配置、IP访问限频配置等机制来防盗刷
本篇文章主要参考链接如下:
持续更新中…
随心所往,看见未来。Follow your heart,see light!
欢迎点赞、关注、留言,一起学习、交流!