---
title: è´è½½å衡常è§é®é¢æ»ç»
category: 髿§è½
head:
- - meta
- name: keywords
content: 客æ·ç«¯è´è½½åè¡¡,æå¡è´è½½åè¡¡,Nginx,è´è½½åè¡¡ç®æ³,ä¸å±è´è½½åè¡¡,DNSè§£æ
- - meta
- name: description
content: è´è½½åè¡¡æçæ¯å°ç¨æ·è¯·æ±åæå°ä¸åçæå¡å¨ä¸å¤çï¼ä»¥æé«ç³»ç»æ´ä½çå¹¶åå¤çè½åãè´è½½åè¡¡å¯ä»¥ç®åå为æå¡ç«¯è´è½½åè¡¡å客æ·ç«¯è´è½½åè¡¡ è¿ä¸¤ç§ãæå¡ç«¯è´è½½åè¡¡æ¶åå°çç¥è¯ç¹æ´å¤ï¼å·¥ä½ä¸éå°ç乿¯è¾å¤ï¼å ä¸ºï¼æä¼è±æ´å¤æ¶é´æ¥ä»ç»ã
---
## ä»ä¹æ¯è´è½½åè¡¡ï¼
**è´è½½åè¡¡** æçæ¯å°ç¨æ·è¯·æ±åæå°ä¸åçæå¡å¨ä¸å¤çï¼ä»¥æé«ç³»ç»æ´ä½çå¹¶åå¤çè½å以åå¯é æ§ãè´è½½åè¡¡æå¡å¯ä»¥æç±ä¸é¨ç软件æè
硬件æ¥å®æï¼ä¸è¬æ
åµä¸ï¼ç¡¬ä»¶çæ§è½æ´å¥½ï¼è½¯ä»¶çä»·æ ¼æ´ä¾¿å®ï¼åæä¼è¯¦ç»ä»ç»å°ï¼ã
ä¸å¾æ¯[ãJava é¢è¯æåã](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247519384&idx=1&sn=bc7e71af75350b755f04ca4178395b1a&chksm=cea1c353f9d64a458f797696d4144b4d6e58639371a4612b8e4d106d83a66d2289e7b2cd7431&token=660789642&lang=zh_CN&scene=21#wechat_redirect) ãé«å¹¶åç¯ãä¸çä¸ç¯æç« çé
å¾ï¼ä»å¾ä¸å¯ä»¥çåºï¼ç³»ç»çååæå¡é¨ç½²äºå¤ä»½å¨ä¸åçæå¡å¨ä¸ï¼ä¸ºäºå®ç°è®¿é®ååæå¡è¯·æ±çåæµï¼æä»¬ç¨å°äºè´è½½åè¡¡ã

è´è½½åè¡¡æ¯ä¸ç§æ¯è¾å¸¸ç¨ä¸å®æ½èµ·æ¥è¾ä¸ºç®åçæé«ç³»ç»å¹¶åè½ååå¯é æ§çææ®µï¼ä¸è®ºæ¯å使¶æçç³»ç»è¿æ¯å¾®æå¡æ¶æçç³»ç»å ä¹é½ä¼ç¨å°ã
## è´è½½åè¡¡å为åªå ç§ï¼
è´è½½åè¡¡å¯ä»¥ç®åå为 **æå¡ç«¯è´è½½åè¡¡** å **客æ·ç«¯è´è½½åè¡¡** è¿ä¸¤ç§ã
æå¡ç«¯è´è½½åè¡¡æ¶åå°çç¥è¯ç¹æ´å¤ï¼å·¥ä½ä¸éå°ç乿¯è¾å¤ï¼å ä¸ºï¼æä¼è±æ´å¤æ¶é´æ¥ä»ç»ã
### æå¡ç«¯è´è½½åè¡¡
**æå¡ç«¯è´è½½åè¡¡** 主è¦åºç¨å¨ **ç³»ç»å¤é¨è¯·æ±** å **ç½å
³å±** ä¹é´ï¼å¯ä»¥ä½¿ç¨ **软件** æè
**硬件** å®ç°ã
ä¸å¾æ¯æç»çä¸ä¸ªç®åçåºäº Nginx çæå¡ç«¯è´è½½å衡示æå¾ï¼

**硬件è´è½½åè¡¡** éè¿ä¸é¨ç硬件设å¤ï¼æ¯å¦ **F5ãA10ãArray** ï¼å®ç°è´è½½åè¡¡åè½ã
硬件è´è½½åè¡¡çä¼å¿æ¯æ§è½å¾å¼ºä¸ç¨³å®ï¼ç¼ºç¹å°±æ¯å®å¨æ¯å¤ªè´µäºãååºç¡æ¬¾ç F5 æä½ä¹è¦ 20 å¤ä¸ï¼ç»å¤§é¨åå
¬å¸æ¯æ ¹æ¬è´æ
ä¸èµ·çï¼ä¸å¡éä¸å¤§çè¯ï¼ç没å¿
è¦éè¦å»å¼ä¸ªç¡¬ä»¶æ¥åè´è½½åè¡¡ï¼ç¨è½¯ä»¶è´è½½å衡就足å¤äºï¼
卿们æ¥å¸¸å¼åä¸ï¼ä¸è¬å¾é¾æ¥è§¦å°ç¡¬ä»¶è´è½½åè¡¡ï¼æ¥è§¦çæ¯è¾å¤çè¿æ¯ **软件è´è½½åè¡¡** ã软件è´è½½åè¡¡éè¿è½¯ä»¶ï¼æ¯å¦ **LVSãNginxãHAproxy** ï¼å®ç°è´è½½åè¡¡åè½ï¼æ§è½è½ç¶å·®ä¸äºï¼ä½ä»·æ ¼ä¾¿å®åï¼ååºç¡æ¬¾ç Linux æå¡å¨ä¹å°±å åï¼æ§è½å¥½ä¸ç¹ç 2~3 ä¸çå°±å¾ä¸éäºã
æ ¹æ® OSI 模åï¼æå¡ç«¯è´è½½åè¡¡è¿å¯ä»¥å为ï¼
- äºå±è´è½½åè¡¡
- ä¸å±è´è½½åè¡¡
- åå±è´è½½åè¡¡
- ä¸å±è´è½½åè¡¡
æå¸¸è§çæ¯åå±åä¸å±è´è½½åè¡¡ï¼å æ¤ï¼æ¬æä¹æ¯éç¹ä»ç»è¿ä¸¤ç§è´è½½åè¡¡ã
> Nginx å®ç½å¯¹åå±è´è½½åä¸å±è´è½½åè¡¡åè¡¡åäºè¯¦ç»ä»ç»ï¼æå
´è¶£çå¯ä»¥ççã
>
> - [What Is Layer 4 Load Balancing?](https://www.nginx.com/resources/glossary/layer-4-load-balancing/)
> - [What Is Layer 7 Load Balancing?](https://www.nginx.com/resources/glossary/layer-7-load-balancing/)

- **åå±è´è½½åè¡¡** å·¥ä½å¨ OSI 模å第åå±ï¼ä¹å°±æ¯ä¼ è¾å±ï¼è¿ä¸å±ç主è¦åè®®æ¯ TCP/UDPï¼è´è½½åè¡¡å¨å¨è¿ä¸å±è½å¤çå°æ°æ®å
éçæºç«¯å£å°å以åç®ç端å£å°åï¼ä¼åºäºè¿äºä¿¡æ¯éè¿ä¸å®çè´è½½åè¡¡ç®æ³å°æ°æ®å
转åå°å端ç宿å¡å¨ãä¹å°±æ¯è¯´ï¼åå±è´è½½åè¡¡çæ ¸å¿å°±æ¯ IP+端å£å±é¢çè´è½½åè¡¡ï¼ä¸æ¶åå
·ä½çæ¥æå
容ã
- **ä¸å±è´è½½åè¡¡** å·¥ä½å¨ OSI 模å第ä¸å±ï¼ä¹å°±æ¯åºç¨å±ï¼è¿ä¸å±ç主è¦åè®®æ¯ HTTP ãè¿ä¸å±çè´è½½åè¡¡æ¯åå±è´è½½åè¡¡è·¯ç±ç½ç»è¯·æ±çæ¹å¼æ´å 夿ï¼å®ä¼è¯»åæ¥æçæ°æ®é¨åï¼æ¯å¦è¯´æä»¬ç HTTP é¨åçæ¥æï¼ï¼ç¶åæ ¹æ®è¯»åå°çæ°æ®å
容ï¼å¦ URLãCookieï¼ååºè´è½½åè¡¡å³çãä¹å°±æ¯è¯´ï¼ä¸å±è´è½½åè¡¡å¨çæ ¸å¿æ¯æ¥æå
容ï¼å¦ URLãCookieï¼å±é¢çè´è½½åè¡¡ï¼æ§è¡ç¬¬ä¸å±è´è½½åè¡¡ç设å¤é常被称为 **åå代çæå¡å¨** ã
ä¸å±è´è½½åè¡¡æ¯åå±è´è½½åè¡¡ä¼æ¶èæ´å¤çæ§è½ï¼ä¸è¿ï¼ä¹ç¸å¯¹æ´å çµæ´»ï¼è½å¤æ´å æºè½å°è·¯ç±ç½ç»è¯·æ±ï¼æ¯å¦è¯´ä½ å¯ä»¥æ ¹æ®è¯·æ±çå
容è¿è¡ä¼åå¦ç¼åãå缩ãå å¯ã
ç®åæ¥è¯´ï¼**åå±è´è½½åè¡¡æ§è½æ´å¼ºï¼ä¸å±è´è½½åè¡¡åè½æ´å¼ºï¼** ä¸è¿ï¼å¯¹äºç»å¤§é¨åä¸å¡åºæ¯æ¥è¯´ï¼åå±è´è½½åè¡¡åä¸å±è´è½½åè¡¡çæ§è½å·®å¼åºæ¬å¯ä»¥å¿½ç¥ä¸è®¡çã
ä¸é¢è¿æ®µè¯æèª Nginx å®ç½ç [What Is Layer 4 Load Balancing?](https://www.nginx.com/resources/glossary/layer-4-load-balancing/) è¿ç¯æç« ã
> Layer 4 load balancing was a popular architectural approach to traffic handling when commodity hardware was not as powerful as it is now, and the interaction between clients and application servers was much less complex. It requires less computation than more sophisticated load balancing methods (such as Layer 7), but CPU and memory are now sufficiently fast and cheap that the performance advantage for Layer 4 load balancing has become negligible or irrelevant in most situations.
>
> 第 4 å±è´è½½å¹³è¡¡æ¯ä¸ç§æµè¡çæµéå¤çä½ç³»ç»ææ¹æ³ï¼å½æ¶åç¨ç¡¬ä»¶æ²¡æç°å¨è¿ä¹å¼ºå¤§ï¼å®¢æ·ç«¯ååºç¨ç¨åºæå¡å¨ä¹é´ç交äºä¹ä¸é£ä¹å¤æã宿¯æ´å¤æçè´è½½å¹³è¡¡æ¹æ³(å¦ç¬¬ 7 å±)éè¦æ´å°ç计ç®éï¼ä½æ¯ CPU åå
åç°å¨è¶³å¤å¿«å便å®ï¼å¨å¤§å¤æ°æ
åµä¸ï¼ç¬¬ 4 å±è´è½½å¹³è¡¡çæ§è½ä¼å¿å·²ç»åå¾å¾®ä¸è¶³éææ å
³ç´§è¦ã
å¨å·¥ä½ä¸ï¼æä»¬é常ä¼ä½¿ç¨ **Nginx** æ¥åä¸å±è´è½½åè¡¡ï¼LVS(Linux Virtual Server èææå¡å¨ï¼ Linux å
æ ¸ç 4 å±è´è½½åè¡¡)æ¥ååå±è´è½½åè¡¡ã
å
³äº Nginx ç常è§ç¥è¯ç¹æ»ç»ï¼[ãJava é¢è¯æåã](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html) ä¸ãææ¯é¢è¯é¢ç¯ãä¸å·²ç»æå¯¹åºçå
容äºï¼æå
´è¶£çå°ä¼ä¼´å¯ä»¥å»ççã

ä¸è¿ï¼LVS è¿ä¸ªç»å¤§é¨åå
¬å¸çç¨ä¸ä¸ï¼åé¿éãç¾åº¦ãè
¾è®¯ãeBay ç大åæä¼ä½¿ç¨å°ï¼ç¨çæå¤çè¿æ¯ Nginxã
### 客æ·ç«¯è´è½½åè¡¡
**客æ·ç«¯è´è½½åè¡¡** 主è¦åºç¨äºç³»ç»å
é¨çä¸åçæå¡ä¹é´ï¼å¯ä»¥ä½¿ç¨ç°æçè´è½½åè¡¡ç»ä»¶æ¥å®ç°ã
å¨å®¢æ·ç«¯è´è½½åè¡¡ä¸ï¼å®¢æ·ç«¯ä¼èªå·±ç»´æ¤ä¸ä»½æå¡å¨çå°åå表ï¼åé请æ±ä¹åï¼å®¢æ·ç«¯ä¼æ ¹æ®å¯¹åºçè´è½½åè¡¡ç®æ³æ¥éæ©å
·ä½æä¸å°æå¡å¨å¤ç请æ±ã
客æ·ç«¯è´è½½åè¡¡å¨åæå¡è¿è¡å¨åä¸ä¸ªè¿ç¨æè
说 Java ç¨åºéï¼ä¸åå¨é¢å¤çç½ç»å¼éãä¸è¿ï¼å®¢æ·ç«¯è´è½½åè¡¡çå®ç°ä¼åå°ç¼ç¨è¯è¨çéå¶ï¼æ¯å¦è¯´ Spring Cloud Load Balancer å°±åªè½ç¨äº Java è¯è¨ã
Java é¢å主æµçå¾®æå¡æ¡æ¶ DubboãSpring Cloud çé½å
ç½®äºå¼ç®±å³ç¨ç客æ·ç«¯è´è½½åè¡¡å®ç°ãDubbo å±äºæ¯é»è®¤èªå¸¦äºè´è½½åè¡¡åè½ï¼Spring Cloud æ¯éè¿ç»ä»¶çå½¢å¼å®ç°çè´è½½åè¡¡ï¼å±äºå¯éé¡¹ï¼æ¯è¾å¸¸ç¨çæ¯ Spring Cloud Load Balancerï¼å®æ¹ï¼æ¨èï¼ å Ribbonï¼Netflixï¼å·²è¢«å¯ç¨ï¼ã
ä¸å¾æ¯æç»çä¸ä¸ªç®åçåºäº Spring Cloud Load Balancerï¼Ribbon ä¹ç±»ä¼¼ï¼ ç客æ·ç«¯è´è½½å衡示æå¾ï¼

## è´è½½å衡常è§çç®æ³æåªäºï¼
### éæºæ³
**éæºæ³** æ¯æç®åç²æ´çè´è½½åè¡¡ç®æ³ã
å¦ææ²¡æé
ç½®æéçè¯ï¼ææçæå¡å¨è¢«è®¿é®å°çæ¦ç齿¯ç¸åçã妿é
ç½®æéçè¯ï¼æéè¶é«çæå¡å¨è¢«è®¿é®çæ¦çå°±è¶å¤§ã
æªå æéçéæºç®æ³éåäºæå¡å¨æ§è½ç¸è¿çé群ï¼å
¶ä¸æ¯ä¸ªæå¡å¨æ¿è½½ç¸åçè´è½½ãå æéæºç®æ³éåäºæå¡å¨æ§è½ä¸ççéç¾¤ï¼æéçåå¨å¯ä»¥ä½¿è¯·æ±åé
æ´å åçåã
ä¸è¿ï¼éæºç®æ³æä¸ä¸ªæ¯è¾ææ¾ç缺é·ï¼é¨åæºå¨å¨ä¸æ®µæ¶é´ä¹å
æ æ³è¢«éæºå°ï¼æ¯ç«æ¯æ¦çç®æ³ï¼å°±ç®æ¯å¤§å®¶æé䏿 ·ï¼ ä¹å¯è½ä¼åºç°è¿ç§æ
åµã
äºæ¯ï¼**轮询æ³** æ¥äºï¼
### 轮询æ³
è½®è¯¢æ³æ¯æ¨ä¸ªè½®è¯¢æå¡å¨å¤çï¼ä¹å¯ä»¥è®¾ç½®æéã
å¦ææ²¡æé
ç½®æéçè¯ï¼æ¯ä¸ªè¯·æ±ææ¶é´é¡ºåºéä¸åé
å°ä¸åçæå¡å¨å¤çã妿é
ç½®æéçè¯ï¼æéè¶é«çæå¡å¨è¢«è®¿é®ç次æ°å°±è¶å¤ã
æªå æéçè½®è¯¢ç®æ³éåäºæå¡å¨æ§è½ç¸è¿çé群ï¼å
¶ä¸æ¯ä¸ªæå¡å¨æ¿è½½ç¸åçè´è½½ãå æè½®è¯¢ç®æ³éåäºæå¡å¨æ§è½ä¸ççéç¾¤ï¼æéçåå¨å¯ä»¥ä½¿è¯·æ±åé
æ´å åçåã
### ä¸è´æ§ Hash æ³
ç¸ååæ°çè¯·æ±æ»æ¯åå°åä¸å°æå¡å¨å¤çï¼æ¯å¦å个 IP ç请æ±ã
### æå°è¿æ¥æ³
彿æ°ç请æ±åºç°æ¶ï¼éåæå¡å¨èç¹å表并éåå
¶ä¸æ´»å¨è¿æ¥æ°æå°çä¸å°æå¡å¨æ¥ååºå½å请æ±ãæ´»å¨è¿æ¥æ°å¯ä»¥ç解为å½åæ£å¨å¤ççè¯·æ±æ°ã
æå°è¿æ¥æ³å¯ä»¥å°½å¯è½æå¤§å°ä½¿è¯·æ±åé
æ´å åçåï¼æé«æå¡å¨çå©ç¨çãä¸è¿ï¼è¿ç§æ¹æ³å®ç°èµ·æ¥ä¹æå¤æï¼éè¦çæ§æ¯ä¸å°æå¡å¨å¤çç请æ±è¿æ¥æ°ã
## ä¸å±è´è½½åè¡¡å¯ä»¥æä¹åï¼
ç®åä»ç»ä¸¤ç§é¡¹ç®ä¸å¸¸ç¨çä¸å±è´è½½åè¡¡è§£å³æ¹æ¡ï¼DNS è§£æååå代çã
é¤äºæä»ç»çè¿ä¸¤ç§è§£å³æ¹æ¡ä¹å¤ï¼HTTP éå®åçææ®µä¹å¯ä»¥ç¨æ¥å®ç°è´è½½åè¡¡ï¼ä¸è¿ï¼ç¸å¯¹æ¥è¯´ï¼è¿æ¯ DNS è§£æååå代çç¨çæ´å¤ä¸äºï¼ä¹æ´æ¨èä¸äºã
### DNS è§£æ
DNS è§£ææ¯æ¯è¾æ©æçä¸å±è´è½½åè¡¡å®ç°æ¹å¼ï¼é常ç®åã
DNS è§£æå®ç°è´è½½åè¡¡çåçæ¯è¿æ ·çï¼å¨ DNS æå¡å¨ä¸ä¸ºåä¸ä¸ªä¸»æºè®°å½é
ç½®å¤ä¸ª IP å°åï¼è¿äº IP å°å对åºä¸åçæå¡å¨ãå½ç¨æ·è¯·æ±ååçæ¶åï¼DNS æå¡å¨éç¨è½®è¯¢ç®æ³è¿å IP å°åï¼è¿æ ·å°±å®ç°äºè½®è¯¢çè´è½½åè¡¡ã

ç°å¨ç DNS è§£æå ä¹é½æ¯æ IP å°åçæéé
ç½®ï¼è¿æ ·çè¯ï¼å¨æå¡å¨æ§è½ä¸ççé群ä¸è¯·æ±åé
伿´å åçåãåæèªå·±ç®åæ£å¨ç¨çé¿éäº DNS å°±æ¯ææéé
ç½®ã

### åå代ç
客æ·ç«¯å°è¯·æ±åéå°åå代çæå¡å¨ï¼ç±åå代çæå¡å¨å»éæ©ç®æ æå¡å¨ï¼è·åæ°æ®ååè¿åç»å®¢æ·ç«¯ã坹夿´é²çæ¯åå代çæå¡å¨å°åï¼éèäºç宿å¡å¨ IP å°åãåå代çâ代çâçæ¯ç®æ æå¡å¨ï¼è¿ä¸ä¸ªè¿ç¨å¯¹äºå®¢æ·ç«¯èè¨æ¯éæçã
Nginx å°±æ¯æå¸¸ç¨çåå代çæå¡å¨ï¼å®å¯ä»¥å°æ¥æ¶å°ç客æ·ç«¯è¯·æ±ä»¥ä¸å®çè§åï¼è´è½½åè¡¡çç¥ï¼ååå°åé
å°è¿ä¸ªæå¡å¨éç¾¤ä¸ææçæå¡å¨ä¸ã
åå代çè´è½½åè¡¡åæ ·å±äºä¸å±è´è½½åè¡¡ã

## 客æ·ç«¯è´è½½åè¡¡éå¸¸æ¯æä¹åçï¼
æä»¬ä¸é¢ä¹è¯´äºï¼å®¢æ·ç«¯è´è½½åè¡¡å¯ä»¥ä½¿ç¨ç°æçè´è½½åè¡¡ç»ä»¶æ¥å®ç°ã
**Netflix Ribbon** å **Spring Cloud Load Balancer** å°±æ¯ç®å Java çæææµè¡ç两个è´è½½åè¡¡ç»ä»¶ã
Ribbon æ¯èçè´è½½åè¡¡ç»ä»¶ï¼ç± Netflix å¼åï¼åè½æ¯è¾å
¨é¢ï¼æ¯æçè´è½½åè¡¡çç¥ä¹æ¯è¾å¤ã Spring Cloud Load Balancer æ¯ Spring 宿¹ä¸ºäºå代 Ribbon èæ¨åºçï¼åè½ç¸å¯¹æ´ç®åä¸äºï¼æ¯æçè´è½½åè¡¡ä¹å°ä¸äºã
Ribbon æ¯æç 7 ç§è´è½½åè¡¡çç¥ï¼
- `RandomRule`ï¼éæºçç¥ã
- `RoundRobinRule`ï¼é»è®¤ï¼ï¼è½®è¯¢çç¥
- `WeightedResponseTimeRule`ï¼æéï¼æ ¹æ®ååºæ¶é´å³å®æéï¼çç¥
- `BestAvailableRule`ï¼æå°è¿æ¥æ°çç¥
- `RetryRule`ï¼éè¯çç¥ï¼æç
§è½®è¯¢çç¥æ¥è·åæå¡ï¼å¦æè·åçæå¡å®ä¾ä¸º null æå·²ç»å¤±æï¼å卿å®çæ¶é´ä¹å
䏿å°è¿è¡éè¯æ¥è·åæå¡ï¼å¦æè¶
è¿æå®æ¶é´ä¾ç¶æ²¡è·åå°æå¡å®ä¾åè¿å nullï¼
- `AvailabilityFilteringRule`ï¼å¯ç¨æææ§çç¥ï¼å
è¿æ»¤æéå¥åº·çæå¡å®ä¾ï¼ç¶ååéæ©è¿æ¥æ°è¾å°çæå¡å®ä¾ï¼
- `ZoneAvoidanceRule`ï¼åºåæææ§çç¥ï¼æ ¹æ®æå¡æå¨åºåçæ§è½åæå¡çå¯ç¨æ§æ¥éæ©æå¡å®ä¾ï¼
Spring Cloud Load Balancer æ¯æç 2 ç§è´è½½åè¡¡çç¥ï¼
- `RandomLoadBalancer`ï¼éæºçç¥
- `RoundRobinLoadBalancer`ï¼é»è®¤ï¼ï¼è½®è¯¢çç¥
```java
public class CustomLoadBalancerConfiguration {
@Bean
ReactorLoadBalancer