聊聊Java中的负载均衡

引言

前几天在面试的时候被问到了负载均衡,因为只是简单的用过,所以就只说出了常见的负载均衡算法,以及SpringCloud的负载均衡组件,并没有深入进行了解,因此总结了下负载均衡。

什么是负载均衡

负载均衡是指将用户请求分摊到不同的服务器上去处理,以提高系统整体的并发处理能力以及可靠性,负载均衡由专门的软件或者硬件来完成,一般情况下,硬件的性能越好,软件的更便宜。

服务端负载均衡

服务端负载均衡主要应用在系统外部请求和网管之间,可以使用硬件和软件去实现。

硬件负载

如F5,A10,Array实现负载均衡 硬件的负载均衡的优势是性能很强且稳定,缺点是费钱。

软件负载均衡

常见的就是Nginx。 原理: 客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理"代理"的是目标服务器,这一个过程对于客户端而言是透明的。Nginx 就是最常用的反向代理服务器,它可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上。

客户端负载均衡

客户端负载均衡主要应用于系统内部不同服务之间,可以使用现成的负载均衡组件实现。 在客户端负载均衡中,客户端自己维护一份服务器的地址列表,或者请求对应的注册中心,获取在线的服务列表,然后根据相应的负载均衡算法处理请求。 常见的负载均衡组件如Ribbon 、Spring Cloud Load Balancer。

负载均衡算法

  • 随机法

    如果没有配置权重的额话,所有服务器被访问到的概率都是相同的,如果配置权重的话,权重越高的服务器被访问的概率越高。未加权重的随机算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权随机算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。不过,随机算法有一个比较明显的缺陷:部分机器在一段时间之内无法被随机到,毕竟是概率算法,就算是大家权重一样, 也可能会出现这种情况

  • 轮询法

    是挨个轮询服务器处理,也可以设置权重。如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。如果配置权重的话,权重越高的服务器被访问的次数就越多。未加权重的轮询算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。

  • 一致性Hash法

    相同参数的请求总是发到同一台服务器处理,比如同个 IP 的请求。

  • 最小连接法

当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。活动连接数可以理解为当前正在处理的请求数。最小连接法可以尽可能最大地使请求分配更加合理化,提高服务器的利用率。不过,这种方法实现起来也最复杂,需要监控每一台服务器处理的请求连接数。

其他方法实现负载均衡

  1. DNS解析

    DNS解析实现负载均衡的原理:在DNS服务器中同一个主机记录配置多个IP地址,这些IP地址对应不同的服务器,当用户请求域名时,DNS服务器采用轮询的方式返回IP地址。

相关推荐
程序员清风17 分钟前
Docker、Nginx 与 Kubernetes 部署 AI 后端服务
nginx·docker·kubernetes
涵美女程序猿7 小时前
ChatCut online 剪负载均衡健康检查演练录屏:后端池、探针路径与摘除阈值怎样对应
运维·程序人生·电脑·负载均衡
吴声子夜歌7 小时前
Nginx应用与运维——Nginx核心配置指令(一)
运维·nginx
谢亮_vipxieliang14 小时前
一套 Compose 搭起完整开发环境:MySQL + Redis + Nginx
redis·mysql·nginx·docker
xbzb14 小时前
Nginx 反向代理总 404?Location 匹配与 proxy_pass 尾斜杠避坑手册
linux·运维·nginx·虚拟主机
ShayneLee815 小时前
Nginx只开一个端口!能做什么?(一)
运维·nginx
天衍四九-15 小时前
Docker Compose企业实战系列(一):LNMP环境一键部署(Nginx\+MySQL\+PHP)
mysql·nginx·docker
Thomas.Sir1 天前
第8课:Nacos健康检测、权重配置、环境隔离实战
spring cloud·微服务
PC2005-cloud1 天前
Nginx 学习笔记:Server 块配置详解,域名路由与多站点部署实战
nginx
zach1 天前
Vue/React SPA 打包部署后,子路由刷新 401 未登录问题彻底解决
前端·nginx·next.js