欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談SpringCloud之Ribbon詳解

 更新時間:2021年05月08日 14:34:13   作者:Firm陳  
這篇文章主要介紹了淺談SpringCloud之Ribbon,文中有非常詳細的代碼示例,對正在學習SpringCloud的小伙伴們有很大的幫助,需要的朋友可以參考下

一、什么是負載均衡

負載均衡:建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價有效透明的方法擴展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強網(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模式是有一個專門的客戶端,而B/S模式是將瀏覽器作為客戶端。當用戶在瀏覽器上輸入一個網(wǎng)址按下回車鍵后,就會產(chǎn)生一個請求,在遠方的服務(wù)器會處理這個請求,根據(jù)這個請求來生成用戶想要的頁面,然后將這個頁面響應給瀏覽器,這樣用戶就能看到他想要看到的東西。我們知道,一臺服務(wù)器處理數(shù)據(jù)(請求也是一種數(shù)據(jù))的能力是有限的,當有大量的用戶同時在瀏覽器上輸入網(wǎng)址并按下回車鍵后,就會有大量的請求產(chǎn)生,遠方的服務(wù)器就不得不處理這些請求,由于請求數(shù)量過多,服務(wù)器處理的效率就會變慢,響應時間就會變長,這樣用戶就不能在可以忍受的時間內(nèi)看到自己想看到的東西,嚴重影響體驗效果。更嚴重一點,如果請求數(shù)量超過了這臺服務(wù)器所能處理的最大請求,服務(wù)器就會崩潰,直接導致網(wǎng)站癱瘓。

那么,有什么方法能夠解決這個問題呢?答案就是建立一個集群(就是一群服務(wù)器),通過集群的力量來提高服務(wù)端的數(shù)據(jù)處理能力,因為一臺服務(wù)器的處理能力肯定比不上多臺服務(wù)器的處理能力。

這樣我們在來描述一下用戶請求頁面的過程:首先用戶在瀏覽器輸入網(wǎng)址并按下回車鍵,然后會產(chǎn)生一個請求,遠方的服務(wù)器會處理這個請求…等等,現(xiàn)在遠方有很多服務(wù)器,到底哪個服務(wù)器來處理這個請求呢,總不能所有的服務(wù)器都處理這個請求吧。哪個服務(wù)器處理這個請求?大家明白了吧,這就是負載均衡所要解決的問題。回到上邊請求頁面的過程,這個請求此時會被一臺專門的服務(wù)器來處理,這臺服務(wù)器其實就是個集群的老大,他負責把這個請求派給下面哪個小弟(服務(wù)器)來處理,處理完之后返回頁面用戶。當有多個請求同時發(fā)生時,集群的老大可以將請求派給不同的小弟,這樣處理的效率就會大幅提升,充分發(fā)揮集群的力量,至于哪個請求到底派給哪個小弟,這就是調(diào)度策略的問題了。

二、實現(xiàn)負載均衡的三種方式

(1)HTTP重定向?qū)崿F(xiàn)負載均衡

利用HTTP重定向協(xié)議實現(xiàn)負載均衡大概工作原理如下圖:

在這里插入圖片描述

HTTP重定向服務(wù)器是一臺普通的應用服務(wù)器,其唯一個功能就是根據(jù)用戶的HTTP請求計算出一臺真實的服務(wù)器地址,并將該服務(wù)器地址寫入HTTP重定向響應中(重定向響應狀態(tài)碼為302)返回給用戶瀏覽器。用戶瀏覽器在獲取到響應之后,根據(jù)返回的信息,重新發(fā)送一個請求到真實的服務(wù)器上。如上圖所示,瀏覽器訪問www.apusapp.com,DNS服務(wù)器解析到IP地址為114.100.20.200,即HTTP重定向服務(wù)器的IP地址。重定向服務(wù)器計根據(jù)某種負載均衡算法算出真實的服務(wù)器地址為114.100.20.203并返回給用戶瀏覽器,用戶瀏覽器得到返回后重新對114.100.20.203發(fā)起了請求,最后完成訪問。
這種負載均衡方案的有點是比較簡單,缺點是瀏覽器需要兩次請求服務(wù)器才能完成一次訪問,性能較差;同時,重定向服務(wù)器本身的處理能力有可能成為瓶頸,整個集群的伸縮性規(guī)模有限;使用HTTP返回碼302重定向,有可能使搜索引擎判斷為SEO作弊,降低搜索排名。因此實踐中很少使用這種負載均衡方案來部署。

(2)DNS負載均衡

DNS(Domain Name System)是因特網(wǎng)的一項服務(wù),它作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便的訪問互聯(lián)網(wǎng)。人們在通過瀏覽器訪問網(wǎng)站時只需要記住網(wǎng)站的域名即可,而不需要記住那些不太容易理解的IP地址。在DNS系統(tǒng)中有一個比較重要的的資源類型叫做主機記錄也稱為A記錄,A記錄是用于名稱解析的重要記錄,它將特定的主機名映射到對應主機的IP地址上。如果你有一個自己的域名,那么要想別人能訪問到你的網(wǎng)站,你需要到特定的DNS解析服務(wù)商的服務(wù)器上填寫A記錄,過一段時間后,別人就能通過你的域名訪問你的網(wǎng)站了。DNS除了能解析域名之外還具有負載均衡的功能,下面是利用DNS工作原理處理負載均衡的工作原理圖:

在這里插入圖片描述

由上圖可以看出,在DNS服務(wù)器中應該配置了多個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;

因此,每次域名解析請求都會根據(jù)對應的負載均衡算法計算出一個不同的IP地址并返回,這樣A記錄中配置多個服務(wù)器就可以構(gòu)成一個集群,并可以實現(xiàn)負載均衡。上圖中,用戶請求www.apusapp.com,DNS根據(jù)A記錄和負載均衡算法計算得到一個IP地址114.100.20.203,并返回給瀏覽器,瀏覽器根據(jù)該IP地址,訪問真實的物理服務(wù)器114.100.20.203。所有這些操作對用戶來說都是透明的,用戶可能只知道www.apusapp.com這個域名。

DNS域名解析負載均衡有如下優(yōu)點:

1.將負載均衡的工作交給DNS,省去了網(wǎng)站管理維護負載均衡服務(wù)器的麻煩。

2.技術(shù)實現(xiàn)比較靈活、方便,簡單易行,成本低,使用于大多數(shù)TCP/IP應用。

3.對于部署在服務(wù)器上的應用來說不需要進行任何的代碼修改即可實現(xiàn)不同機器上的應用訪問。

4.服務(wù)器可以位于互聯(lián)網(wǎng)的任意位置。

5.同時許多DNS還支持基于地理位置的域名解析,即會將域名解析成距離用戶地理最近的一個服務(wù)器地址,這樣就可以加速用戶訪問,改善性能。

同時,DNS域名解析也存在如下缺點:

1.目前的DNS是多級解析的,每一級DNS都可能緩存A記錄,當某臺服務(wù)器下線之后,即使修改了A記錄,要使其生效也需要較長的時間,這段時間,DNS任然會將域名解析到已下線的服務(wù)器上,最終導致用戶訪問失敗。

2.不能夠按服務(wù)器的處理能力來分配負載。DNS負載均衡采用的是簡單的輪詢算法,不能區(qū)分服務(wù)器之間的差異,不能反映服務(wù)器當前運行狀態(tài),所以其的負載均衡效果并不是太好。

3.可能會造成額外的網(wǎng)絡(luò)問題。為了使本DNS服務(wù)器和其他DNS服務(wù)器及時交互,保證DNS數(shù)據(jù)及時更新,使地址能隨機分配,一般都要將DNS的刷新時間設(shè)置的較小,但太小將會使DNS流量大增造成額外的網(wǎng)絡(luò)問題。
事實上,大型網(wǎng)站總是部分使用DNS域名解析,利用域名解析作為第一級負載均衡手段,即域名解析得到的一組服務(wù)器并不是實際提供服務(wù)的物理服務(wù)器,而是同樣提供負載均衡服務(wù)器的內(nèi)部服務(wù)器,這組內(nèi)部負載均衡服務(wù)器再進行負載均衡,請請求發(fā)到真實的服務(wù)器上,最終完成請求。

(3)反向代理負載均衡

請求過程:

用戶發(fā)來的請求都首先要經(jīng)過反向代理服務(wù)器,服務(wù)器根據(jù)用戶的請求要么直接將結(jié)果返回給用戶,要么將請求交給后端服務(wù)器處理,再返回給用戶。

在這里插入圖片描述

反向代理負載均衡

優(yōu)點:

隱藏后端服務(wù)器。與HTTP重定向相比,反向代理能夠隱藏后端服務(wù)器,所有瀏覽器都不會與后端服務(wù)器直接交互,從而能夠確保調(diào)度者的控制權(quán),提升集群的整體性能。

故障轉(zhuǎn)移。與DNS負載均衡相比,反向代理能夠更快速地移除故障結(jié)點。當監(jiān)控程序發(fā)現(xiàn)某一后端服務(wù)器出現(xiàn)故障時,能夠及時通知反向代理服務(wù)器,并立即將其刪除。

合理分配任務(wù) 。HTTP重定向和DNS負載均衡都無法實現(xiàn)真正意義上的負載均衡,也就是調(diào)度服務(wù)器無法根據(jù)后端服務(wù)器的實際負載情況分配任務(wù)。但反向代理服務(wù)器支持手動設(shè)定每臺后端服務(wù)器的權(quán)重。我們可以根據(jù)服務(wù)器的配置設(shè)置不同的權(quán)重,權(quán)重的不同會導致被調(diào)度者選中的概率的不同。
缺點:

調(diào)度者壓力過大 。由于所有的請求都先由反向代理服務(wù)器處理,那么當請求量超過調(diào)度服務(wù)器的最大負載時,調(diào)度服務(wù)器的吞吐率降低會直接降低集群的整體性能。

制約擴展。當后端服務(wù)器也無法滿足巨大的吞吐量時,就需要增加后端服務(wù)器的數(shù)量,可沒辦法無限量地增加,因為會受到調(diào)度服務(wù)器的最大吞吐量的制約。

三、Ribbon簡介

Spring Cloud Ribbon是一個基于HTTP和TCP的客戶端負載均衡工具,它基于Netflix Ribbon實現(xiàn)。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請求自動轉(zhuǎn)換成客戶端負載均衡的服務(wù)調(diào)用。Spring Cloud Ribbon雖然只是一個工具類框架,它不像服務(wù)注冊中心、配置中心、API網(wǎng)關(guān)那樣需要獨立部署,但是它幾乎存在于每一個Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中。因為微服務(wù)間的調(diào)用,API網(wǎng)關(guān)的請求轉(zhuǎn)發(fā)等內(nèi)容,實際上都是通過Ribbon來實現(xiàn)的,包括Feign,它也是基于Ribbon實現(xiàn)的工具。所以,對Spring Cloud Ribbon的理解和使用,對于我們使用Spring Cloud來構(gòu)建微服務(wù)非常重要。

Ribbon是Netflix發(fā)布的負載均衡器,它有助于控制HTTP和TCP的客戶端的行為。為Ribbon配置服務(wù)提供者地址后,Ribbon就可基于某種負載均衡算法,自動地幫助服務(wù)消費者去請求。Ribbon默認為我們提供了很多負載均衡算法,例如輪詢、隨機等。當然,我們也可為Ribbon實現(xiàn)自定義的負載均衡算法。

四、Ribbon的應用

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)啟動類使用的注解不同,Ribbon用的是@RibbonClient,F(xiàn)eign用的是@EnableFeignClients。

(2)服務(wù)的指定位置不同,Ribbon是在@RibbonClient注解上聲明,F(xiàn)eign則是在定義抽象方法的接口中使用@FeignClient聲明。

(3)調(diào)用方式不同,Ribbon需要自己構(gòu)建http請求,模擬http請求然后使用RestTemplate發(fā)送給其他服務(wù),步驟相當繁瑣。Feign則是在Ribbon的基礎(chǔ)上進行了一次改進,采用接口的方式,將需要調(diào)用的其他服務(wù)的方法定義成抽象方法即可,不需要自己構(gòu)建http請求。不過要注意的是抽象方法的注解、方法簽名要和提供服務(wù)的方法完全一致。

到此這篇關(guān)于淺談SpringCloud之Ribbon的文章就介紹到這了,更多相關(guān)SpringCloud之Ribbon內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在lambda中使用外部變量的一些心得分享

    在lambda中使用外部變量的一些心得分享

    這篇文章主要介紹了在lambda中使用外部變量的一些心得,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細過程

    SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細過程

    SpringDoc OpenAPI 是一個強大的工具,能夠幫助我們輕松生成 OpenAPI 3.0 規(guī)范的文檔,并提供交互式的 Swagger UI 界面,所以本文給大家介紹了SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細過程,需要的朋友可以參考下
    2024-07-07
  • Spring Data Redis對象緩存序列化問題解決

    Spring Data Redis對象緩存序列化問題解決

    相信在項目中,你一定是經(jīng)常使用Redis,在使用時,有沒有遇到同我一樣,對象緩存序列化問題的呢,本文主要介紹了Spring Data Redis對象緩存序列化問題解決,感興趣的可以了解一下
    2024-01-01
  • Java實現(xiàn)快速排序算法可視化的示例代碼

    Java實現(xiàn)快速排序算法可視化的示例代碼

    快速排序算法通過多次比較和交換來實現(xiàn)排序,是對冒泡排序算法的一種改進。本文將用Java語言實現(xiàn)快速排序算法并進行可視化,感興趣的可以了解一下
    2022-08-08
  • Java正則表達式如何匹配特定html標簽內(nèi)的內(nèi)容

    Java正則表達式如何匹配特定html標簽內(nèi)的內(nèi)容

    這篇文章主要給大家介紹了關(guān)于Java正則表達式如何匹配特定html標簽內(nèi)的內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java 異常java.lang.NoSuchFieldException解決方案

    Java 異常java.lang.NoSuchFieldException解決方案

    這篇文章主要介紹了Java 異常java.lang.NoSuchFieldException解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • logback的LevelFilter日志過濾器源碼解讀

    logback的LevelFilter日志過濾器源碼解讀

    這篇文章主要為大家介紹了logback的LevelFilter日志過濾器源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • SpringBoot實現(xiàn)對Http接口進行監(jiān)控的代碼

    SpringBoot實現(xiàn)對Http接口進行監(jiān)控的代碼

    Spring Boot Actuator是Spring Boot提供的一個模塊,用于監(jiān)控和管理Spring Boot應用程序的運行時信息,本文將介紹一下Spring Boot Actuator以及代碼示例,以及如何進行接口請求監(jiān)控,需要的朋友可以參考下
    2024-07-07
  • Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 詳解Java8與Runtime.getRuntime().availableProcessors()

    詳解Java8與Runtime.getRuntime().availableProcessors()

    這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論