一、 前言
負載均衡,英文:Load Balance,其含義是請求分發到多個粒度單元上進行執行操做,例如各類服務器、應用服務、中臺服務、數據服務等,從而達到共同完成某項任務的目的。爲了拓寬網絡設備和服務器的帶寬、增長吞吐量、增強網絡請求處理能力、提升網絡的靈活性和高可用性,負載均衡是一種廉價、有效、透明的方法,它爲服務的高併發作了一次緩衝,讓單個服務的壓力瞬間減小,實現了服務的高可用,避免服務由於壓力而面臨宕機的危險。github
二、負載均衡
2.1 基於網絡的負載均衡
你們都知道,OSI 模型有 7 層結構,每層均可以有幾個子層。OSI 的 7 層從上到下分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層:web

在這七層結構中,高層次都是依賴於低層次的。層次越高,使用起來越方便。面試
根據負載均衡技術實如今 OSI 七層模型的不一樣層次,是能夠給負載均衡分類的。算法
常見的實現方式中,主要能夠在應用層、傳輸層、網絡層和數據傳輸層作文章。因此,工做在應用層的負載均衡,咱們一般稱之爲七層負載均衡、工做在傳輸層的咱們稱之爲四層負載均衡。咱們一個個來看看:spring
七層負載均衡
七層負載均衡工做在 OSI 模型的應用層,應用層協議較多,經常使用 http、dns、ftp 等。七層負載就能夠基於這些協議來負載。這些應用層協議中會包含不少有意義的內容。好比同一個 Web 服務器的負載均衡,除了根據 IP 加 port 進行負載外,還可根據 URL 來決定是否要進行負載均衡。docker
四層負載均衡
四層負載均衡工做在 OSI 模型的傳輸層,因爲在傳輸層,只有 TCP/UDP 協議,這兩種協議中除了包含源 IP、目標 IP 之外,還包含源端口及目的端口。四層負載均衡服務器在接受到客戶端請求後,之後經過修改數據包的地址信息(IP+端口號)將流量轉發到應用服務器。後端
2.2 負載均衡工具
負載均衡的工具,常見的有 Nginx、k8s、Ribbon、Feign、HAProxy 等。api
Nginx
Nginx 主要用來做七層負載均衡,反向代理 http、https 的協議連接,同時也提供了 IMAP/POP3/SMTP 的服務。服務器
upstream proxy_demo_aaa {
server {{DEMO_SERVER_NODE1}} weight=5;
server {{DEMO_SERVER_NODE2}} weight=6;
}
location ~ ^/demo-aaa/api(.*)$ {
proxy_pass http://proxy_demo_aaa/api$1$is_args$args;
}
k8s
k8s 的負載均衡是基於 kube-proxy,其服務發現基於 kube-dns,最後因爲每一個 Service 對應的 pod 能夠是多個,因此能夠基於 kube-proxy 實現負載均衡,kube-proxy 進程其實就是一個智能的軟件負載均衡器,他負責把 service 的請求轉發到後端的某個 pod 實例。
Ribbon
Ribbon 是一個爲客戶端提供負載均衡功能的服務,它內部提供了一個叫作 ILoadBalance 的接口表明負載均衡器的操做,好比有添加服務器、選擇服務器、獲取全部的服務器列表、獲取可用的服務器列表等等。
常見的,使用 RestTemplate 進行服務提供者、服務消費者之間的通訊,只需爲 RestTemplate 配置類添加@LoadBalanced 註解便可。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
Feign
Feign 是一個聲明式負載均衡客戶端使用 Feign 能讓編寫 WebService 的客戶端更加簡單,它的使用方法是定義一個接口,而後在上面添加註解,同時也支持 JAX-RS 標準的註解。Feign 也支持可拔插式的編碼器和解碼器。
@FeignClient(name = "provider-service", configuration = {Feign4HttpConfiguration.class, FeignLogConfiguration.class}, fallback = CustomerClientImpl.class)
public interface CustomerClient {
@PostMapping("/save")
String save();
@GetMapping("/api/user/getUserInfo")
Response<Object> getUserInfo();
}
HAProxy
HAProxy 是一個使用 C 語言編寫的自由、開放源代碼軟件,其提供高可用性、負載均衡,以及基於 TCP 和 HTTP 的應用程序代理的功能。
2.3 負載均衡算法
常見的幾種負載均衡的算法有:隨機、輪詢、最少連接、Hash、加權、重試等。
-
隨機:即請求隨機分配到各臺服務器上,這是默認的策略機制。
-
輪詢:將全部請求,依次分發到每臺服務器上,適合服務器硬件相同的場景,服務請求數相同。
-
最少連接:將本次請求分配到請求數最少的服務上,這種能夠根據服務器當前的請求處理狀況,動態分配。
-
Hash:根據 IP 地址進行 Hash 計算,獲得 IP 地址,這種能夠未來自同一 IP 地址的請求,同一會話期內,轉發到同一服務器;實現會話粘滯。但目標服務器宕機後,會話也會隨之丟失。
-
加權:在上面幾種算法基礎上,進行必定的加權比例分配。
-
重試:這種策略通常都會有,就是在調用失敗後,進行二次重試機制。
固然,還有其餘的動態的算法規則:最快模式、觀察模式、動態性能分配等。
結束福利
開源基於 k8s 做微服務負載均衡、配置管理的架構設計代碼:
https://github.com/damon008/spring-cloud-k8s
https://gitee.com/damon_one/spring-cloud-k8s
歡迎你們 star,多多指教。
關於做者
筆名:Damon,技術愛好者,長期從事 Java 開發、Spring Cloud 的微服務架構設計,以及結合 docker、k8s 作微服務容器化,自動化部署等一站式項目部署、落地。Go 語言學習,k8s 研究,邊緣計算框架 KubeEdge 等。公衆號 程序猿Damon
發起人。我的微信 MrNull008
,歡迎來撩。
歡迎關注 InfoQ: https://www.infoq.cn/profile/1905020/following/user
往期回顧
ArrayList、LinkedList 你真的瞭解嗎?
Spring Cloud 諸多形式組件,你都知道嗎?
淺談 Java 集合 | 底層源碼解析
Spring Cloud Kubernetes之實戰一配置管理
Spring Cloud Kubernetes之實戰二服務註冊與發現
Spring Cloud Kubernetes之實戰三網關Gateway
關注公衆號,回覆入羣,獲取更多驚喜!公衆號(程序猿Damon)裏回覆 ES、Flink、Java、Kafka、MQ、ML、監控、大數據、k8s 等關鍵字能夠查看更多關鍵字對應的文章。
若有收穫,點個在看,謝謝
本文分享自微信公衆號 - 程序猿Damon(Damon4X)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。