SpringCloud06:Hystrix斷路器

本系列對(duì)應(yīng)的是尚硅谷周陽(yáng)Spring Cloud的思維導(dǎo)圖整理的筆記澎办,用來方便自己后面的知識(shí)點(diǎn)回顧嘲碱。分別以每個(gè)知識(shí)點(diǎn)作為一篇文章詳細(xì)講述。

知識(shí)點(diǎn)傳送門:
項(xiàng)目源碼

一局蚀、概述

1.分布式系統(tǒng)面臨的問題

分布式系統(tǒng)面臨的問題
復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有數(shù)十個(gè)依賴關(guān)系麦锯,每個(gè)依賴關(guān)系在某些時(shí)候?qū)⒉豢杀苊獾厥 ?/strong>

服務(wù)雪崩
多個(gè)微服務(wù)之間調(diào)用的時(shí)候,假設(shè)微服務(wù)A調(diào)用微服務(wù)B和微服務(wù)C琅绅,微服務(wù)B和微服務(wù)C又調(diào)用其它的微服務(wù)扶欣,這就是所謂的“扇出”。如果扇出的鏈路上某個(gè)微服務(wù)的調(diào)用響應(yīng)時(shí)間過長(zhǎng)或者不可用千扶,對(duì)微服務(wù)A的調(diào)用就會(huì)占用越來越多的系統(tǒng)資源料祠,進(jìn)而引起系統(tǒng)崩潰,所謂的“雪崩效應(yīng)”.

對(duì)于高流量的應(yīng)用來說澎羞,單一的后端依賴可能會(huì)導(dǎo)致所有服務(wù)器上的所有資源都在幾秒鐘內(nèi)飽和髓绽。比失敗更糟糕的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加妆绞,備份隊(duì)列顺呕,線程和其他系統(tǒng)資源緊張,導(dǎo)致整個(gè)系統(tǒng)發(fā)生更多的級(jí)聯(lián)故障摆碉。這些都表示需要對(duì)故障和延遲進(jìn)行隔離和管理塘匣,以便單個(gè)依賴關(guān)系的失敗,不能取消整個(gè)應(yīng)用程序或系統(tǒng)巷帝。

2.Hystirx是什么

Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲容錯(cuò)的開源庫(kù),在分布式系統(tǒng)里扫夜,許多依賴不可避免的會(huì)調(diào)用失敗楞泼,比如超時(shí)、異常等笤闯,Hystrix能夠保證在一個(gè)依賴出問題的情況下堕阔,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障颗味,以提高分布式系統(tǒng)的彈性超陆。

“斷路器”本身是一種開關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后浦马,通過斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲)时呀,向調(diào)用方返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack)晶默,而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無法處理的異常谨娜,這樣就保證了服務(wù)調(diào)用方的線程不會(huì)被長(zhǎng)時(shí)間、不必要地占用磺陡,從而避免了故障在分布式系統(tǒng)中的蔓延趴梢,乃至雪崩漠畜。

3.Hystrix能干嘛

  • 服務(wù)降級(jí)
  • 服務(wù)熔斷
  • 服務(wù)限流
  • 接近實(shí)時(shí)的監(jiān)控。坞靶。憔狞。

官網(wǎng)介紹

二、服務(wù)熔斷

1.是什么

熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制彰阴。
當(dāng)扇出鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí)躯喇,會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用硝枉,快速返回"錯(cuò)誤"的響應(yīng)信息廉丽。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路。在SpringCloud框架里熔斷機(jī)制通過Hystrix實(shí)現(xiàn)妻味。Hystrix會(huì)監(jiān)控微服務(wù)間調(diào)用的狀況正压,當(dāng)失敗的調(diào)用到一定閾值,缺省是5秒內(nèi)20次調(diào)用失敗就會(huì)啟動(dòng)熔斷機(jī)制责球。熔斷機(jī)制的注解是@HystrixCommand焦履。

2.參考microservicecloud-provider-dept-8001,新建microservicecloud-provider-dept-hystrix-8001

3.修改POM文件

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

4.YML文件

server:
  port: 8001
  
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml  #mybatis所在路徑
  type-aliases-package: com.atguigu.springcloud.entities #entity別名類
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml #mapper映射文件
    
spring:
   application:
    name: microservicecloud-dept 
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloudDB01
    username: root
    password: 123456
    dbcp2:
      min-idle: 5
      initial-size: 5
      max-total: 5
      max-wait-millis: 200
      
eureka:
  client: #客戶端注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001-hystrix   #自定義服務(wù)名稱信息
    prefer-ip-address: true     #訪問路徑可以顯示IP地址
      
info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

5.修改DeptController

@HystrixCommand報(bào)異常后如何處理
一旦調(diào)用服務(wù)方法失敗并拋出了錯(cuò)誤信息后雏逾,會(huì)自動(dòng)調(diào)用@HystrixCommand標(biāo)注好的fallbackMethod調(diào)用類中的指定方法

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;


@RestController
public class DeptController
{
  @Autowired
  private DeptService service = null;
  
  @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
  public Dept get(@PathVariable("id") Long id)
  {
   Dept dept =  this.service.get(id);
   if(null == dept)
   {
     throw new RuntimeException("該ID:"+id+"沒有沒有對(duì)應(yīng)的信息");
   }
   return dept;
  }
  
  public Dept processHystrix_Get(@PathVariable("id") Long id)
  {
   return new Dept().setDeptno(id)
           .setDname("該ID:"+id+"沒有沒有對(duì)應(yīng)的信息,null--@HystrixCommand")
           .setDb_source("no this database in MySQL");
  }
}

6.修改主啟動(dòng)類DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker

package com.atguigu.springcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 
@SpringBootApplication
@EnableEurekaClient //本服務(wù)啟動(dòng)后會(huì)自動(dòng)注冊(cè)進(jìn)eureka服務(wù)中
@EnableCircuitBreaker//對(duì)hystrixR熔斷機(jī)制的支持
public class DeptProvider8001_Hystrix_App
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);
  }
}

7.測(cè)試

  1. 3個(gè)eureka先啟動(dòng)
  2. 主啟動(dòng)類DeptProvider8001_Hystrix_App
  3. Consumer啟動(dòng)microservicecloud-consumer-dept-80
  4. http://localhost/consumer/dept/get/112
    如果對(duì)應(yīng)的ID:112嘉裤,數(shù)據(jù)庫(kù)里面沒有這個(gè)記錄,我們報(bào)錯(cuò)后統(tǒng)一返回栖博。

三屑宠、服務(wù)降級(jí)

1.是什么

整體資源快不夠了,忍痛將某些服務(wù)先關(guān)掉仇让,待渡過難關(guān)典奉,再開啟回來。

服務(wù)降級(jí)處理是在客戶端實(shí)現(xiàn)完成的丧叽,與服務(wù)端沒有關(guān)系

2.修改microservicecloud-api工程卫玖,

根據(jù)已經(jīng)有的DeptClientService接口新建一個(gè)實(shí)現(xiàn)了
FallbackFactory接口的類DeptClientServiceFallbackFactory
千萬(wàn)不要忘記在類上面新增@Component注解,大坑S淮尽<偎病!

package com.atguigu.springcloud.service;
 
import java.util.List;
 
import org.springframework.stereotype.Component;
 
import com.atguigu.springcloud.entities.Dept;
 
import feign.hystrix.FallbackFactory;
 
@Component//不要忘記添加迂尝,不要忘記添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
  @Override
  public DeptClientService create(Throwable throwable)
  {
   return new DeptClientService() {
     @Override
     public Dept get(long id)
     {
       return new Dept().setDeptno(id)
               .setDname("該ID:"+id+"沒有沒有對(duì)應(yīng)的信息,Consumer客戶端提供的降級(jí)信息,此刻服務(wù)Provider已經(jīng)關(guān)閉")
               .setDb_source("no this database in MySQL");
     }
 
     @Override
     public List<Dept> list()
     {
       return null;
     }
 
     @Override
     public boolean add(Dept dept)
     {
       return false;
     }
   };
  }
}

3.修改microservicecloud-api工程脱茉,DeptClientService接口在注解@FeignClient中添加fallbackFactory屬性值

package com.atguigu.springcloud.service;
 
import java.util.List;
 
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
import com.atguigu.springcloud.entities.Dept;
 
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
  @RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)
  public Dept get(@PathVariable("id") long id);
 
  @RequestMapping(value = "/dept/list",method = RequestMethod.GET)
  public List<Dept> list();
 
  @RequestMapping(value = "/dept/add",method = RequestMethod.POST)
  public boolean add(Dept dept);
}

4.microservicecloud-api工程

mvn clean install

5.microservicecloud-consumer-dept-feign工程修改YML

server:
  port: 80
 
feign: 
  hystrix: 
    enabled: true
 
eureka:
  client:
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  

6.測(cè)試

  1. 3個(gè)eureka先啟動(dòng)
  2. 微服務(wù)microservicecloud-provider-dept-8001啟動(dòng)
  3. microservicecloud-consumer-dept-feign啟動(dòng)
  4. 正常訪問測(cè)試 http://localhost/consumer/dept/get/1
  5. 故意關(guān)閉微服務(wù)microservicecloud-provider-dept-8001
  6. 客戶端自己調(diào)用提示 http://localhost/consumer/dept/get/1
    此時(shí)服務(wù)端provider已經(jīng)down了,但是我們做了服務(wù)降級(jí)處理雹舀,讓客戶端在服務(wù)端不可用時(shí)也會(huì)獲得提示信息而不會(huì)掛起耗死服務(wù)器

四芦劣、服務(wù)監(jiān)控hystrixDashboard

1.概述

除了隔離依賴服務(wù)的調(diào)用以外,Hystrix還提供了準(zhǔn)實(shí)時(shí)的調(diào)用監(jiān)控(Hystrix Dashboard)说榆,Hystrix會(huì)持續(xù)地記錄所有通過Hystrix發(fā)起的請(qǐng)求的執(zhí)行信息虚吟,并以統(tǒng)計(jì)報(bào)表和圖形的形式展示給用戶寸认,包括每秒執(zhí)行多少請(qǐng)求多少成功,多少失敗等串慰。Netflix通過hystrix-metrics-event-stream項(xiàng)目實(shí)現(xiàn)了對(duì)以上指標(biāo)的監(jiān)控偏塞。Spring Cloud也提供了Hystrix Dashboard的整合,對(duì)監(jiān)控內(nèi)容轉(zhuǎn)化成可視化界面邦鲫。

2.新建工程microservicecloud-consumer-hystrix-dashboard

3.修改POM文件

<!-- hystrix和 hystrix-dashboard相關(guān)-->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-hystrix</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
   </dependency> 

4.修改YML文件

server:
  port: 9001

5.主啟動(dòng)類改名+新注解@EnableHystrixDashboard

package com.atguigu.springcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
 
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptConsumer_DashBoard_App.class,args);
  }
}

6.所有Provider微服務(wù)提供類(8001/8002/8003)都需要監(jiān)控依賴配置

<!-- actuator監(jiān)控信息完善 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

7.啟動(dòng)microservicecloud-consumer-hystrix-dashboard該微服務(wù)監(jiān)控消費(fèi)端

http://localhost:9001/hystrix

8.啟動(dòng)3個(gè)eureka集群

9.啟動(dòng)microservicecloud-provider-dept-hystrix-8001

http://localhost:8001/dept/get/1
http://localhost:8001/hystrix.stream

10.啟動(dòng)的相關(guān)微服務(wù)工程

11.監(jiān)控測(cè)試

1)多次刷新http://localhost:8001/dept/get/1
2)觀察監(jiān)控窗口

  1. 填寫監(jiān)控地址
  • Delay:該參數(shù)用來控制服務(wù)器上輪詢監(jiān)控信息的延遲時(shí)間灸叼,默認(rèn)為2000毫秒,可以通過配置該屬性來降低客戶端的網(wǎng)絡(luò)和CPU消耗庆捺。
  • Title:該參數(shù)對(duì)應(yīng)了頭部標(biāo)題Hystrix Stream之后的內(nèi)容古今,默認(rèn)會(huì)使用具體監(jiān)控實(shí)例的URL,可以通過配置該信息來展示更合適的標(biāo)題滔以。
  1. 查看監(jiān)控結(jié)果
    7色 1圈 1線
  • 實(shí)心圓:共有兩種含義捉腥。它通過顏色的變化代表了實(shí)例的健康程度谴垫,它的健康度從綠色<黃色<橙色<紅色遞減此迅。
    該實(shí)心圓除了顏色的變化之外,它的大小也會(huì)根據(jù)實(shí)例的請(qǐng)求流量發(fā)生變化贷盲,流量越大該實(shí)心圓就越大坏匪。所以通過該實(shí)心圓的展示拟逮,就可以在大量的實(shí)例中快速的發(fā)現(xiàn)故障實(shí)例和高壓力實(shí)例。
  • 曲線:用來記錄2分鐘內(nèi)流量的相對(duì)變化适滓,可以通過它來觀察到流量的上升和下降趨勢(shì)敦迄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粒竖,隨后出現(xiàn)的幾起案子颅崩,更是在濱河造成了極大的恐慌,老刑警劉巖蕊苗,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沿彭,居然都是意外死亡朽砰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門喉刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧柔,“玉大人,你說我怎么就攤上這事睦裳≡旃” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵廉邑,是天一觀的道長(zhǎng)哥蔚。 經(jīng)常有香客問我倒谷,道長(zhǎng),這世上最難降的妖魔是什么糙箍? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任渤愁,我火速辦了婚禮,結(jié)果婚禮上深夯,老公的妹妹穿的比我還像新娘抖格。我一直安慰自己,他們只是感情好咕晋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布雹拄。 她就那樣靜靜地躺著,像睡著了一般掌呜。 火紅的嫁衣襯著肌膚如雪滓玖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天站辉,我揣著相機(jī)與錄音呢撞,去河邊找鬼。 笑死饰剥,一個(gè)胖子當(dāng)著我的面吹牛殊霞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汰蓉,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绷蹲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了顾孽?” 一聲冷哼從身側(cè)響起祝钢,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎若厚,沒想到半個(gè)月后拦英,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡测秸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年疤估,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎冯。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铃拇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沈撞,到底是詐尸還是另有隱情慷荔,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布缠俺,位于F島的核電站显晶,受9級(jí)特大地震影響贷岸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧碾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一凰盔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倦春,春花似錦户敬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呢堰,卻和暖如春抄瑟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枉疼。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工皮假, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骂维。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓惹资,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親航闺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褪测,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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