成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringCloud之Hystrix

RancherLabs / 3180人閱讀

摘要:如果由包裝的工作不尊重,那么線程池中的線程將繼續(xù)它的工作,盡管客戶機(jī)已經(jīng)收到了。這種行為可能會(huì)使線程池飽和,盡管負(fù)載正確釋放。

簡(jiǎn)介

在分布式環(huán)境中,許多服務(wù)依賴關(guān)系中的一些必然會(huì)失敗。Hystrix是一個(gè)庫(kù),它通過(guò)添加延遲容忍和容錯(cuò)邏輯來(lái)幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過(guò)隔離服務(wù)之間的訪問(wèn)點(diǎn)、停止跨服務(wù)的級(jí)聯(lián)故障并提供回退選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn),所有這些選項(xiàng)都提高了系統(tǒng)的總體彈性。

目標(biāo)

Hystrix的設(shè)計(jì)目的如下:

為通過(guò)第三方客戶端庫(kù)訪問(wèn)的依賴項(xiàng)(通常通過(guò)網(wǎng)絡(luò))提供保護(hù)和控制延遲和故障。

停止復(fù)雜分布式系統(tǒng)中的級(jí)聯(lián)故障。

故障快速恢復(fù)。

在可能的情況下,后退并優(yōu)雅地降級(jí)。

啟用近實(shí)時(shí)監(jiān)視、警報(bào)和操作控制。

背景
為了解決什么問(wèn)題?

復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有幾十個(gè)依賴項(xiàng),每個(gè)依賴項(xiàng)在某個(gè)時(shí)候都不可避免地會(huì)失敗。如果主機(jī)應(yīng)用程序沒(méi)有從這些外部故障中隔離出來(lái),那么它就有可能與這些外部故障一起宕機(jī)。

例如,對(duì)于一個(gè)依賴于30個(gè)服務(wù)的應(yīng)用程序,其中每個(gè)服務(wù)都有99.99%的正常運(yùn)行時(shí)間,您可以這樣期望:

99.9930 = 99.7% uptime
0.3% of 1 billion requests = 3,000,000 failures
2+ hours downtime/month even if all dependencies have excellent uptime.

現(xiàn)實(shí)通常更糟。
即使當(dāng)所有依賴項(xiàng)都運(yùn)行良好時(shí),即使0.01%的停機(jī)時(shí)間對(duì)幾十個(gè)服務(wù)中的每個(gè)服務(wù)的總體影響也相當(dāng)于一個(gè)月潛在的停機(jī)時(shí)間(如果您不為恢復(fù)而設(shè)計(jì)整個(gè)系統(tǒng))。

如下面的圖演變:

當(dāng)一切正常時(shí),請(qǐng)求流可以是這樣的:

當(dāng)許多后端系統(tǒng)之一成為潛在,它可以阻止整個(gè)用戶請(qǐng)求:

對(duì)于高流量,一個(gè)后端依賴項(xiàng)成為潛在,可能會(huì)導(dǎo)致所有服務(wù)器上的所有資源在幾秒鐘內(nèi)飽和。
應(yīng)用程序中通過(guò)網(wǎng)絡(luò)或客戶機(jī)庫(kù)到達(dá)可能導(dǎo)致網(wǎng)絡(luò)請(qǐng)求的每個(gè)點(diǎn)都是潛在故障的來(lái)源。比故障更糟的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加,從而備份隊(duì)列、線程和其他系統(tǒng)資源,從而導(dǎo)致系統(tǒng)中出現(xiàn)更多級(jí)聯(lián)故障。

工作原理

工作流程圖:

1. 構(gòu)造一個(gè)HystrixCommand或HystrixObservableCommand對(duì)象

第一步是構(gòu)造一個(gè)HystrixCommand或HystrixObservableCommand對(duì)象來(lái)表示對(duì)依賴項(xiàng)的請(qǐng)求。將請(qǐng)求發(fā)出時(shí)需要的任何參數(shù)傳遞給構(gòu)造函數(shù)。
如果期望依賴項(xiàng)返回單個(gè)響應(yīng),則構(gòu)造一個(gè)HystrixCommand對(duì)象。例如:

HystrixCommand command = new HystrixCommand(arg1, arg2);

如果期望依賴項(xiàng)返回發(fā)出響應(yīng)的可觀察對(duì)象,則構(gòu)造一個(gè)HystrixObservableCommand對(duì)象。例如:

HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
2.執(zhí)行命令

有四種方法可以執(zhí)行命令,使用以下四種方法之一的Hystrix命令對(duì)象(前兩種方法只適用于簡(jiǎn)單的HystrixCommand對(duì)象,不適用于HystrixObservableCommand):

execute())?— blocks, then returns the single response received from the dependency (or throws an exception in case of an error)

queue())?— returns a?Future?with which you can obtain the single response from the dependency

observe())?— subscribes to the?Observable?that represents the response(s) from the dependency and returns an?Observable?that replicates that source?Observable

toObservable())?— returns an?Observable?that, when you subscribe to it, will execute the Hystrix command and emit its responses

3.是否緩存了響應(yīng)

如果為該命令啟用了請(qǐng)求緩存,并且在緩存中可用對(duì)請(qǐng)求的響應(yīng),則此緩存的響應(yīng)將立即以可觀察到的形式返回。

4. 電路打開(kāi)了嗎?

當(dāng)您執(zhí)行該命令時(shí),Hystrix將與斷路器一起檢查電路是否打開(kāi)。
如果電路打開(kāi)(或“跳閘”),那么Hystrix將不執(zhí)行命令,而是將流路由到(8)獲取回退。
如果電路被關(guān)閉,則流繼續(xù)到(5),檢查是否有可用的容量來(lái)運(yùn)行命令。

5.線程池/隊(duì)列/信號(hào)量是否已滿?

如果與該命令關(guān)聯(lián)的線程池和隊(duì)列(或信號(hào)量,如果不在線程中運(yùn)行)已滿,那么Hystrix將不執(zhí)行該命令,而是立即將流路由到(8)獲取回退。

6.HystrixObservableCommand.construct()或HystrixCommand.run ()

這里,Hystrix通過(guò)為此目的編寫(xiě)的方法調(diào)用對(duì)依賴項(xiàng)的請(qǐng)求,方法如下:

HystrixCommand.run())?— returns a single response or throws an exception

HystrixObservableCommand.construct())?— returns an Observable that emits the response(s) or sends an?onError?notification

如果run()或construct()方法超過(guò)了命令的超時(shí)值,線程將拋出一個(gè)TimeoutException(如果命令本身不在自己的線程中運(yùn)行,則多帶帶的計(jì)時(shí)器線程將拋出一個(gè)TimeoutException)。在這種情況下,Hystrix將響應(yīng)路由到8。獲取回退,如果最終返回值run()或construct()方法沒(méi)有取消/中斷,那么它將丟棄該方法。
請(qǐng)注意,沒(méi)有辦法強(qiáng)制潛在線程停止工作——Hystrix在JVM上能做的最好的事情就是拋出InterruptedException。如果由Hystrix包裝的工作不尊重interruptedexception,那么Hystrix線程池中的線程將繼續(xù)它的工作,盡管客戶機(jī)已經(jīng)收到了TimeoutException。這種行為可能會(huì)使Hystrix線程池飽和,盡管負(fù)載“正確釋放”。大多數(shù)Java HTTP客戶端庫(kù)不解釋interruptedexception。因此,請(qǐng)確保正確配置HTTP客戶機(jī)上的連接和讀/寫(xiě)超時(shí)。
如果該命令沒(méi)有拋出任何異常并返回一個(gè)響應(yīng),那么Hystrix將在執(zhí)行一些日志記錄和度量報(bào)告之后返回此響應(yīng)。在run()的情況下,Hystrix返回一個(gè)可觀察的對(duì)象,該對(duì)象發(fā)出單個(gè)響應(yīng),然后發(fā)出一個(gè)onCompleted通知;在construct()的情況下,Hystrix返回由construct()返回的相同的可觀察值。

7.計(jì)算電路健康

Hystrix向斷路器報(bào)告成功、失敗、拒絕和超時(shí),斷路器維護(hù)一組滾動(dòng)計(jì)數(shù)器,用于計(jì)算統(tǒng)計(jì)數(shù)據(jù)。
它使用這些統(tǒng)計(jì)數(shù)據(jù)來(lái)確定電路應(yīng)該在什么時(shí)候“跳閘”,在這一點(diǎn)上,它會(huì)短路任何后續(xù)的請(qǐng)求,直到恢復(fù)期結(jié)束,在此期間,它會(huì)在第一次檢查某些健康檢查之后再次關(guān)閉電路。

8.回退

Hystrix試圖恢復(fù)你的回滾命令執(zhí)行失敗時(shí):當(dāng)一個(gè)異常的構(gòu)造()或()運(yùn)行(6),當(dāng)命令電路短路,因?yàn)榇蜷_(kāi)(4),當(dāng)命令的線程池和隊(duì)列或信號(hào)能力(5),或者當(dāng)命令已超過(guò)其超時(shí)長(zhǎng)度。
詳情參考官網(wǎng):https://github.com/Netflix/Hy...

9. 返回成功的響應(yīng)

如果Hystrix命令成功,它將以可觀察到的形式返回響應(yīng)或響應(yīng)給調(diào)用者。根據(jù)您如何調(diào)用上面步驟2中的命令,這個(gè)可觀察對(duì)象可能在返回給您之前進(jìn)行轉(zhuǎn)換:

execute() — 以與.queue()相同的方式獲取一個(gè)Future,然后在這個(gè)Future上調(diào)用get()來(lái)獲取可觀察對(duì)象發(fā)出的單個(gè)值.

queue() — 將可觀察對(duì)象轉(zhuǎn)換為BlockingObservable,以便將其轉(zhuǎn)換為未來(lái),然后返回此未來(lái)

observe() — 立即訂閱可觀察對(duì)象,并開(kāi)始執(zhí)行命令的流;返回一個(gè)可觀察對(duì)象,當(dāng)您訂閱該對(duì)象時(shí),將重播排放和通知

toObservable() — 返回可觀察值不變;您必須訂閱它,才能真正開(kāi)始執(zhí)行命令的流程

更多原理可以移步官網(wǎng)
https://github.com/Netflix/Hy...

使用

加入依賴


            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
  
在ribbon中使用

使用@EnableHystrix開(kāi)啟

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class CloudServiceRibbonApplication {

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


    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

該注解對(duì)該方法創(chuàng)建了熔斷器的功能,并指定了fallbackMethod熔斷方法,熔斷方法直接返回了一個(gè)字符串,字符串為"hi,"+name+",sorry,error!"

@Service
public class TestService {


    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://CLOUD-EUREKA-CLIENT/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }

}
在Feign中使用

feign.hystrix.enabled: true 開(kāi)啟hystrix

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8765
spring:
  application:
    name: cloud-service-feign

feign.hystrix.enabled: true

@EnableFeignClients啟動(dòng)

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class CloudServiceFeginApplication {

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

}

fallback:配置連接失敗等錯(cuò)誤的返回類(lèi)

@FeignClient(value = "cloud-eureka-client",fallback = TestServiceHystric.class)
public interface TestService {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);

}

當(dāng)訪問(wèn)接口有問(wèn)題時(shí),直接調(diào)用此接口返回。

@Component
public class TestServiceHystric implements  TestService{
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

更多使用技巧可參考官網(wǎng):
https://github.com/Netflix/Hy...

總結(jié)

在微服務(wù)架構(gòu)中通常會(huì)有多個(gè)服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會(huì)導(dǎo)致級(jí)聯(lián)故障,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況,這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)。服務(wù)雪崩效應(yīng)是一種因“服務(wù)提供者”的不可用導(dǎo)致“服務(wù)消費(fèi)者”的不可用,并將不可用逐漸放大的過(guò)程。

熔斷器的原理很簡(jiǎn)單,如同電力過(guò)載保護(hù)器。它可以實(shí)現(xiàn)快速失敗,如果它在一段時(shí)間內(nèi)偵測(cè)到許多類(lèi)似的錯(cuò)誤,會(huì)強(qiáng)迫其以后的多個(gè)調(diào)用快速失敗,不再訪問(wèn)遠(yuǎn)程服務(wù)器,從而防止應(yīng)用程序不斷地嘗試執(zhí)行可能會(huì)失敗的操作,使得應(yīng)用程序繼續(xù)執(zhí)行而不用等待修正錯(cuò)誤,或者浪費(fèi)CPU時(shí)間去等到長(zhǎng)時(shí)間的超時(shí)產(chǎn)生。熔斷器也可以使應(yīng)用程序能夠診斷錯(cuò)誤是否已經(jīng)修正,如果已經(jīng)修正,應(yīng)用程序會(huì)再次嘗試調(diào)用操作。

更多優(yōu)質(zhì)文章:

http://www.ityouknow.com/spri...

https://www.fangzhipeng.com/s...

http://blog.didispace.com/tag...

最后

如果對(duì) Java、大數(shù)據(jù)感興趣請(qǐng)長(zhǎng)按二維碼關(guān)注一波,我會(huì)努力帶給你們價(jià)值。覺(jué)得對(duì)你哪怕有一丁點(diǎn)幫助的請(qǐng)幫忙點(diǎn)個(gè)贊或者轉(zhuǎn)發(fā)哦。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74088.html

相關(guān)文章

  • springCloud學(xué)習(xí)3(Netflix Hystrix彈性客戶端)

    摘要:在艙壁模式中可以隔離每個(gè)遠(yuǎn)程資源,并分配各自的線程池,使之互不影響。 springcloud 總集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代碼見(jiàn)文章最下方。 一、為什么要有客戶端彈性模式 ??所有的系統(tǒng)都會(huì)遇到故障,分布式系統(tǒng)單點(diǎn)故障概率更高。如何構(gòu)建應(yīng)用程序來(lái)應(yīng)對(duì)故障,是每個(gè)軟件開(kāi)發(fā)人員工作的關(guān)鍵部分。但是通...

    yagami 評(píng)論0 收藏0
  • SpringCloud(第 018 篇)Zuul 服務(wù) API 網(wǎng)關(guān)微服務(wù)代理與反向代理

    摘要:注意注解能注冊(cè)到服務(wù)上,是因?yàn)樵撟⒔獍丝蛻舳说淖⒔猓撌且粋€(gè)復(fù)合注解。地址可以查看該微服務(wù)網(wǎng)關(guān)代理了多少微服務(wù)的。 SpringCloud(第 018 篇)Zuul 服務(wù) API 網(wǎng)關(guān)微服務(wù)之代理與反向代理 - 一、大致介紹 1、API 服務(wù)網(wǎng)關(guān)顧名思義就是統(tǒng)一入口,類(lèi)似 nginx、F5 等功能一樣,統(tǒng)一代理控制請(qǐng)求入口,弱化各個(gè)微服務(wù)被客戶端記憶功能; 2、本章節(jié)主要講解了使用...

    YancyYe 評(píng)論0 收藏0
  • 史上最簡(jiǎn)單的SpringCloud教程 | 第四篇:斷路器(Hystrix

    摘要:為了保證其高可用,單個(gè)服務(wù)又必須集群部署。為了解決這個(gè)問(wèn)題,就出現(xiàn)斷路器模型。一斷路器簡(jiǎn)介摘自官網(wǎng)已經(jīng)創(chuàng)建了一個(gè)名為的庫(kù)來(lái)實(shí)現(xiàn)斷路器模式。較底層的服務(wù)如果出現(xiàn)故障,會(huì)導(dǎo)致連鎖故障。當(dāng)對(duì)特定的服務(wù)的調(diào)用達(dá)到一個(gè)閥值是秒次斷路器將會(huì)被打開(kāi)。 轉(zhuǎn)載請(qǐng)標(biāo)明出處: http://blog.csdn.net/forezp/a...本文出自方志朋的博客 在微服務(wù)架構(gòu)中,我們將業(yè)務(wù)拆分成一個(gè)個(gè)的服務(wù),...

    Hydrogen 評(píng)論0 收藏0
  • 外行人都能看懂的SpringCloud,錯(cuò)過(guò)了血虧!

    摘要:集群系統(tǒng)中的單個(gè)計(jì)算機(jī)通常稱為節(jié)點(diǎn),通常通過(guò)局域網(wǎng)連接,但也有其它的可能連接方式。這樣就高興了,可以專心寫(xiě)自己的,前端就專門(mén)交由小周負(fù)責(zé)了。于是,小周和就變成了協(xié)作開(kāi)發(fā)。都是為了項(xiàng)目正常運(yùn)行以及迭代。 一、前言 只有光頭才能變強(qiáng) 認(rèn)識(shí)我的朋友可能都知道我這陣子去實(shí)習(xí)啦,去的公司說(shuō)是用SpringCloud(但我覺(jué)得使用的力度并不大啊~~)... 所以,這篇主要來(lái)講講SpringClou...

    沈建明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

RancherLabs

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<