负载平衡(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,可能最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点代单点服务,也提高了服务的可用性。
负载均衡的实现可以软件可以硬件,硬件如大名鼎鼎的 F5 负载均衡设备,软件如 NGINX 中的负载均衡实现,又如 Springcloud Ribbon 组件中的负载均衡实现。
如果看到这里你还不知道负载均衡是干嘛的,那么只能放一张图了,毕竟没图说个啥。
正经的负载均衡示例
负载均衡要做到在多次请求下,每台服务器被请求的次数大致相同。但是实际生产中,可能每台机器的性能不同,我们会希望性能好的机器承担的请求更多一些,这也是正常需求。
如果这样说下来你看不懂,那我就再举个例子好了,一排可爱的小熊(服务器)站好。
一排要被访问的服务器
这时有人(用户)要过来打脸(请求访问)。
用户请求
那么怎么样我们才能让这每一个可爱的小熊被打的次数大致相同呢?
又或者熊 4 比较胖,抗击打能力是别人的两倍,我们怎么提高熊 4 被打的次数也是别人的两倍呢?
又或者每次出手的力度不同,有重有轻,恰巧熊 4 总是承受这种大力度啪啪打脸,熊 4 即将不省熊事,还要继续打它吗?
这些都是值得思考的问题。
说了那么多,口干舌燥,我双手已经饥渴难耐了,迫不及待的想要撸起代码了。
1. 随机访问
上面说了,为了负载均衡,我们必须保证多次出手后,熊 1 到熊 4 被打次数均衡。比如使用随机访问法,根据数学上的概率论,随机出手次数越多,每只熊被打的次数就会越相近。代码实现也比较简单,使用一个随机数,随机访问一个就可以了。
/** 服务器列表 */
private static List<String> serverList = new ArrayList<>();
static {
serverList.add("192.168.1.2");
serverList.add("192.16