SpringCloud入門(2)Ribbon

Ribbon是客戶端的負(fù)載均衡器崎页,消費者可以通過服務(wù)別名調(diào)用服務(wù)時,需要Ribbon做負(fù)載均衡來以某種機制訪問實際的服務(wù)調(diào)用地址穷躁。

簡單類比四瘫,我們?nèi)フ襎ony老師汉嗽,一般理發(fā)店都會有多個Tony老師。但是也會有一個類似前臺的工作人員為我們安排有空的Tony老師理發(fā)莲组。工作人員就是類似Ribbon诊胞,是按照順序安排呢,還是隨機安排呢锹杈。

image

Ribbon + Eureka

創(chuàng)建項目

同樣創(chuàng)建一個Ribbon的空模塊撵孤,然后在Ribbon空模塊下創(chuàng)建一個ribbon-consume9101 子模塊。在父類也就是空模塊的pom文件中加入依賴

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

當(dāng)你引入了Eureka相關(guān)的依賴的時候其實就已經(jīng)把Ribbon的依賴引入進來了竭望,所以如果使用的是Ribbon + Eureka邪码,可以不用寫上面的依賴也能運行。

image

創(chuàng)建完成后整體的項目結(jié)構(gòu)如圖所示

image

配置文件

application.yml

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

啟動和業(yè)務(wù)類

注意我們的服務(wù)的提供者是eureka-provide 服務(wù)咬清,這個服務(wù)名字可能單取provide 更準(zhǔn)確點闭专,以后項目重構(gòu)的時候可能會修改。

涉及到服務(wù)與服務(wù)之間的調(diào)用旧烧,一般會選擇使用RestTemplate 影钉,同時需要把它注入Spring容器中,所以選擇使用配置類

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced       //負(fù)載均衡需要的注解
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接下來就是主啟動類

@SpringBootApplication
@EnableEurekaClient
@RestController
public class RibbonConsume9101 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;

    public RibbonConsume9101(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/ribbon/consume")
    public String getInfo() {
        return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

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

測試

  1. 開啟Eureak注冊中心EurekaServer8001
  2. 開啟3個不同端口的服務(wù)提供者EurekaProvide7001 掘剪,EurekaProvide7002 , EurekaProvide7003
  3. 開啟剛剛建立的Ribbon消費者RibbonConsume9101

首先看下Eureka注冊中心平委,可以看到3個服務(wù)提供者夺谁,1個消費者都已經(jīng)注冊到Eureka廉赔。

image

接著消費端訪問接口http://localhost:9101/ribbon/consume,看能不能從服務(wù)提供端中獲取到服務(wù)匾鸥,可以看到確實能夠調(diào)用3個不同端口的服務(wù)提供端蜡塌,并且是按照一定順序輪流調(diào)用(輪詢,也是默認(rèn)規(guī)則)勿负。

image

自定義配置類

上述調(diào)用服務(wù)的時候明顯是輪詢的方式馏艾,那如果想要其它方式去調(diào)用呢,這時候就需要自定義配置類笆环。

Ribbon主要有6個組件

  • ServerList: 定義獲取服務(wù)器列表
  • ServerListFilter: 對ServerList列表進行二次過濾
  • ServerListUpdater: 定義服務(wù)更新策略
  • Iping: 檢查服務(wù)列表是否存活
  • IRlue: 根據(jù)算法選擇調(diào)用服務(wù)列表中的某一個服務(wù)
  • ILoadBalancer: 軟件負(fù)載均衡器入口攒至,整合以上所有的組件實現(xiàn)負(fù)載功能
@Configuration
public class RibbonCustomConfig {
    @Bean
   public IRule ribbonRule() {
       return new RandomRule();
   }
}

IRlue 接口就是以什么樣的規(guī)則調(diào)用服務(wù)提供者,可以看下該接口的實現(xiàn)類

image

怎么讓這個配置文件被Ribbon感知到呢躁劣,就需要利用@RibbonClient 注解。建立一個空的注解類库菲,加上注解和配置類就能夠自定義Ribbon配置账忘。

@Configuration
@RibbonClient(name = "eureka-provide", configuration = RibbonCustomConfig.class)
public class RibbonConfig {
}

這里的名字就是我們需要調(diào)用的服務(wù)端的配置文件中的springcloud.application.name 的值。需要注意的是,在官方文檔里面有這樣一段話

image

在這個例子中翻譯過來就是RibbonCustomConfig 如果和主啟動類在同一個包下鳖擒,就會被掃描進Spring中溉浙,這樣會導(dǎo)致配置文件會被所有的@RibbonClients 所共享。當(dāng)然也可以用@ComponentScan 把配置文件排除在外蒋荚。

重啟RibbonConsume9101 服務(wù)本姥,其它的不用動寇钉,同樣調(diào)用消費端訪問接口http://localhost:9101/ribbon/consume

image

點的時候,啥,怎么一直調(diào)用的是7001端口牲芋,難道其它服務(wù)掛掉了,可以看到后面明顯加快了點的速度蕊肥,最后還好沒有翻車薪铜,確實是改成了隨機規(guī)則。

image

自定義配置文件

除了通過配置類來自定義Ribbon外容为,還可以通過配置文件來自定義

image

這里clientName 同樣是需要調(diào)用的服務(wù)端的配置文件中的springcloud.application.name 的值乓序。 如果是完全自己寫的類呢,需要實現(xiàn)對應(yīng)的接口坎背,這里同樣采用Netflix寫好的RandomRule 類替劈。

RibbonCustomConfigRibbonConfig刪掉或者全部注釋掉都可以,修改配置文件

server:
  port: 9101

spring:
  application:
    name: ribbon-consume
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: ribbon-consume9101

#其實就是加了下面的內(nèi)容
eureka-provide:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

其中eureka-provide 就是clientName得滤。接著一樣重啟RibbonConsume9101 服務(wù)陨献,其它的不用動,同樣調(diào)用消費端訪問接口http://localhost:9101/ribbon/consume

值得注意的是耿戚,在配置文件中配置的變量是要比配置類中的優(yōu)先級要高的湿故。

image

Ribbon

上面是消費者端和服務(wù)端都注冊進了Eureka,相當(dāng)于消費者通過Eureka去找到了其它服務(wù)提供者的服務(wù)膜蛔。那在真正業(yè)務(wù)中接受了新的消費者端坛猪,并沒有注冊進Eureka,怎么解決這個問題呢皂股?

先來看看沒有注冊進去會發(fā)生什么情況墅茉,想都不用想肯定是直接報錯了

image

創(chuàng)建項目

同樣在Ribbon父模塊下面建立一個子模塊

image

配置文件

因為不用注冊進Eureka,所以配置文件也要做相應(yīng)的修改

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka

#禁用掉Eureka呜呐,其實禁用不禁用都不影響就斤,因為根本就沒導(dǎo)入
ribbon:
  eureka:
    enabled: false

啟動和業(yè)務(wù)類

同樣需要導(dǎo)入RestTemplate 所以可以直接復(fù)制上一個子模塊

@Configuration
public class ApplicationContextConfig {

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

主啟動類也可以直接復(fù)制,不需要用到Eureka蘑辑,去掉@EnableEurekaClient 注解并修改類名即可

@SpringBootApplication
@RestController
public class RibbonConsumeWithoutEureka9102 {
    final String PROVIDE_URL = "http://eureka-provide";

    RestTemplate restTemplate;
    
    public RibbonConsumeWithoutEureka9102(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/ribbon/consume")
    public String getInfo() {
        return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]";
    }

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

那怎樣消費者調(diào)用的時候怎么知道去哪找提供者的服務(wù)呢洋机,就需要動配置文件了

server:
  port: 9102

spring:
  application:
    name: ribbon-consume-without-eureka
ribbon:
  eureka:
    enabled: false

#以下為增加內(nèi)容
eureka-provide:
  ribbon:
    listOfServers: localhost:7001, localhost:7002, localhost:7003

其中eureka-provide 就是需要調(diào)用的服務(wù)端的配置文件中的springcloud.application.name 的值

開啟RibbonConsume9102 服務(wù),其它的不用動洋魂,調(diào)用消費端訪問接口http://localhost:9102/ribbon/consume 绷旗,可以看到也是能夠按照默認(rèn)輪詢的方式調(diào)用服務(wù)喜鼓。

image

創(chuàng)作不易,如果對你有幫助衔肢,歡迎點贊庄岖,收藏和分享啦!

文章持續(xù)更新角骤,可以關(guān)注微信公眾號CodeNone隅忿,基本2,3天1更技術(shù)文章0钭稹1惩!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胳赌,一起剝皮案震驚了整個濱河市牢撼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疑苫,老刑警劉巖熏版,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捍掺,居然都是意外死亡撼短,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門挺勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曲横,“玉大人,你說我怎么就攤上這事不瓶『碳担” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵蚊丐,是天一觀的道長熙参。 經(jīng)常有香客問我,道長麦备,這世上最難降的妖魔是什么孽椰? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮凛篙,結(jié)果婚禮上黍匾,老公的妹妹穿的比我還像新娘。我一直安慰自己呛梆,他們只是感情好锐涯,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著填物,像睡著了一般全庸。 火紅的嫁衣襯著肌膚如雪秀仲。 梳的紋絲不亂的頭發(fā)上融痛,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天壶笼,我揣著相機與錄音,去河邊找鬼雁刷。 笑死覆劈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沛励。 我是一名探鬼主播责语,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼目派!你這毒婦竟也來了坤候?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤企蹭,失蹤者是張志新(化名)和其女友劉穎白筹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谅摄,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡徒河,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了送漠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顽照。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闽寡,靈堂內(nèi)的尸體忽然破棺而出代兵,到底是詐尸還是另有隱情,我是刑警寧澤爷狈,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布植影,位于F島的核電站,受9級特大地震影響淆院,放射性物質(zhì)發(fā)生泄漏何乎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一土辩、第九天 我趴在偏房一處隱蔽的房頂上張望支救。 院中可真熱鬧,春花似錦拷淘、人聲如沸各墨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬堵。三九已至恃轩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黎做,已是汗流浹背叉跛。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒸殿,地道東北人筷厘。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像宏所,于是被迫代替她去往敵國和親酥艳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

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