淺談SpringCloud之Ribbon詳解
一、什么是負(fù)載均衡
負(fù)載均衡:建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。
現(xiàn)在網(wǎng)站的架構(gòu)已經(jīng)從C/S模式轉(zhuǎn)變?yōu)锽/S模式,C/S模式是有一個(gè)專門的客戶端,而B/S模式是將瀏覽器作為客戶端。當(dāng)用戶在瀏覽器上輸入一個(gè)網(wǎng)址按下回車鍵后,就會(huì)產(chǎn)生一個(gè)請(qǐng)求,在遠(yuǎn)方的服務(wù)器會(huì)處理這個(gè)請(qǐng)求,根據(jù)這個(gè)請(qǐng)求來生成用戶想要的頁面,然后將這個(gè)頁面響應(yīng)給瀏覽器,這樣用戶就能看到他想要看到的東西。我們知道,一臺(tái)服務(wù)器處理數(shù)據(jù)(請(qǐng)求也是一種數(shù)據(jù))的能力是有限的,當(dāng)有大量的用戶同時(shí)在瀏覽器上輸入網(wǎng)址并按下回車鍵后,就會(huì)有大量的請(qǐng)求產(chǎn)生,遠(yuǎn)方的服務(wù)器就不得不處理這些請(qǐng)求,由于請(qǐng)求數(shù)量過多,服務(wù)器處理的效率就會(huì)變慢,響應(yīng)時(shí)間就會(huì)變長,這樣用戶就不能在可以忍受的時(shí)間內(nèi)看到自己想看到的東西,嚴(yán)重影響體驗(yàn)效果。更嚴(yán)重一點(diǎn),如果請(qǐng)求數(shù)量超過了這臺(tái)服務(wù)器所能處理的最大請(qǐng)求,服務(wù)器就會(huì)崩潰,直接導(dǎo)致網(wǎng)站癱瘓。
那么,有什么方法能夠解決這個(gè)問題呢?答案就是建立一個(gè)集群(就是一群服務(wù)器),通過集群的力量來提高服務(wù)端的數(shù)據(jù)處理能力,因?yàn)橐慌_(tái)服務(wù)器的處理能力肯定比不上多臺(tái)服務(wù)器的處理能力。
這樣我們?cè)趤砻枋鲆幌掠脩粽?qǐng)求頁面的過程:首先用戶在瀏覽器輸入網(wǎng)址并按下回車鍵,然后會(huì)產(chǎn)生一個(gè)請(qǐng)求,遠(yuǎn)方的服務(wù)器會(huì)處理這個(gè)請(qǐng)求…等等,現(xiàn)在遠(yuǎn)方有很多服務(wù)器,到底哪個(gè)服務(wù)器來處理這個(gè)請(qǐng)求呢,總不能所有的服務(wù)器都處理這個(gè)請(qǐng)求吧。哪個(gè)服務(wù)器處理這個(gè)請(qǐng)求?大家明白了吧,這就是負(fù)載均衡所要解決的問題?;氐缴线呎?qǐng)求頁面的過程,這個(gè)請(qǐng)求此時(shí)會(huì)被一臺(tái)專門的服務(wù)器來處理,這臺(tái)服務(wù)器其實(shí)就是個(gè)集群的老大,他負(fù)責(zé)把這個(gè)請(qǐng)求派給下面哪個(gè)小弟(服務(wù)器)來處理,處理完之后返回頁面用戶。當(dāng)有多個(gè)請(qǐng)求同時(shí)發(fā)生時(shí),集群的老大可以將請(qǐng)求派給不同的小弟,這樣處理的效率就會(huì)大幅提升,充分發(fā)揮集群的力量,至于哪個(gè)請(qǐng)求到底派給哪個(gè)小弟,這就是調(diào)度策略的問題了。
二、實(shí)現(xiàn)負(fù)載均衡的三種方式
(1)HTTP重定向?qū)崿F(xiàn)負(fù)載均衡
利用HTTP重定向協(xié)議實(shí)現(xiàn)負(fù)載均衡大概工作原理如下圖:
HTTP重定向服務(wù)器是一臺(tái)普通的應(yīng)用服務(wù)器,其唯一個(gè)功能就是根據(jù)用戶的HTTP請(qǐng)求計(jì)算出一臺(tái)真實(shí)的服務(wù)器地址,并將該服務(wù)器地址寫入HTTP重定向響應(yīng)中(重定向響應(yīng)狀態(tài)碼為302)返回給用戶瀏覽器。用戶瀏覽器在獲取到響應(yīng)之后,根據(jù)返回的信息,重新發(fā)送一個(gè)請(qǐng)求到真實(shí)的服務(wù)器上。如上圖所示,瀏覽器訪問www.apusapp.com,DNS服務(wù)器解析到IP地址為114.100.20.200,即HTTP重定向服務(wù)器的IP地址。重定向服務(wù)器計(jì)根據(jù)某種負(fù)載均衡算法算出真實(shí)的服務(wù)器地址為114.100.20.203并返回給用戶瀏覽器,用戶瀏覽器得到返回后重新對(duì)114.100.20.203發(fā)起了請(qǐng)求,最后完成訪問。
這種負(fù)載均衡方案的有點(diǎn)是比較簡單,缺點(diǎn)是瀏覽器需要兩次請(qǐng)求服務(wù)器才能完成一次訪問,性能較差;同時(shí),重定向服務(wù)器本身的處理能力有可能成為瓶頸,整個(gè)集群的伸縮性規(guī)模有限;使用HTTP返回碼302重定向,有可能使搜索引擎判斷為SEO作弊,降低搜索排名。因此實(shí)踐中很少使用這種負(fù)載均衡方案來部署。
(2)DNS負(fù)載均衡
DNS(Domain Name System)是因特網(wǎng)的一項(xiàng)服務(wù),它作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使人更方便的訪問互聯(lián)網(wǎng)。人們?cè)谕ㄟ^瀏覽器訪問網(wǎng)站時(shí)只需要記住網(wǎng)站的域名即可,而不需要記住那些不太容易理解的IP地址。在DNS系統(tǒng)中有一個(gè)比較重要的的資源類型叫做主機(jī)記錄也稱為A記錄,A記錄是用于名稱解析的重要記錄,它將特定的主機(jī)名映射到對(duì)應(yīng)主機(jī)的IP地址上。如果你有一個(gè)自己的域名,那么要想別人能訪問到你的網(wǎng)站,你需要到特定的DNS解析服務(wù)商的服務(wù)器上填寫A記錄,過一段時(shí)間后,別人就能通過你的域名訪問你的網(wǎng)站了。DNS除了能解析域名之外還具有負(fù)載均衡的功能,下面是利用DNS工作原理處理負(fù)載均衡的工作原理圖:
由上圖可以看出,在DNS服務(wù)器中應(yīng)該配置了多個(gè)A記錄,如:
www.apusapp.com IN A 114.100.20.201;
www.apusapp.com IN A 114.100.20.202;
www.apusapp.com IN A 114.100.20.203;
因此,每次域名解析請(qǐng)求都會(huì)根據(jù)對(duì)應(yīng)的負(fù)載均衡算法計(jì)算出一個(gè)不同的IP地址并返回,這樣A記錄中配置多個(gè)服務(wù)器就可以構(gòu)成一個(gè)集群,并可以實(shí)現(xiàn)負(fù)載均衡。上圖中,用戶請(qǐng)求www.apusapp.com,DNS根據(jù)A記錄和負(fù)載均衡算法計(jì)算得到一個(gè)IP地址114.100.20.203,并返回給瀏覽器,瀏覽器根據(jù)該IP地址,訪問真實(shí)的物理服務(wù)器114.100.20.203。所有這些操作對(duì)用戶來說都是透明的,用戶可能只知道www.apusapp.com這個(gè)域名。
DNS域名解析負(fù)載均衡有如下優(yōu)點(diǎn):
1.將負(fù)載均衡的工作交給DNS,省去了網(wǎng)站管理維護(hù)負(fù)載均衡服務(wù)器的麻煩。
2.技術(shù)實(shí)現(xiàn)比較靈活、方便,簡單易行,成本低,使用于大多數(shù)TCP/IP應(yīng)用。
3.對(duì)于部署在服務(wù)器上的應(yīng)用來說不需要進(jìn)行任何的代碼修改即可實(shí)現(xiàn)不同機(jī)器上的應(yīng)用訪問。
4.服務(wù)器可以位于互聯(lián)網(wǎng)的任意位置。
5.同時(shí)許多DNS還支持基于地理位置的域名解析,即會(huì)將域名解析成距離用戶地理最近的一個(gè)服務(wù)器地址,這樣就可以加速用戶訪問,改善性能。
同時(shí),DNS域名解析也存在如下缺點(diǎn):
1.目前的DNS是多級(jí)解析的,每一級(jí)DNS都可能緩存A記錄,當(dāng)某臺(tái)服務(wù)器下線之后,即使修改了A記錄,要使其生效也需要較長的時(shí)間,這段時(shí)間,DNS任然會(huì)將域名解析到已下線的服務(wù)器上,最終導(dǎo)致用戶訪問失敗。
2.不能夠按服務(wù)器的處理能力來分配負(fù)載。DNS負(fù)載均衡采用的是簡單的輪詢算法,不能區(qū)分服務(wù)器之間的差異,不能反映服務(wù)器當(dāng)前運(yùn)行狀態(tài),所以其的負(fù)載均衡效果并不是太好。
3.可能會(huì)造成額外的網(wǎng)絡(luò)問題。為了使本DNS服務(wù)器和其他DNS服務(wù)器及時(shí)交互,保證DNS數(shù)據(jù)及時(shí)更新,使地址能隨機(jī)分配,一般都要將DNS的刷新時(shí)間設(shè)置的較小,但太小將會(huì)使DNS流量大增造成額外的網(wǎng)絡(luò)問題。
事實(shí)上,大型網(wǎng)站總是部分使用DNS域名解析,利用域名解析作為第一級(jí)負(fù)載均衡手段,即域名解析得到的一組服務(wù)器并不是實(shí)際提供服務(wù)的物理服務(wù)器,而是同樣提供負(fù)載均衡服務(wù)器的內(nèi)部服務(wù)器,這組內(nèi)部負(fù)載均衡服務(wù)器再進(jìn)行負(fù)載均衡,請(qǐng)請(qǐng)求發(fā)到真實(shí)的服務(wù)器上,最終完成請(qǐng)求。
(3)反向代理負(fù)載均衡
請(qǐng)求過程:
用戶發(fā)來的請(qǐng)求都首先要經(jīng)過反向代理服務(wù)器,服務(wù)器根據(jù)用戶的請(qǐng)求要么直接將結(jié)果返回給用戶,要么將請(qǐng)求交給后端服務(wù)器處理,再返回給用戶。
反向代理負(fù)載均衡
優(yōu)點(diǎn):
隱藏后端服務(wù)器。與HTTP重定向相比,反向代理能夠隱藏后端服務(wù)器,所有瀏覽器都不會(huì)與后端服務(wù)器直接交互,從而能夠確保調(diào)度者的控制權(quán),提升集群的整體性能。
故障轉(zhuǎn)移。與DNS負(fù)載均衡相比,反向代理能夠更快速地移除故障結(jié)點(diǎn)。當(dāng)監(jiān)控程序發(fā)現(xiàn)某一后端服務(wù)器出現(xiàn)故障時(shí),能夠及時(shí)通知反向代理服務(wù)器,并立即將其刪除。
合理分配任務(wù) 。HTTP重定向和DNS負(fù)載均衡都無法實(shí)現(xiàn)真正意義上的負(fù)載均衡,也就是調(diào)度服務(wù)器無法根據(jù)后端服務(wù)器的實(shí)際負(fù)載情況分配任務(wù)。但反向代理服務(wù)器支持手動(dòng)設(shè)定每臺(tái)后端服務(wù)器的權(quán)重。我們可以根據(jù)服務(wù)器的配置設(shè)置不同的權(quán)重,權(quán)重的不同會(huì)導(dǎo)致被調(diào)度者選中的概率的不同。
缺點(diǎn):
調(diào)度者壓力過大 。由于所有的請(qǐng)求都先由反向代理服務(wù)器處理,那么當(dāng)請(qǐng)求量超過調(diào)度服務(wù)器的最大負(fù)載時(shí),調(diào)度服務(wù)器的吞吐率降低會(huì)直接降低集群的整體性能。
制約擴(kuò)展。當(dāng)后端服務(wù)器也無法滿足巨大的吞吐量時(shí),就需要增加后端服務(wù)器的數(shù)量,可沒辦法無限量地增加,因?yàn)闀?huì)受到調(diào)度服務(wù)器的最大吞吐量的制約。
三、Ribbon簡介
Spring Cloud Ribbon是一個(gè)基于HTTP和TCP的客戶端負(fù)載均衡工具,它基于Netflix Ribbon實(shí)現(xiàn)。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用。Spring Cloud Ribbon雖然只是一個(gè)工具類框架,它不像服務(wù)注冊(cè)中心、配置中心、API網(wǎng)關(guān)那樣需要獨(dú)立部署,但是它幾乎存在于每一個(gè)Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中。因?yàn)槲⒎?wù)間的調(diào)用,API網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)等內(nèi)容,實(shí)際上都是通過Ribbon來實(shí)現(xiàn)的,包括Feign,它也是基于Ribbon實(shí)現(xiàn)的工具。所以,對(duì)Spring Cloud Ribbon的理解和使用,對(duì)于我們使用Spring Cloud來構(gòu)建微服務(wù)非常重要。
Ribbon是Netflix發(fā)布的負(fù)載均衡器,它有助于控制HTTP和TCP的客戶端的行為。為Ribbon配置服務(wù)提供者地址后,Ribbon就可基于某種負(fù)載均衡算法,自動(dòng)地幫助服務(wù)消費(fèi)者去請(qǐng)求。Ribbon默認(rèn)為我們提供了很多負(fù)載均衡算法,例如輪詢、隨機(jī)等。當(dāng)然,我們也可為Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法。
四、Ribbon的應(yīng)用
package com.itmuch.cloud.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient @SpringBootApplication public class ConsumerMovieApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerMovieApplication.class, args); } }
剩下的在controller中使用restTemplate中使用即可。
五、Ribbon和Feign的區(qū)別
(1)啟動(dòng)類使用的注解不同,Ribbon用的是@RibbonClient,F(xiàn)eign用的是@EnableFeignClients。
(2)服務(wù)的指定位置不同,Ribbon是在@RibbonClient注解上聲明,F(xiàn)eign則是在定義抽象方法的接口中使用@FeignClient聲明。
(3)調(diào)用方式不同,Ribbon需要自己構(gòu)建http請(qǐng)求,模擬http請(qǐng)求然后使用RestTemplate發(fā)送給其他服務(wù),步驟相當(dāng)繁瑣。Feign則是在Ribbon的基礎(chǔ)上進(jìn)行了一次改進(jìn),采用接口的方式,將需要調(diào)用的其他服務(wù)的方法定義成抽象方法即可,不需要自己構(gòu)建http請(qǐng)求。不過要注意的是抽象方法的注解、方法簽名要和提供服務(wù)的方法完全一致。
到此這篇關(guān)于淺談SpringCloud之Ribbon的文章就介紹到這了,更多相關(guān)SpringCloud之Ribbon內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談Spring Cloud Netflix-Ribbon灰度方案之Zuul網(wǎng)關(guān)灰度
- springcloud中Ribbon和RestTemplate實(shí)現(xiàn)服務(wù)調(diào)用與負(fù)載均衡
- SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn)
- SpringCloud Netflix Ribbon源碼解析(推薦)
- 深入學(xué)習(xí)Spring Cloud-Ribbon
- Spring Cloud Ribbon配置詳解
- SpringCloud手寫Ribbon實(shí)現(xiàn)負(fù)載均衡
- SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法
- Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn)
- 詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑
- SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn)
- Spring Cloud調(diào)用Ribbon的步驟
相關(guān)文章
SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細(xì)過程
SpringDoc OpenAPI 是一個(gè)強(qiáng)大的工具,能夠幫助我們輕松生成 OpenAPI 3.0 規(guī)范的文檔,并提供交互式的 Swagger UI 界面,所以本文給大家介紹了SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細(xì)過程,需要的朋友可以參考下2024-07-07Spring Data Redis對(duì)象緩存序列化問題解決
相信在項(xiàng)目中,你一定是經(jīng)常使用Redis,在使用時(shí),有沒有遇到同我一樣,對(duì)象緩存序列化問題的呢,本文主要介紹了Spring Data Redis對(duì)象緩存序列化問題解決,感興趣的可以了解一下2024-01-01Java實(shí)現(xiàn)快速排序算法可視化的示例代碼
快速排序算法通過多次比較和交換來實(shí)現(xiàn)排序,是對(duì)冒泡排序算法的一種改進(jìn)。本文將用Java語言實(shí)現(xiàn)快速排序算法并進(jìn)行可視化,感興趣的可以了解一下2022-08-08Java正則表達(dá)式如何匹配特定html標(biāo)簽內(nèi)的內(nèi)容
這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式如何匹配特定html標(biāo)簽內(nèi)的內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java 異常java.lang.NoSuchFieldException解決方案
這篇文章主要介紹了Java 異常java.lang.NoSuchFieldException解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10SpringBoot實(shí)現(xiàn)對(duì)Http接口進(jìn)行監(jiān)控的代碼
Spring Boot Actuator是Spring Boot提供的一個(gè)模塊,用于監(jiān)控和管理Spring Boot應(yīng)用程序的運(yùn)行時(shí)信息,本文將介紹一下Spring Boot Actuator以及代碼示例,以及如何進(jìn)行接口請(qǐng)求監(jiān)控,需要的朋友可以參考下2024-07-07Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06詳解Java8與Runtime.getRuntime().availableProcessors()
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06