SpringCloud(二)

一.服務(wù)的調(diào)用-Ribbon + RestTemplate(獨立的組件)

1.Ribbon

Ribbon是一個客戶端的負載均衡器缩歪,用來進行SpringCloud間的微服務(wù)負載均衡調(diào)用

2.服務(wù)器端的負載均衡與客戶端的負載均衡

如下圖所示:

服務(wù)器端的負載均衡
客戶端的負載均衡

負載均衡的方式:
(1)客戶端負載均衡
(2)服務(wù)端負載均衡

  • 網(wǎng)絡(luò)4層負載
  • 網(wǎng)絡(luò)7層負載 - nginx

3.Ribbon+RestTemplate的使用

(1)再創(chuàng)建一個微服務(wù)(班級服務(wù))归薛,用于后續(xù)的服務(wù)間調(diào)用
(2)在主動的調(diào)用方(學(xué)生服務(wù) -> 班級服務(wù),學(xué)生服務(wù)就是主動調(diào)用方)添加ribbon依賴

<!-- 添加ribbon依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

(3)啟動類中聲明RestTemplate組件

@Bean
@LoadBalanced//負載均衡
public RestTemplate getRest(){
    return new RestTemplate();
}

(4)編寫服務(wù)調(diào)用代碼

 //根據(jù)班級id,調(diào)用班級服務(wù)主籍,查詢班級信息
 //關(guān)鍵 調(diào)用地址 MICRO-CLASSES 必須寫一個微服務(wù)的名稱
String classInfo = restTemplate
        .getForObject("http://MICRO-CLASSES/cls/queryClsName?cid=1",String.class);

4.Ribbon的負載均衡

若微服務(wù)名稱相同习贫,那么就是集群關(guān)系

spring:
application:
 name: micro-classes
微服務(wù)名稱相同,就是集群關(guān)系

(1)Ribbon的負載均衡策略

默認是輪詢,如下是隨機負載均衡規(guī)則

/**
 * 切換負載均衡策略
 * @return
 */
@Bean
public IRule getRule(){
    return new RandomRule();
}

二.服務(wù)的調(diào)用-Feign

1.Feign

Feign底層也調(diào)用了Ribbon,F(xiàn)eign其實本質(zhì)上是Ribbon + Hystrix(豪豬)的集合體千元,因為Ribbon本身的寫法不夠面向?qū)ο笊徊芏郕ava程序員對這種寫法會很不習慣。

2.使用

(1)調(diào)用方添加feign的依賴

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

(2)編寫一個Feign接口(關(guān)鍵)

@FeignClient("MIRCO-TEACHER")
public interface ITeacherFeign {

    @RequestMapping("/tea/queryTeaName")
    String queryTeaName(@RequestParam("tid") Integer tid);
}

(3)在需要調(diào)用微服務(wù)的地方幸海,注入改接口

@Autowired
private ITeacherFeign teacherFeign;

...
//遠程調(diào)用教師服務(wù)
String s = teacherFeign.queryTeaName(cid);

(4)配置啟動類注解

@SpringBootApplication(scanBasePackages = "com.qf")
@EnableEurekaClient
//表示啟動feign蜡歹,而且這個注解需要找到Feign接口所在的包,默認去啟動類所在包下找
//所有如果Feign接口沒有在啟動類的包下涕烧,就需要手動配置掃描
@EnableFeignClients(basePackages = "com.qf.feign")
public class ClassesApplication {

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

3.Feign的超時與重試

Feign默認超時時間為1S,如果1S內(nèi)汗洒,被調(diào)用方?jīng)]有返回結(jié)果议纯,就默認失敗,然后重試1次溢谤。
有些時候瞻凤,如果不加干預(yù),可能引起請求的重復(fù)發(fā)送世杀,導(dǎo)致出現(xiàn)各種問題
注意:Feign自帶超時和重試的功能阀参,但是默認是關(guān)閉的。所以我們看到的超時和重試的效果瞻坝,是底層Ribbon提供的蛛壳。如果開啟了Feign的超時重試就會覆蓋掉Ribbon的設(shè)置
(1)設(shè)置Feign的超時和重試:

#配置ribbon的超時和重試
ribbon:
  #配置的是連接超時
  ConnectTimeout: 1000
  #配置讀超時
  ReadTimeout: 1000
  #配置ribbon的重試次數(shù),默認是0
  MaxAutoRetries: 0
  #配置ribbon的下個服務(wù)的重試次數(shù)所刀,默認是1
  MaxAutoRetriesNextServer: 0

#MaxAutoRetriesNextServer為m衙荐, 表示會重試(m + 1)個實例
#MaxAutoRetries為n,表示單實例重試(n + 1)次
#總的執(zhí)行次數(shù) (n + 1) * (m + 1)


#配置Feign的超時浮创,一旦配置了Feign的超時忧吟,ribbon的重試和超時會全部失效
feign:
  client:
    config:
      MIRCO-TEACHER: #可以針對不同的微服務(wù)配置不同的超時時間
        connectTimeout: 1000
        readTimeout: 6000
      MIRCO-STUDENT:
        connectTimeout: 1000
        readTimeout: 2000

三.Hystrix(斷路器)

1.Hystrix

(1)斷路器 - 就是微服務(wù)架構(gòu)的保險絲.
(2)在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)會拆分成一個一個的微服務(wù)斩披,服務(wù)于服務(wù)之間可以互相調(diào)用溜族。為了保證高可用性,單個服務(wù)通常會集群部署垦沉,但是由于網(wǎng)絡(luò)等原因煌抒,不能保證服務(wù)100%可用。如果單個服務(wù)出現(xiàn)問題乡话,調(diào)用這個服務(wù)的服務(wù)就有可能出現(xiàn)線程阻塞摧玫,剛好這個時候大量的請求在訪問當前服務(wù),就會導(dǎo)致當前服務(wù)的線程資源不足,從而導(dǎo)致服務(wù)癱瘓诬像,形成故障轉(zhuǎn)移屋群,導(dǎo)致"服務(wù)雪崩"

2.Hystrix是如何解決服務(wù)間調(diào)用問題的

(1)資源隔離:雞蛋不要放在一個籃子里(線程池隔離、信號量隔離)
(2)服務(wù)降級:當調(diào)用目標服務(wù)出問題(超時坏挠、報錯....)時芍躏,會自動的調(diào)用一個本地的方法,返回一個默認值
(3)請求熔斷:一旦確定目標服務(wù)出問題(失敗比例)降狠,Hystrix的熔斷器會自動打開对竣,攔截后續(xù)的所有請求,立刻判定失敗榜配,進行服務(wù)降級否纬。過了單位時間之后,熔斷器變成半開狀態(tài)蛋褥,放行一個請求临燃,如果還是失敗,繼續(xù)全開烙心,攔截請求膜廊,否則熔斷器關(guān)閉.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淫茵,隨后出現(xiàn)的幾起案子爪瓜,更是在濱河造成了極大的恐慌,老刑警劉巖匙瘪,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铆铆,死亡現(xiàn)場離奇詭異,居然都是意外死亡丹喻,警方通過查閱死者的電腦和手機算灸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驻啤,“玉大人菲驴,你說我怎么就攤上這事∑锶撸” “怎么了赊瞬?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贼涩。 經(jīng)常有香客問我巧涧,道長,這世上最難降的妖魔是什么遥倦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任谤绳,我火速辦了婚禮占锯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缩筛。我一直安慰自己消略,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布瞎抛。 她就那樣靜靜地躺著艺演,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桐臊。 梳的紋絲不亂的頭發(fā)上胎撤,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音断凶,去河邊找鬼伤提。 笑死,一個胖子當著我的面吹牛认烁,可吹牛的內(nèi)容都是我干的飘弧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼砚著,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痴昧?” 一聲冷哼從身側(cè)響起稽穆,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶撰,沒想到半個月后舌镶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡豪娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年餐胀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘤载。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡否灾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸣奔,到底是詐尸還是另有隱情墨技,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布挎狸,位于F島的核電站扣汪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锨匆。R本人自食惡果不足惜崭别,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茅主,春花似錦舞痰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至学搜,卻和暖如春娃善,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瑞佩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工聚磺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炬丸。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓瘫寝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稠炬。 傳聞我的和親對象是個殘疾皇子焕阿,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345