摘要:斷路器本身是一種開關(guān)裝置,用于在電路上保護線路過載,當線路中有電器發(fā)生短路時,斷路器能夠及時的切斷故障電路,防止發(fā)生過載發(fā)熱甚至起火等嚴重后果。具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。
轉(zhuǎn)載請注明出處 http://www.paraller.com
代碼機制:熔斷 & Fallback & 資源隔離 熔斷概念:
在微服務(wù)架構(gòu)中,我們將系統(tǒng)拆分成了一個個的服務(wù)單元,各單元間通過服務(wù)注冊與訂閱的方式互相依賴。由于每個單元都在不同的進程中運行,依賴通過遠程調(diào)用的方式執(zhí)行,這樣就有可能因為網(wǎng)絡(luò)原因或是依賴服務(wù)自身問題出現(xiàn)調(diào)用故障或延遲,而這些問題會直接導(dǎo)致調(diào)用方的對外服務(wù)也出現(xiàn)延遲,若此時調(diào)用方的請求不斷增加,最后就會出現(xiàn)因等待出現(xiàn)故障的依賴方響應(yīng)而形成任務(wù)積壓,最終導(dǎo)致自身服務(wù)的癱瘓。
舉個例子,在一個電商網(wǎng)站中,我們可能會將系統(tǒng)拆分成,用戶、訂單、庫存、積分、評論等一系列的服務(wù)單元。用戶創(chuàng)建一個訂單的時候,在調(diào)用訂單服務(wù)創(chuàng)建訂單的時候,會向庫存服務(wù)來請求出貨(判斷是否有足夠庫存來出貨)。此時若庫存服務(wù)因網(wǎng)絡(luò)原因無法被訪問到,導(dǎo)致創(chuàng)建訂單服務(wù)的線程進入等待庫存申請服務(wù)的響應(yīng),在漫長的等待之后用戶會因為請求庫存失敗而得到創(chuàng)建訂單失敗的結(jié)果。如果在高并發(fā)情況之下,因這些等待線程在等待庫存服務(wù)的響應(yīng)而未能釋放,使得后續(xù)到來的創(chuàng)建訂單請求被阻塞,最終導(dǎo)致訂單服務(wù)也不可用。
在微服務(wù)架構(gòu)中,存在著那么多的服務(wù)單元,若一個單元出現(xiàn)故障,就會因依賴關(guān)系形成故障蔓延,最終導(dǎo)致整個系統(tǒng)的癱瘓,這樣的架構(gòu)相較傳統(tǒng)架構(gòu)就更加的不穩(wěn)定。為了解決這樣的問題,因此產(chǎn)生了斷路器模式。
斷路器模式源于Martin Fowler的Circuit Breaker一文。“斷路器”本身是一種開關(guān)裝置,用于在電路上保護線路過載,當線路中有電器發(fā)生短路時,“斷路器”能夠及時的切斷故障電路,防止發(fā)生過載、發(fā)熱、甚至起火等嚴重后果。
在分布式架構(gòu)中,斷路器模式的作用也是類似的,當某個服務(wù)單元發(fā)生故障(類似用電器發(fā)生短路)之后,通過斷路器的故障監(jiān)控(類似熔斷保險絲),向調(diào)用方返回一個錯誤響應(yīng),而不是長時間的等待。這樣就不會使得線程因調(diào)用故障服務(wù)被長時間占用不釋放,避免了故障在分布式系統(tǒng)中的蔓延。
Netflix Hystrix:
在Spring Cloud中使用了Hystrix 來實現(xiàn)斷路器的功能。Hystrix是Netflix開源的微服務(wù)框架套件之一,該框架目標在于通過控制那些訪問遠程系統(tǒng)、服務(wù)和第三方庫的節(jié)點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。
Feign使用Hystrix:
我們不需要在Feigh工程中引入Hystix,F(xiàn)eign中已經(jīng)依賴了Hystrix,但是不推薦這樣做,太隱秘了 , 不好自定義,維護成本也高
application.yml:
hystrix: command: default: execution: timeout: enabled: false circuitBreaker: enabled: true requestVolumeThreshold: 3Fallback
相當于是降級操作. 對于查詢操作, 我們可以實現(xiàn)一個fallback方法, 當請求后端服務(wù)出現(xiàn)異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設(shè)置的默認值或者來自緩存.
程序的入口添加注釋
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableDiscoveryClient @EnableCircuitBreaker @EnableHystrixDashboard @RibbonClient(name = "yea-ribbon", configuration = YeaRibbonConfiguration.class) @ComponentScan(basePackages = { "cn.yeamoney.**" }) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
類調(diào)用樣例
@FeignClient(value = "ticket-service", configuration = YeaFeignConfiguration.class, fallback = TicketClientHystrix.class) interface TicketClient { @RequestMapping(method = RequestMethod.POST, value = "/create") Message資源隔離 -- 待完善。。。。create( @RequestParam(value = "Type") Integer Type, @RequestParam(value = "amount") String amount, @RequestParam(value = "userId") String userId, @RequestParam(value = "mobile") String mobile, @RequestParam(value = "status") Integer status, @RequestParam(value = "belong") Integer belong, @RequestParam(value = "useProfit")String useProfit, @RequestParam(value = "useCounter")String useCounter); } /** * @author zhidaliao * * 錯誤處理 */ @Component class TicketClientHystrix implements TicketClient { @Override public Message create(Integer Type, String amount, String userId, String mobile, Integer status, Integer belong, String useProfit, String useCounter) { // TODO 自動生成的方法存根 return null; } }
介紹
在Hystrix中, 主要通過線程池來實現(xiàn)資源隔離. 通常在使用的時候我們會根據(jù)調(diào)用的遠程服務(wù)劃分出多個線程池.
例如調(diào)用產(chǎn)品服務(wù)的Command放入A線程池, 調(diào)用賬戶服務(wù)的Command放入B線程池. 這樣做的主要優(yōu)點是運行環(huán)境被隔離開了. 這樣就算調(diào)用服務(wù)的代碼存在bug或者由于其他原因?qū)е伦约核诰€程池被耗盡時, 不會對系統(tǒng)的其他服務(wù)造成影響.
但是帶來的代價就是維護多個線程池會對系統(tǒng)帶來額外的性能開銷. 如果是對性能有嚴格要求而且確信自己調(diào)用服務(wù)的客戶端代碼不會出問題的話, 可以使用Hystrix的信號模式(Semaphores)來隔離資源.
自定義 hystrix command -- 待完善。。。
關(guān)鍵字:@HystrixCommand(ignoreExceptions = .class) 、 javanica 、 HystrixCommand 、Feign中自定義 Hystrix的groupKey commandKey threadPoolKey
看板及監(jiān)控 - Hystrix Dashboard & monitor monitor想要程序自帶監(jiān)控的功能,可以在Springboot中加上
@EnableHystrixDashboard
程序正常啟動之后
訪問http://localhost:8081/hystrix.stream 即可查看數(shù)據(jù)流
訪問 http://localhost:8081/hystrix 可以查看UI界面
1、功能比較全面的鏡像,支持turbine , 分布式監(jiān)控。 kennedyoliveira/hystrix-dashboard:kennedyoliveira/standalone-hystrix-dashboard , 可以在輸入框中輸入 Eureka的地址 http://localhost:9761/eureka/apps
2、瀏覽器地址: http://localhost:7979/hystrix-dashboard/
3、在輸入框中輸入要監(jiān)控的網(wǎng)址,例如: http://localhost:8081/hystrix.stream,即可查看情況
image
image
在復(fù)雜的分布式系統(tǒng)中,相同服務(wù)的節(jié)點經(jīng)常需要部署上百甚至上千個,很多時候,運維人員希望能夠把相同服務(wù)的節(jié)點狀態(tài)以一個整體集群的形式展現(xiàn)出來,這樣可以更好的把握整個系統(tǒng)的狀態(tài)。 為此,Netflix提供了一個開源項目(Turbine)來提供把多個hystrix.stream的內(nèi)容聚合為一個數(shù)據(jù)源供Dashboard展示。
pom.xml
org.springframework.cloud spring-cloud-netflix-turbine
application.yml
turbine: appConfig: yea-service aggregator: clusterConfig: default clusterNameExpression: new String("default")
turbine.appConfig :配置Eureka中的serviceId列表,表明監(jiān)控哪些服務(wù)
turbine.aggregator.clusterConfig :指定聚合哪些集群,多個使用”,”分割,默認為default。可使用http://.../turbine.stream?clu...{clusterConfig之一}訪問
turbine.clusterNameExpression :
clusterNameExpression指定集群名稱,默認表達式appName;此時:turbine.aggregator.clusterConfig需要配置想要監(jiān)控的應(yīng)用名稱;
當clusterNameExpression: default時,turbine.aggregator.clusterConfig可以不寫,因為默認就是default;
當clusterNameExpression: metadata[‘cluster’]時,假設(shè)想要監(jiān)控的應(yīng)用配置了eureka.instance.metadata-map.cluster: ABC,則需要配置,同時turbine.aggregator.clusterConfig: ABC
在入口程序中添加注釋
@EnableTurbine
測試
http://localhost:8001/turbine.stream
PS:在添加了 hystrix的程序里面添加turbine ,會導(dǎo)致 /hystrix.stream 鏈接無效。
建議新建一個項目,然后添加 turbine的功能,不要在微服務(wù)中添加。
當Hystrix和ribbon配合使用的時候,如果希望 Hystrix的超時時間大于ribbon配置的超時時間,你要考慮到重試次數(shù),例如 Ribbon的超時時間是一秒,重試三次,那你的 Hystrix超時時間必須大于三秒。
引入 hystrix需要的Jar包參考鏈接org.springframework.cloud spring-cloud-starter-hystrix-dashboard org.springframework.cloud spring-cloud-starter-hystrix org.springframework.boot spring-boot-starter-actuator
微服務(wù)框架Spring Cloud介紹 Part5: 在微服務(wù)系統(tǒng)中使用Hystrix, Hystrix Dashboard與Turbine
Hystrix Home - github
kennedyoliveira/standalone-hystrix-dashboard
SpringCloud使用Hystrix實現(xiàn)斷路器
How to Include Hystrix Dashboar
Configuration
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67851.html
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:我的后端書架阿里大牛,書單整合一整合一分布式生成器架構(gòu)師之路這也是本文要討論的核心問題如何高效生成趨勢有序的全局唯一。 輕松搞定 rabbitMQ rabbitMQ 的基本使用。 REST 真的完全適合微服務(wù)架構(gòu)嗎? 作者根據(jù)自己的微服務(wù)經(jīng)驗,提出 REST 并不是微服務(wù)的唯一通信機制,從而介紹了微服務(wù)的幾種通信機制,包括 REST、管道以及基于異步消息傳遞。同時,作者提出了在不同的場...
閱讀 923·2021-10-18 13:32
閱讀 3524·2021-09-30 09:47
閱讀 2164·2021-09-23 11:21
閱讀 1890·2021-09-09 09:34
閱讀 3488·2019-08-30 15:43
閱讀 1531·2019-08-30 11:07
閱讀 1070·2019-08-29 16:14
閱讀 733·2019-08-29 11:06