Nginx轮询算法底层如何实现

  介绍

这篇文章主要介绍Nginx轮询算法底层如何实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强>轮询算法简介

在工作中很多人都使用到了Nginx,对Nginx得配置也是烂熟于心,今天我主要想介绍一下Nginx轮询算法得几种底层实现方式。

<强>简单轮询算法

这种算法比较简单,举个例子就是你有三台服务器



第一台服务器192.168.1.1第二台服务器192.168.1.2第三台服务器192.168.1.3

第一个请求过来之后默认访问第一台,第二个请求过来访问第二台,第三次请求过来访问第三台,第四次请求过来访问第一台,以此类推。以下是我代码实现简单得算法:

public  class  SimplePolling  {      ,/* *   ,,*,关键是ip   ,,*/public 才能;static  List  & lt; String>, ipService =, new  LinkedList  & lt;在();   static {才能   ,,,ipService.add (“192.168.1.1");   ,,,ipService.add (“192.168.1.2");   ,,,ipService.add (“192.168.1.3");   ,,}   public 才能static  int  pos =, 0;   public 才能static  String  getIp () {   ,,,如果(pos 祝辞=,ipService.size ()) {   ,,,,,//防止索引越界   ,,,,,pos =, 0;   ,,,}   ,,,String  ip =, ipService.get (pos);   ,,,pos  + +;   ,,,return 知识产权;      ,,}      public 才能;static  void  main (String [], args), {   ,,,for  (int 小姐:=,0;,小姐:& lt;, 4,,我+ +),{   ,,,,,System.out.println (getIp ());      ,,,}   ,,}   }

模拟执行4次执行结果是

 Nginx轮询算法底层如何实现“> <br/> </p> <p>此时如果我有一台服务器性能比较好(比如192.168.1.1),我想让这台服务器处理多一点请求,此时就涉及到了权重得概率,这种算法就不能实现,请看我后面描述的轮询升级版算法。</p> <p> <强>加权轮询算法</强> </p> <p>此时我需要把我前面3台服务器都设置权重,比如第一台设置5第二台设置1,第三台设置1 </p>第一台服务器192.168.1.15第二台服务器192.168.1.21第三台服务器192.168.1.31 <p>此时前5个请求都会访问到第一台服务器,第六个请求会访问到第二台服务器,第七个请求会访问到第三台服务器。</p> <p>以下是我给出的代码案例:</p> <pre类= public  class  WeightPolling  {      ,/* *   ,,*,关键是ip,价值是权重   ,,*/public 才能;static  Map<字符串,,Integer>, ipService =, new  LinkedHashMap<在();   static {才能   ,,,ipService.put (“192.168.1.1",, 5);   ,,,ipService.put (“192.168.1.2",, 1);   ,,,ipService.put (“192.168.1.3",, 1);   ,,}   public 才能static  int  requestId =, 0;   public 才能static  int  getAndIncrement (), {   ,,,return  requestId + +;   ,,}      public 才能static  String  getIp () {   ,,,//获取总的权重   ,,,int  totalWeight =0;   ,,,for  (Integer  value : ipService.values ()), {   ,,,,,totalWeight +=,价值;   ,,,}   ,,,//获取当前轮询的值   ,,,int  andIncrement =, getAndIncrement ();   ,,,int  pos =, andIncrement %, totalWeight;   ,,,for  (String  ip : ipService.keySet ()), {   ,,,,,如果(pos  & lt;, ipService.get (ip)) {   ,,,,,,,return 知识产权;   ,,,,,}   ,,,,,pos  -=, ipService.get (ip);   ,,,}   ,,,return 零;   ,,}      public 才能;static  void  main (String [], args), {   ,,,for  (int 小姐:=,0;,小姐:& lt;, 7;,我+ +),{   ,,,,,System.out.println (getIp ());   ,,,}   ,,}      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Nginx轮询算法底层如何实现