淺談負載均衡

點擊上方藍色字體,關注咱們git





一、 前言



負載均衡,英文: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、加權、重試等。


  1. 隨機:即請求隨機分配到各臺服務器上,這是默認的策略機制。

  2. 輪詢:將全部請求,依次分發到每臺服務器上,適合服務器硬件相同的場景,服務請求數相同。

  3. 最少連接:將本次請求分配到請求數最少的服務上,這種能夠根據服務器當前的請求處理狀況,動態分配。

  4. Hash:根據 IP 地址進行 Hash 計算,獲得 IP 地址,這種能夠未來自同一 IP 地址的請求,同一會話期內,轉發到同一服務器;實現會話粘滯。但目標服務器宕機後,會話也會隨之丟失。

  5. 加權:在上面幾種算法基礎上,進行必定的加權比例分配。

  6. 重試:這種策略通常都會有,就是在調用失敗後,進行二次重試機制。


固然,還有其餘的動態的算法規則:最快模式、觀察模式、動態性能分配等。



結束福利


開源基於 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

往期回顧

微服務自動化部署CI/CD

ArrayList、LinkedList&nbsp;你真的瞭解嗎?

Oauth2的認證明戰-HA篇

Oauth2的受權碼模式《上》

微服務架構設計之解耦合

面試被問 Spring cloud 上下文,能夠這樣回答

Spring&nbsp;Cloud&nbsp;諸多形式組件,你都知道嗎?

淺談&nbsp;Java&nbsp;集合&nbsp;|&nbsp;底層源碼解析

基於 Sentinel 做熔斷 | 文末贈資料

基礎設施服務k8s快速部署之HA篇

今天被問微服務,這幾點,讓面試官另眼相看

Spring cloud 之多種方式限流(實戰)

Spring cloud 之熔斷機制(實戰)

面試被問finally 和 return,到底誰先執行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之實戰一配置管理

Spring Cloud Kubernetes之實戰二服務註冊與發現

Spring Cloud Kubernetes之實戰三網關Gateway





求關注

關注公衆號,回覆入羣,獲取更多驚喜!公衆號(程序猿Damon)裏回覆 ES、Flink、Java、Kafka、MQ、ML、監控、大數據、k8s 等關鍵字能夠查看更多關鍵字對應的文章。




若有收穫,點個在看,謝謝

本文分享自微信公衆號 - 程序猿Damon(Damon4X)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索