Ribbon使用入門

Ribbon是SpringCloud體系中用來實(shí)現(xiàn)負(fù)載均衡的組件仁热,通常來說榜揖,它不是一個獨(dú)立的組件,而是存在于各個微服務(wù)上的抗蠢。

負(fù)載均衡一般分為兩種:

  • 服務(wù)器端負(fù)載均衡,比如Nginx迅矛,是一臺獨(dú)立的服務(wù)器作為應(yīng)用服務(wù)的前置妨猩,反向代理實(shí)現(xiàn)服務(wù)集群的負(fù)載均衡。
  • 客戶端負(fù)載均衡秽褒,比如Ribbon壶硅,是進(jìn)程級別的威兜,存在于各個Consumer微服務(wù)上的負(fù)載均衡機(jī)制。

一庐椒、項目準(zhǔn)備

本文是在如下這篇Eureka入門案例的基礎(chǔ)上擴(kuò)展實(shí)現(xiàn)的椒舵,所以,要先按照如下的文章先搭建好Eureka的服務(wù)端和客戶端约谈。

《Eureka注冊中心入門》

有了上述案例的代碼后笔宿,我們從start.spring.io上一鍵下載一個自帶Eureka-clientRibbon的工程,命名為ribbon-demo棱诱,并做如下內(nèi)容的修改措伐。

1.1 啟動類

@SpringBootApplication
@EnableEurekaClient
public class RibbonDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonDemoApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  • Ribbon客戶端本身作為一個Eureka客戶端存在,因此需要@EnableEurekaClient注解军俊,并且向注冊中心注冊服務(wù)侥加;
  • @Bean@LoadBalanced注解是注入一個RestTemplate實(shí)例,并標(biāo)明是負(fù)載均衡使用的粪躬;

1.2 配置文件

作為一個Eureka客戶端担败,我們?nèi)匀恍枰缦碌呐渲眯畔ⅲ员WC注冊服務(wù)到注冊中心服務(wù)器上镰官。

server.port=8090

# 當(dāng)前應(yīng)用名稱
spring.application.name=ribbon-client
# eureka注冊中心地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

1.3 創(chuàng)建一個Rest請求類

我們打算對外暴露一個接口提前,接收來自瀏覽器的請求,然后將這些請求以負(fù)載均衡的方式發(fā)送給真正的服務(wù)端泳唠。

@RestController
public class RibbonTestController {
    private static String EUREKA_URL = "http://eureka-client/getHello";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getRibbonHello")
    public String getRibbonHello(HttpServletRequest request){
        String result = restTemplate.getForObject(EUREKA_URL, String.class);
        System.out.println(result);
        return result;
    }

}

如此狈网,我們就準(zhǔn)備好了一個最簡單的Ribbon案例。

二笨腥、入門實(shí)例

現(xiàn)在我們有了如下這些服務(wù):

  • Eureka服務(wù)端拓哺,在8761端口提供服務(wù);

  • Eureka客戶端A脖母,在8088端口提供服務(wù)士鸥;

    對其中的Rest請求案例稍作修改:

    @RestController
    public class RibbonTestController {
        @GetMapping("/getHello")
        public String getRibbonHello(HttpServletRequest request){
            return "From port:" + request.getServerPort();
        }
    }
    
  • Eureka客戶端B,在8089端口提供服務(wù)谆级,除了啟動端口外其余內(nèi)容和客戶端A一樣烤礁;

  • Ribbon客戶端,在8090端口提供服務(wù)肥照;

現(xiàn)在脚仔,我們按照如上順序啟動所有的服務(wù),訪問注冊中心控制臺舆绎,就能看到這些服務(wù)鲤脏。

啟動ribbon客戶端后的eureka控制臺

我們開始多次請求Ribbon客戶端的接口http://localhost:8090/getRibbonHello,就會發(fā)現(xiàn)亿蒸,Ribbon客戶端是在默認(rèn)采用輪詢的方式對所有名稱為eureka-client的服務(wù)發(fā)起請求并返回接口給瀏覽器凑兰。

Ribbon客戶端打印內(nèi)容

三掌桩、Ribbon配置

3.1 負(fù)載均衡策略

  • 輪詢RoundRobinRule,這也是默認(rèn)的策略姑食;
  • 隨機(jī)RandomRule
  • 響應(yīng)時間權(quán)重ResponseTimeWeightedRule波岛,為每個服務(wù)設(shè)置權(quán)重,響應(yīng)時間越短音半,權(quán)重越大则拷,下次越有可能被選中;
  • 最少并發(fā)數(shù)策略BestAvailableRule
  • 重試策略RetryRule
  • 可用性敏感策略AvailabilityFilteringRule
  • 區(qū)域性敏感策略ZoneAvoidanceRule

總共有七種負(fù)載均衡策略可供選擇曹鸠,可以根據(jù)自己的業(yè)務(wù)場景進(jìn)行選擇煌茬。

默認(rèn)情況下,系統(tǒng)采用的是輪詢策略彻桃,那么如何通過配置來更換負(fù)載均衡策略呢坛善?

方法一、增加一個配置類

@Configuration
public class RibbonBalancedStrategyConfig {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }

}

該配置類對全局Ribbon生效邻眷,當(dāng)我們再次重啟Ribbon客戶端的時候眠屎,多次訪問http://localhost:8090/getRibbonHello就會得到如下的隨機(jī)結(jié)果。

Ribbon負(fù)載均衡采用隨機(jī)策略效果

方法二肆饶、使用配置文件

有時候改衩,我們Ribbon可能會負(fù)載均衡多個服務(wù)源,對于某個服務(wù)源我們想更改負(fù)載均衡策略驯镊,而不是全部葫督,那么就可以在配置文件中進(jìn)行配置。

# 指定eureka-client服務(wù)源的負(fù)載均衡策略
eureka-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

同樣的板惑,我們多次訪問得到的也是隨機(jī)負(fù)載的策略效果橄镜。

3.2 超時與重試

同樣的,在配置文件中進(jìn)行配置即可洒放。

eureka-client.ribbon.ConnectTimeout=1
eureka-client.ribbon.ReadTimeout=1
eureka-client.ribbon.MaxAutoRetries=1
eureka-client.ribbon.MaxAutoRetriesNextServer=1
eureka-client.ribbon.OkToRetryOnAllOperations=true

3.3 饑餓加載

我們的ribbon-client客戶端在啟動的時候并不會立即加載上下文蛉鹿,需要在請求真正到來時才會創(chuàng)建滨砍,如此會有可能導(dǎo)致第一次調(diào)用某個服務(wù)源的時候出現(xiàn)很慢的情況往湿,我們可以通過如下配置項的方式來指定具體的服務(wù)名稱開啟饑餓加載,即在啟動的時候就加載所有服務(wù)應(yīng)用上下文惋戏。

ribbon.eager-load.enabled=true
ribbon.eager-load.clients=eureka-client,eureka-client2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末领追,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子响逢,更是在濱河造成了極大的恐慌绒窑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舔亭,死亡現(xiàn)場離奇詭異些膨,居然都是意外死亡蟀俊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門订雾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肢预,“玉大人,你說我怎么就攤上這事洼哎√逃常” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵噩峦,是天一觀的道長锭沟。 經(jīng)常有香客問我,道長识补,這世上最難降的妖魔是什么族淮? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凭涂,結(jié)果婚禮上瞧筛,老公的妹妹穿的比我還像新娘。我一直安慰自己导盅,他們只是感情好较幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著白翻,像睡著了一般乍炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滤馍,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天岛琼,我揣著相機(jī)與錄音,去河邊找鬼巢株。 笑死槐瑞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阁苞。 我是一名探鬼主播困檩,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼那槽!你這毒婦竟也來了悼沿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骚灸,失蹤者是張志新(化名)和其女友劉穎糟趾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡义郑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年蝶柿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片非驮。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡只锭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出院尔,到底是詐尸還是另有隱情蜻展,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布邀摆,位于F島的核電站纵顾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏栋盹。R本人自食惡果不足惜施逾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望例获。 院中可真熱鬧汉额,春花似錦、人聲如沸榨汤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽收壕。三九已至妓灌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜜宪,已是汗流浹背虫埂。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圃验,地道東北人掉伏。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像澳窑,于是被迫代替她去往敵國和親斧散。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容