Spring Cloud Ribbon(服務(wù)消費者)

Spring Cloud Ribbon 是一個基于HttpTCP的客戶端負載均衡工具,基于Netflix Ribbon實現(xiàn)的盹憎。它不像服務(wù)注冊中心况褪、配置中心碎绎、API網(wǎng)關(guān)那樣獨立部署寒砖,但是它幾乎存在于每個微服務(wù)的基礎(chǔ)設(shè)施中逗宁。

Ribbon架構(gòu)圖

1258b858-c697-32e3-8f9e-b2623f7c6862.png

Ribbon負載均衡策略

6944619-0355d316f5df9b3f.png

Ribbon默認的策略是輪詢凄杯,我們可以自定義負載策略來覆蓋默認的错洁,當(dāng)然也可以通過配置指定使用哪些策略。

負載均衡概念

負載均衡技術(shù)在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上提供了一種廉價戒突、有效屯碴、透明的方法,來擴展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬膊存、增加吞吐量导而、加強網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性隔崎。它有兩方面的含義:首先今艺,大量的并發(fā)訪問或數(shù)據(jù)流量分擔(dān)到多臺節(jié)點設(shè)備上分別處理,減少用戶等待響應(yīng)的時間爵卒;其次虚缎,單個重負載的運算分擔(dān)到多臺節(jié)點設(shè)備上做并行處理,每個節(jié)點設(shè)備處理結(jié)束后钓株,將結(jié)果匯總实牡,返回給用戶陌僵,系統(tǒng)處理能力得到大幅度提高。

負載均衡是對系統(tǒng)的高可用创坞,網(wǎng)絡(luò)壓力的緩解和處理能力擴容的重要手段之一碗短。

硬件負載均衡:

主要通過在服務(wù)節(jié)點之間安裝專門的負載均衡設(shè)備,比如F5
詳細參照百度百科:https://baike.baidu.com/item/F5%E6%96%B9%E6%A1%88/1121377?fr=aladdin

軟件負載均衡

實現(xiàn)方式有兩種题涨,分別是服務(wù)端的負載均衡和客戶端的負載均衡
服務(wù)端負載均衡:在服務(wù)端安裝一些具有均衡負載功能或者模塊的軟件來完成請求的分發(fā)工作偎谁,比如Nginx

當(dāng)瀏覽器向后臺發(fā)出請求的時候纲堵,會首先向反向代理服務(wù)器發(fā)送請求巡雨,反向代理服務(wù)器會根據(jù)客戶端部署的ip:port映射表以及負載均衡策略,來決定向哪臺服務(wù)器發(fā)送請求席函,一般會使用到nginx反向代理技術(shù)鸯隅。

QQ截圖20180626191547.png

客戶端負載均衡:當(dāng)瀏覽器向后臺發(fā)出請求的時候,客戶端會向服務(wù)注冊器(例如Eureka Server)向挖,拉取注冊到服務(wù)器的可用服務(wù)信息,然后根據(jù)負載均衡策略炕舵,直接命中哪臺服務(wù)器發(fā)送請求何之。這整個過程都是在客戶端完成的,并不需要反向代理服務(wù)器的參與咽筋。

在微服務(wù)中最基本的兩個角色是服務(wù)提供者與服務(wù)消費者溶推。
服務(wù)提供者:服務(wù)的被調(diào)用方(為其他服務(wù)提供服務(wù)的服務(wù))
服務(wù)消費者:服務(wù)的調(diào)用方(依賴其他服務(wù)的服務(wù))

之前我們已經(jīng)嘗試了好幾種服務(wù)注冊方式,注冊了服務(wù)奸攻,肯定需要被調(diào)用的蒜危,也就是消費。
服務(wù)調(diào)用方式實現(xiàn)方式RestTemplate+Ribbon
使用RestTemplate消費SpringBootRestful服務(wù)

前提

需要一個服務(wù)注冊中心睹耐,兩個服務(wù)提供者和一個消費者
因為只有兩個以上的服務(wù)提供者提供相同的服務(wù)才可以體現(xiàn)出負載均衡
服務(wù)注冊中心和服務(wù)提供者都使用Spring Cloud Eureka

實現(xiàn)服務(wù)提供者的Restful接口

之前已經(jīng)實現(xiàn)過服務(wù)注冊中心和服務(wù)提供者
不過之前的服務(wù)提供者并沒有提供接口給消費者使用

@RestController
public class DiscoveryController {
    @Autowired
    private DiscoveryClient discoveryClient;
    @Value("${server.port}")
    private String ip;

    @GetMapping("/client")
    public String client() {
        String services = "調(diào)用的服務(wù)是: " + discoveryClient.getServices()+" 對應(yīng)的端口號 :"+ip;
        System.out.println("調(diào)用的服務(wù)是: " + discoveryClient.getServices()+" 對應(yīng)的端口號 :"+ip);
        return services;
    }
}

實現(xiàn)服務(wù)消費者Ribbon

一開始肯定打算是引入Spring Cloud Ribbon依賴辐赞,不過Spring Cloud Eureka依賴中已經(jīng)有
Ribbon的依賴了。單獨引入Ribbon依賴可能注冊不了服務(wù)

QQ截圖20180626163952.png

在項目的外部Jar包目錄中可以發(fā)現(xiàn)Spring Cloud Eureka依賴中已經(jīng)有Ribbon的依賴了
所以硝训,主要引入的依賴和Eureka客戶端的一樣

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在項目啟動類上添加@EnableEurekaClient注解响委,消費者和服務(wù)提供者一樣,都需要到注冊中心中注冊
并且使用@beanSpring容器中注入一個restTemplate對象窖梁,@LoadBalanced注解表明這個
restRemplate開啟負載均衡的功能赘风。

@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConsumerRibbonApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

下面來寫一個簡單的服務(wù)消費類

@RestController
public class RibbonController {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/consumer")
    public String getMsg() {

        return restTemplate.getForObject("http://springcloud-eureka-client/client", String.class);
    }
}

restTemplate可以發(fā)送GetPost纵刘,Put邀窃,Delete等請求
Get調(diào)用getForEntity()方法
Post調(diào)用postForObject()方法
Put調(diào)用put()方法
Delete調(diào)用delete()方法

getForEntity的第一個參數(shù)為我要調(diào)用的服務(wù)的地址,這里我調(diào)用了服務(wù)提供者提供的
/client接口(Eureka客戶端中已寫好)假哎,getForEntity第二個參數(shù)String.class表示我希望返回的body類型是String

注意這里是通過服務(wù)名調(diào)用而不是服務(wù)地址瞬捕,如果寫成服務(wù)地址就沒法實現(xiàn)客戶端負載均衡了鞍历。
調(diào)用spring boot服務(wù)的時候,需要將服務(wù)的URL寫死或者是寫在配置文件中,一旦ip地址發(fā)生了變化山析,都需要改動程序堰燎,并重新部署服務(wù),使用Ribbon的時候笋轨,可以有效的避免這個問題秆剪。

restTemplate的所有用法可以參考
官方說明文檔:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

在配置文件中加入相關(guān)配置

spring:
  application:
    name: eureka-consumer-ribbon
server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9090/eureka

整體項目結(jié)構(gòu)

Eureka服務(wù)端 端口號是9090
兩個Eureka客戶端 端口號分別是80818082 相同的服務(wù)名springcloud-eureka-client
Ribbon消費者客戶端 端口號是9999

啟動服務(wù)進行測試

先啟動服務(wù)端再啟動客戶端,客戶端啟動順序沒要求
訪問http://localhost:9090服務(wù)注冊中心

QQ截圖20180626171326.png

在服務(wù)注冊中心可以看到爵政,服務(wù)提供者和消費者都注冊好了

對服務(wù)提供者的Restful服務(wù)進行消費

訪問http://localhost:9999/consumer可以看到消費的服務(wù)名和端口

QQ截圖20180626171745.png

刷新下頁面
QQ截圖20180626171834.png

繼續(xù)刷新就調(diào)用另一個端口的服務(wù)了
我試著刷新了11次頁面仅讽,在控制臺可以看到調(diào)用情況
QQ截圖20180626172315.png

QQ截圖20180626172322.png

說明已經(jīng)消費了Eureka客戶端提供的服務(wù),而且Ribbon已經(jīng)默認實現(xiàn)了負載均衡

在整個程序中钾挟,最關(guān)鍵的就是在RestTemplate上標記的@LoadBalanced注解洁灵,Spring Cloud Ribbon通過注解@LoadBalanced 來實現(xiàn)負載均衡

深入了解@LoadBalanced注解可以參考:
https://blog.csdn.net/qq_26562641/article/details/53332269

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掺出,隨后出現(xiàn)的幾起案子徽千,更是在濱河造成了極大的恐慌,老刑警劉巖汤锨,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件双抽,死亡現(xiàn)場離奇詭異,居然都是意外死亡闲礼,警方通過查閱死者的電腦和手機牍汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬泽,“玉大人慎菲,你說我怎么就攤上這事∠遣ⅲ” “怎么了露该?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長第煮。 經(jīng)常有香客問我有决,道長,這世上最難降的妖魔是什么空盼? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任书幕,我火速辦了婚禮,結(jié)果婚禮上揽趾,老公的妹妹穿的比我還像新娘台汇。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布苟呐。 她就那樣靜靜地躺著痒芝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牵素。 梳的紋絲不亂的頭發(fā)上严衬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音笆呆,去河邊找鬼请琳。 笑死,一個胖子當(dāng)著我的面吹牛赠幕,可吹牛的內(nèi)容都是我干的俄精。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榕堰,長吁一口氣:“原來是場噩夢啊……” “哼竖慧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逆屡,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤圾旨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后魏蔗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碳胳,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年沫勿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味混。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡产雹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翁锡,到底是詐尸還是另有隱情蔓挖,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布馆衔,位于F島的核電站瘟判,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏角溃。R本人自食惡果不足惜拷获,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望减细。 院中可真熱鬧匆瓜,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至左冬,卻和暖如春桐筏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拇砰。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工梅忌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕匀。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓铸鹰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皂岔。 傳聞我的和親對象是個殘疾皇子蹋笼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354