SpringCloud 基礎(chǔ)教程(六)-負載均衡Ribbon

?我的博客:蘭陵笑笑生,歡迎瀏覽博客垄琐!

?上一章 SpringCloud基礎(chǔ)教程(五)-配置中心熱生效和高可用當中,我們對配置中心進行進行了深入的了解横媚,本章將繼續(xù)微服務(wù)架構(gòu)的深入學(xué)習(xí)自脯,了解在微服務(wù)中是如何做到負載均衡的。

前言

?簡單來講敞葛,Ribbon是Netflix發(fā)布的開源項目前鹅,主要的功能是提供客戶端的軟件負載均衡算法。它可以在客戶端配置服務(wù)端類別碌识,然后輪詢請求以實現(xiàn)負載均衡碾篡。

?當項目引入Eureka依賴后,會自動的引入ribbon的依賴丸冕,當然我們可以顯示的引入ribbon依賴耽梅。在集成Eureka時,DiscoveryEnabledNIWSServerList重寫了Ribbon的服務(wù)列表胖烛,在com.netflix.ribbon:ribbon-eureka:2.3.0模塊我們可以看到眼姐,同時使用 NIWSDiscoveryPing取代IPing:

file

一、Ribbo快速使用

?當前的實例我們會涉及到Eureka注冊中心佩番,兩個服務(wù)提供者(server-provider),一個服務(wù)消費者(server-consumer),首先众旗,我們啟動兩個服務(wù)提供者,并注冊到Eureka趟畏,服務(wù)提供接口如下:

@RestController
public class RibbonController {

    @RequestMapping("/sayHello")
    public String sayHello(String name) {
        return "hello!,"+name;
    }
}

?接下來贡歧,對之前文章的Eureka客戶端,即服務(wù)消費者進行相關(guān)改造赋秀,首先引入ribbon依賴(其實在引入eureka-client時就已經(jīng)默認引入了Ribbon):

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

?并對服務(wù)消費者代碼進行改造利朵,將DiscoveryClient改為LoadBalancerClient,顧名思義猎莲,改成支持負載均衡的客戶端绍弟,同時在消費者的主類上添加@EnableDiscoveryClient注解,開啟發(fā)現(xiàn)服務(wù)功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class RibbonController {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    private LoadBalancerClient client;

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/sayHello")
    public String sayHello(String name) {
        ServiceInstance instance = client.choose("server-provider");
        String res =  restTemplate.
            getForObject(instance.getUri().toString() 
                         + "sayHello?name=" + name, String.class);
        return res + " from :" + instance.getPort();
    }
}

?先后啟動Eureka注冊中心著洼,啟動兩個服務(wù)提供者和一個服務(wù)消費者樟遣,在Eureka的監(jiān)控頁面我們可以看到如下的內(nèi)容:

file

接下來用瀏覽器請求服務(wù)調(diào)用者的接口得到的結(jié)果是:

 hello!,test from :9001 

 hello!,test from :9002

?響應(yīng)為9001和9002交替的出現(xiàn)而叼,這表明Ribbon客戶端正在用輪詢的方式實現(xiàn)了負載均衡。

?當然我們還可以使用一種更為簡單的方法豹悬,修改客戶端的調(diào)用代碼葵陵,給RestTemplate添加 @LoadBalanced注解,通過restTemplate直接使用URL :http://server-provider/sayHello?name=test的方式調(diào)用瞻佛,這里的server-provider是服務(wù)提供者的注冊在Eureka的服務(wù)名稱脱篙, @LoadBalanced的默認算法是輪詢:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class RibbonController {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/sayHello")
    public String sayHello(String name) {
        String res = restTemplate
            .getForObject("http://server-provider/sayHello?name=" + name, String.class);
        return res;
    }

?通過這樣簡潔的方式同樣可以實現(xiàn)負載均衡的調(diào)用。

二 伤柄、Ribbon進階配置

?上文簡單的展示了Ribbon的基本功能涡尘,但是Ribbon還可以有更多自定義的配置,比如我們想修改默認的負載均衡算法响迂、自定義HTTP線程池等,我們該如何實現(xiàn)呢细疚?

2.1 Ribbon的核心組件

?在ribbon-loadbalancer項目中蔗彤,定義和很多的接口,其中就有

  • IRule:輪詢的策略的接口疯兼。

  • ServerList:定義用于獲取服務(wù)器列表的額方法的接口然遏。

  • IPing:定義了以什么方式去檢查服務(wù)之間是否通訊良好的接口。

  • file

2.2 實現(xiàn)自定義算法

?Spring Cloud提供了為Ribbon的默認實現(xiàn)吧彪,當然我們也可以自定義的去修改輪詢策略等配置待侵,首選我們在客戶端你的啟動類上添加@RibbonClient注解,

import com.microservice.RibbonConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "server-provider",configuration = RibbonConfig.class)
public class ServerConsumerApplication {

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

?@RibbonClient(name = "server-provider",= RibbonConfig.class)

  • name:是服務(wù)提供者注冊在Eureka的名稱姨裸;
  • configuration :是我們即將自定義的配置類秧倾;

接下來,我們新建RibbonConfig配置類傀缩,

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置Ribbon
 */
@Configuration
public class RibbonConfig {

    /**
     * 使用隨機的輪詢方法
     *
     * @return
     */
    @Bean
    public IRule iRule() {
        return new RandomRule();
    }

}

?注意:確保RibbonConfig所在的包不能被@ComponentScan掃描到那先,如果主類使用@SpringBootApplication,也需要避免會被自動掃描赡艰,具體的配置如下:

file

?服務(wù)調(diào)用的代碼不變化:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class RibbonController {


    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;


    @GetMapping("/sayHello")
    public String sayHello(String name) {
        String res = restTemplate.getForObject("http://server-provider/sayHello?name=" + name, String.class);
        return res;
    }

?我們使用瀏覽器調(diào)用接口 http://192.168.1.103:5168/sayHello?name=test售淡,返回的結(jié)果是以隨機的方式返回的;

2.3 @RibbonClient注解

?我們通過指定@RibbonClient中configuration的配置可以修改默認的實現(xiàn)慷垮,針對IRule的實現(xiàn)揖闸,SpringCloud有以下的實現(xiàn):

  • RoundRobinRule:輪詢,默認的每一次的請求都是輪流分配給服務(wù)提供者料身;

  • AvailabilityFilteringRule:更具可用性進行過濾的策略汤纸。默認情況下,如果RestClient最后三次連接失敗惯驼,則實例會電路跳閘蹲嚣,一旦實例跳閘递瑰,它將保持這個狀態(tài)30s,之后會被再次啟用隙畜;如果在連續(xù)連接失敗抖部,則再會變成電路跳閘,等待的時間會指數(shù)級增長议惰;

  • WeightedResponseTimeRule:每個服務(wù)器根據(jù)響應(yīng)的時間給予權(quán)重慎颗,響應(yīng)時間越長,權(quán)重越少言询;

  • RandomRule:隨機策略

?當然還有其他的權(quán)重策略俯萎,有興趣的同學(xué)可以自行的研究源代碼。

?Spring Cloud提供了@RibbonClients這樣的一個注解运杭,我們的客戶端不可能只會調(diào)用一個提供者夫啊,這樣的注解我們可以配置多個提供者。

三辆憔、總結(jié)

?本章介紹了Ribbon組件作為一個客戶端的負載均衡器對微服務(wù)架構(gòu)方面起到了非常大的作用撇眯,我們對Ribbon有了一個深入的理解,同時我們也可以自定義一些配置虱咧,我相信微服務(wù)的學(xué)習(xí)并不是一件很難的事熊榛。

file

.以就是本期的分享,你還可以關(guān)注公眾號: 程序員笑笑生腕巡,關(guān)注更多精彩內(nèi)容玄坦!

file
file

SpringCloud基礎(chǔ)教程(一)-微服務(wù)與SpringCloud

SpringCloud基礎(chǔ)教程(二)-服務(wù)發(fā)現(xiàn) Eureka

SpringCloud基礎(chǔ)教程(三)-Eureka進階

SpringCloud 基礎(chǔ)教程(四)-配置中心入門

SpringCloud基礎(chǔ)教程(五)-配置中心熱生效和高可用

SpringCloud 基礎(chǔ)教程(六)-負載均衡Ribbon

更多精彩內(nèi)容,請期待...

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布绘沉!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煎楣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子车伞,更是在濱河造成了極大的恐慌转质,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帖世,死亡現(xiàn)場離奇詭異休蟹,居然都是意外死亡,警方通過查閱死者的電腦和手機日矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門赂弓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哪轿,你說我怎么就攤上這事盈魁。” “怎么了窃诉?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵杨耙,是天一觀的道長赤套。 經(jīng)常有香客問我,道長珊膜,這世上最難降的妖魔是什么容握? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮车柠,結(jié)果婚禮上剔氏,老公的妹妹穿的比我還像新娘。我一直安慰自己竹祷,他們只是感情好谈跛,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塑陵,像睡著了一般感憾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上令花,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天吹菱,我揣著相機與錄音,去河邊找鬼彭则。 笑死,一個胖子當著我的面吹牛占遥,可吹牛的內(nèi)容都是我干的俯抖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瓦胎,長吁一口氣:“原來是場噩夢啊……” “哼芬萍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搔啊,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤柬祠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后负芋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫蛔,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年旧蛾,在試婚紗的時候發(fā)現(xiàn)自己被綠了莽龟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨天,死狀恐怖毯盈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情病袄,我是刑警寧澤搂赋,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布赘阀,位于F島的核電站,受9級特大地震影響脑奠,放射性物質(zhì)發(fā)生泄漏基公。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一捺信、第九天 我趴在偏房一處隱蔽的房頂上張望酌媒。 院中可真熱鬧,春花似錦迄靠、人聲如沸秒咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雨席。三九已至,卻和暖如春吠式,著一層夾襖步出監(jiān)牢的瞬間陡厘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工特占, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糙置,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓是目,卻偏偏與公主長得像谤饭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懊纳,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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