<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringCloud:Hystrix熔斷器

          共 6699字,需瀏覽 14分鐘

           ·

          2023-08-01 09:55

          走過(guò)路過(guò)不要錯(cuò)過(guò)

          點(diǎn)擊藍(lán)字關(guān)注我們


          前面已經(jīng)學(xué)習(xí)了服務(wù)注冊(cè)與發(fā)現(xiàn)組件,負(fù)載均衡組件,這樣我們的微服務(wù)系統(tǒng)已經(jīng)可以使用了。為了保證其高可用,單個(gè)服務(wù)通常會(huì)集群部署。由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證 100% 可用,如果單個(gè)服務(wù)出現(xiàn)問(wèn)題,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞,此時(shí)若有大量的請(qǐng)求涌入,Servlet 容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性,故障會(huì)傳播,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果,這就是服務(wù)故障的 “雪崩” 效應(yīng)。
          這就讓需要對(duì)故障和延遲進(jìn)行隔離和管理,以便單個(gè)依賴關(guān)系的失敗,不能取消整個(gè)應(yīng)用程序或系統(tǒng)。
          為了解決這個(gè)問(wèn)題,業(yè)界提出了熔斷器模型。
          Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)源庫(kù),在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等,Hystrix能夠保證在一個(gè)依賴出問(wèn)題的情況下,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障,以提高分布式系統(tǒng)的彈性。
          “斷路器”本身是一種開(kāi)關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無(wú)法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程不會(huì)被長(zhǎng)時(shí)間、不必要地占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。
          這個(gè)組件很好理解,就是為了保證服務(wù)的高可用,而對(duì)一些故障的服務(wù)進(jìn)行處理,避免整個(gè)服務(wù)都掛掉。
          一、Ribbon中使用熔斷器
          服務(wù)調(diào)用方有兩種方式Ribbon與Feign,現(xiàn)在Ribbon上使用,首先在項(xiàng)目上
          添加依賴
          <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

          在 Application 中增加 @EnableHystrix 注解
          @EnableDiscoveryClient@SpringBootApplication@EnableHystrixpublic class ConsumerDeptRibbonApplication {public static void main(String[] args) {        SpringApplication.run(ConsumerDeptRibbonApplication.class, args);    }}

          在 Service 中增加 @HystrixCommand 注解
          在需要有熔斷機(jī)制的方法上添加 @HystrixCommand,屬性fallbackMethod是熔斷時(shí)返回的方法:
          @Servicepublic class DeptService {@Autowiredprivate RestTemplate restTemplate;
          @HystrixCommand(fallbackMethod = "hiError")public String sayHi(String message) {//這里指指定了服務(wù)名稱,不用管ip 地址與端口return restTemplate.getForObject("http://SPRING-CLOUD-LEARN-PROVIDER-DEPT/hi?message=" + message, String.class); }
          public String hiError(String message) {return "Hi,your message is :\"" + message + "\" but request error."; }}

          這樣就已經(jīng)完成了開(kāi)發(fā),我們進(jìn)行相應(yīng)的測(cè)試
          啟動(dòng)spring-cloud-learn-eureka注冊(cè)中心,啟動(dòng)部門服務(wù)提供者spring-cloud-learn-provider-dept,然后啟動(dòng)spring-cloud-learn-consumer-dept-ribbon,這個(gè)時(shí)候服務(wù)正常,我們能得到正常的反饋,與之前相同,然我們停掉spring-cloud-learn-provider-dept,然后再刷新http://localhost:8764/hi?message=hello,會(huì)發(fā)現(xiàn):
          二、Feign中使用熔斷器
          Feign 是自帶熔斷器的,但默認(rèn)是關(guān)閉的。需要在配置文件中配置打開(kāi)它,在配置文件增加以下代碼:
          feign:hystrix:enabled: true

          然后我們創(chuàng)建一個(gè)與服務(wù)對(duì)應(yīng)相關(guān)的專門應(yīng)對(duì)熔斷的類:
          @Componentpublic class DeptServiceHystrix implements DeptService {
          @Overridepublic String sayHi(String message) {return "Hi,your message is :\"" + message + "\" but request error."; }}

          這個(gè)類繼承DeptService,然后實(shí)現(xiàn)對(duì)應(yīng)當(dāng)出現(xiàn)熔斷時(shí)提供的反饋服務(wù),然后在原先的服務(wù)中增加fallback指定類
          //服務(wù)提供者的名字@FeignClient(value = "spring-cloud-learn-provider-dept", fallback = DeptServiceHystrix.class)public interface DeptService {
          @RequestMapping(value = "hi", method = RequestMethod.GET) String sayHi(@RequestParam(value = "message") String message);}

          然后啟動(dòng)spring-cloud-learn-consumer-dept-feign,在部門服務(wù)掛掉之后,也能實(shí)現(xiàn)熔斷效果
          有一種創(chuàng)建工廠的方式,新建一個(gè)DeptServiceFallbackFactory:
          @Componentpublic class DeptServiceFallbackFactory implements FallbackFactory<DeptService> {@Overridepublic DeptService create(Throwable throwable) {return new DeptService() {@Overridepublic String sayHi(String message) {return "Hi,your message is :\"" + message + "\" but request error.";            }        };    }}

          三、熔斷器儀表盤監(jiān)控
          除了隔離依賴服務(wù)的調(diào)用以外,Hystrix還提供了準(zhǔn)實(shí)時(shí)的調(diào)用監(jiān)控(Hystrix Dashboard),Hystrix會(huì)持續(xù)地記錄所有通過(guò)Hystrix發(fā)起的請(qǐng)求的執(zhí)行信息,并以統(tǒng)計(jì)報(bào)表和圖形的形式展示給用戶,包括每秒執(zhí)行多少請(qǐng)求多少成功,多少失敗等。Netflix通過(guò)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)化成可視化界面。
          在 Ribbon 和 Feign 項(xiàng)目增加 Hystrix 儀表盤功能,兩個(gè)項(xiàng)目的改造方式相同:
          在 pom.xml 中增加依賴
          <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency>

          在 Application 中增加 @EnableHystrixDashboard 注解
          @SpringBootApplication@EnableDiscoveryClient@EnableFeignClients@EnableHystrixDashboardpublic class ConsumerDeptFeignApplication {public static void main(String[] args) {        SpringApplication.run(ConsumerDeptFeignApplication.class, args);    }}

          創(chuàng)建 hystrix.stream 的 Servlet 配置
          Spring Boot 2.x 版本開(kāi)啟 Hystrix Dashboard 與 Spring Boot 1.x 的方式略有不同,需要增加一個(gè) HystrixMetricsStreamServlet 的配置,代碼如下:
          @Configurationpublic class HystrixDashboardConfiguration {@Beanpublic ServletRegistrationBean getServlet() {        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);        registrationBean.setLoadOnStartup(1);        registrationBean.addUrlMappings("/hystrix.stream");        registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;    }}

          然后啟動(dòng)項(xiàng)目,打開(kāi)地址:http://localhost:8765/hystrix,這里就可以看到儀表盤啟動(dòng)成功了
          1:Delay:該參數(shù)用來(lái)控制服務(wù)器上輪詢監(jiān)控信息的延遲時(shí)間,默認(rèn)為2000毫秒,可以通過(guò)配置該屬性來(lái)降低客戶端的網(wǎng)絡(luò)和CPU消耗。
          2:Title:該參數(shù)對(duì)應(yīng)了頭部標(biāo)題Hystrix Stream之后的內(nèi)容,默認(rèn)會(huì)使用具體監(jiān)控實(shí)例的URL,可以通過(guò)配置該信息來(lái)展示更合適的標(biāo)題。
          點(diǎn)擊進(jìn)入:
          這個(gè)時(shí)候還沒(méi)有數(shù)據(jù),學(xué)習(xí)下如何看著數(shù)據(jù),我們可以刷新下之前調(diào)用服務(wù)的接口
          七色:按照結(jié)果下顯示各種顏色
          實(shí)心圓:共有兩種含義。它通過(guò)顏色的變化代表了實(shí)例的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。該實(shí)心圓除了顏色的變化之外,它的大小也會(huì)根據(jù)實(shí)例的請(qǐng)求流量發(fā)生變化,流量越大該實(shí)心圓就越大。所以通過(guò)該實(shí)心圓的展示,就可以在大量的實(shí)例中快速的發(fā)現(xiàn)故障實(shí)例和高壓力實(shí)例。
          曲線:用來(lái)記錄2分鐘內(nèi)流量的相對(duì)變化,可以通過(guò)它來(lái)觀察到流量的上升和下降趨勢(shì)。
          這個(gè)自己實(shí)踐下就比較好理解了。


          想進(jìn)大廠的小伙伴請(qǐng)注意,

          大廠面試的套路很神奇,

          早做準(zhǔn)備對(duì)大家更有好處,

          埋頭刷題效率低,

          看面經(jīng)會(huì)更有效率!

          小編準(zhǔn)備了一份大廠常問(wèn)面經(jīng)匯總集

          剩下的就不會(huì)給大家一展出來(lái)了,以上資料按照一下操作即可獲得

          ——將文章進(jìn)行轉(zhuǎn)發(fā)評(píng)論,關(guān)注公眾號(hào)【Java烤豬皮】,關(guān)注后繼續(xù)后臺(tái)回復(fù)領(lǐng)取口令“ 666 ”即可免費(fèi)領(lǐng)文章取中所提供的資料。




          往期精品推薦



          騰訊、阿里、滴滴后臺(tái)試題匯集總結(jié) — (含答案)

          面試:史上最全多線程序面試題!

          最新阿里內(nèi)推Java后端試題

          JVM難學(xué)?那是因?yàn)槟銢](méi)有真正看完整這篇文章


          結(jié)束


          關(guān)注作者微信公眾號(hào) — 《JAVA烤豬皮》


          了解了更多java后端架構(gòu)知識(shí)以及最新面試寶典



          看完本文記得給作者點(diǎn)贊+在看哦~~~大家的支持,是作者來(lái)源不斷出文的動(dòng)力~

          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国毛片免费看 | 狼友五月天成人在线视频 | 日韩免费视频每日更新婷婷久久久 | 成人豆花视频在线观看 | wwwww黄色 |