如何使用Hystrix實現(xiàn)容錯處理

這篇文章將為大家詳細講解有關(guān)如何使用Hystrix實現(xiàn)容錯處理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!成都創(chuàng)新互聯(lián)公司為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計制作,服務(wù)好的網(wǎng)站設(shè)計公司,成都做網(wǎng)站、網(wǎng)站設(shè)計負責(zé)任的成都網(wǎng)站制作公司!

創(chuàng)建一個新的 Maven 項目 hystrix-feign-demo,增加 Hystrix 的依賴,代碼如下所示。

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

在啟動類上添加 @EnableHystrix 或者 @EnableCircuitBreaker。注意,@EnableHystrix 中包含了 @EnableCircuitBreaker。

然后編寫一個調(diào)用接口的方法,在上面增加一個 @HystrixCommand 注解,用于指定依賴服務(wù)調(diào)用延遲或失敗時調(diào)用的方法,代碼如下所示。

@GetMapping("/callHello")@HystrixCommand(fallbackMethod = "defaultCallHello")public String callHello() {
    String result = restTemplate.getForObject("http://localhost:8088/house/hello", String.class);return result;
}

當(dāng)調(diào)用失敗觸發(fā)熔斷時會用 defaultCallHello 方法來回退具體的內(nèi)容,定義 default-CallHello 方法的代碼如下所示。

public String defaultCallHello() {
    return "fail";
}

只要不啟動 8088 端口所在的服務(wù),調(diào)用 /callHello 接口,就可以看到返回的內(nèi)容是“fail”,如圖 1 所示。

如何使用Hystrix實現(xiàn)容錯處理

將啟動類上的 @EnableHystrix 去掉,重啟服務(wù),再次調(diào)用 /callHello 接口可以看到返回的是 500 錯誤信息,這個時候就沒有用到回退功能了。

{
  code: 500,
  message: "I/O error on GET request for
    "http://localhost:8088/house/hello": Connection refused; nested  exception is java.net.ConnectException: Connection refused", data:
        null
}

配置詳解

HystrixCommand 中除了 fallbackMethod 還有很多的配置,下面我們來看看這些配置,如下表所示:


HystrixCommand 配置詳解

名稱說明
hystrix.command.default.execution.isolation
.strategy
該配置用來指定隔離策略,具體策略有下面 2 種。
  • THREAD:線程隔離,在單獨的線程上執(zhí)行,并發(fā)請求受線程池大小的控制。

  • SEMAPHORE:信號量隔離,在調(diào)用線程上執(zhí)行,并發(fā)請求受信號量計數(shù)器的限制。

hystrix.command.default.execution.isolation
.thread.timeoutInMilliseconds
該配置用于 HystrixCommand 執(zhí)行的超時時間設(shè)置,當(dāng) HystrixCommand 執(zhí)行的時間超過了該配置所設(shè)置的數(shù)值后就會進入服務(wù)降級處理,單位是毫秒,默認值為 1000。
hystrix.command.default.execution
.timeout.enabled
該配置用于確定是否啟用 execution.isolation.thread.timeoutInMilliseconds 設(shè)置的超時時間,默認值為 true。設(shè)置為 false 后 execution.isolation.thread.timeoutInMilliseconds 配置也將失效。
hystrix.command.default.execution.isolation
.thread.interruptOnTimeout
該配置用于確定 HystrixCommand 執(zhí)行超時后是否需要中斷它,默認值為 true。
hystrix.command.default.execution.isolation
.thread.interruptOnCancel
該配置用于確定 HystrixCommand 執(zhí)行被取消時是否需要中斷它,默認值為 false。
hystrix.command.default.execution.isolation
.semaphore.maxConcurrentRequests
該配置用于確定 Hystrix 使用信號量策略時最大的并發(fā)請求數(shù)。
hystrix.command.default.fallback.isolation
.semaphore.maxConcurrentRequests
該配置用于如果并發(fā)數(shù)達到該設(shè)置值,請求會被拒絕和拋出異常并且 fallback 不會被調(diào)用,默認值為 10。
hystrix.command.default.fallback.enabled該配置用于確定當(dāng)執(zhí)行失敗或者請求被拒絕時,是否會嘗試調(diào)用 hystrixCommand.getFallback(),默認值為 true。
hystrix.command.default.circuitBreaker.enabled該配置用來跟蹤 circuit 的健康性,如果未達標(biāo)則讓 request 短路,默認值為 true。
hystrix.command.default.circuitBreaker
.requestVolumeThreshold
該配置用于設(shè)置一個 rolling window 內(nèi)最小的請求數(shù)。如果設(shè)為 20,那么當(dāng)一個 rolling window 的時間內(nèi)(比如說 1 個 rolling window 是 10 秒)收到 19 個請求,即使 19 個請求都失敗,也不會觸發(fā) circuit break,默認值為 20。
hystrix.command.default.circuitBreaker
.sleepWindowInMilliseconds
該配置用于設(shè)置一個觸發(fā)短路的時間值,當(dāng)該值設(shè)為 5000 時,則當(dāng)觸發(fā) circuit break 后的 5000 毫秒內(nèi)都會拒絕 request,也就是 5000 毫秒后才會關(guān)閉 circuit。默認值為 5000。
hystrix.command.default.circuitBreaker
.errorThresholdPercentage
該配置用于設(shè)置錯誤率閾值,當(dāng)錯誤率超過此值時,所有請求都會觸發(fā) fallback,默認值為 50。
hystrix.command.default.circuitBreaker.forceOpen如果配置為 true,將強制打開熔斷器,在這個狀態(tài)下將拒絕所有請求,默認值為 false。
hystrix.command.default.circuitBreaker.forceClosed如果配置為 true,則將強制關(guān)閉熔斷器,在這個狀態(tài)下,不管錯誤率有多高,都允許請求,默認值為 false。
hystrix.command.default.metrics
.rollingStats.timeInMilliseconds
設(shè)置統(tǒng)計的時間窗口值,單位為毫秒。circuit break 的打開會根據(jù) 1 個 rolling window 的統(tǒng)計來計算。若 rolling window 被設(shè)為 10 000 毫秒,則 rolling window 會被分成多個 buckets,每個 bucket 包含 success、failure、timeout、rejection 的次數(shù)的統(tǒng)計信息。默認值為 10 000 毫秒。
hystrix.command.default.metrics
.rollingStats.numBuckets
設(shè)置一個 rolling window 被劃分的數(shù)量,若 numBuckets=10、rolling window=10 000,那么一個 bucket 的時間即 1 秒。必須符合 rolling window%numberBuckets==0。默認值為 10。
hystrix.command.default.metrics
.rollingPercentile.enabled
是否開啟指標(biāo)的計算和跟蹤,默認值為 true。
hystrix.command.default.metrics
.rollingPercentile.timeInMilliseconds
設(shè)置 rolling percentile window 的時間,默認值為 60 000 毫秒
hystrix.command.default.metrics
.rollingPercentile.numBuckets
設(shè)置 rolling percentile window 的 numberBuckets,默認值為 6。
hystrix.command.default.metrics
.rollingPercentile.bucketSize
如果 bucket size=100、window=10 秒,若這 10 秒里有 500 次執(zhí)行,只有最后 100 次執(zhí)行會被統(tǒng)計到 bucket 里去。增加該值會增加內(nèi)存開銷及排序的開銷。默認值為 100。
hystrix.command.default.metrics
.healthSnapshot.intervalInMilliseconds
用來計算影響斷路器狀態(tài)的健康快照的間隔等待時間,默認值為 500 毫秒。
hystrix.command.default.requestCache.enabled是否開啟請求緩存功能,默認值為 true。
hystrix.command.default.requestLog.enabled記錄日志到 HystrixRequestLog,默認值為 true。
hystrix.collapser.default.maxRequestsInBatch單次批處理的最大請求數(shù),達到該數(shù)量觸發(fā)批處理,默認為 Integer.MAX_VALUE。
hystrix.collapser.default.timerDelayInMilliseconds觸發(fā)批處理的延遲,延遲也可以為創(chuàng)建批處理的時間與該值的和,默認值為 10 毫秒。
hystrix.collapser.default.requestCache.enabled是否啟用對 HystrixCollapser.execute() 和 HystrixCollapser.queue() 的請求緩存,默認值為 true。
hystrix.threadpool.default.coreSize并發(fā)執(zhí)行的最大線程數(shù),默認值為 10。
hystrix.threadpool.default.maxQueueSizeBlockingQueue 的最大隊列數(shù)。當(dāng)設(shè)為 -1 時,會使用 SynchronousQueue;值為正數(shù)時,會使用 LinkedBlcokingQueue。該設(shè)置只會在初始化時有效,之后不能修改 threadpool 的 queue size。默認值為 -1。
hystrix.threadpool.default.queueSizeRejectionThreshold即使沒有達到 maxQueueSize,但若達到 queueSizeRejectionThreshold 該值后,請求也會被拒絕。因為 maxQueueSize 不能被動態(tài)修改,而 queueSizeRejectionThreshold 參數(shù)將允許我們動態(tài)設(shè)置該值。if maxQueueSize==-1,該字段將不起作用。
hystrix.threadpool.default.keepAliveTimeMinutes設(shè)置存活時間,單位為分鐘。如果 coreSize 小于 maximumSize,那么該屬性控制一個線程從實用完成到被釋放的時間。默認值為 1 分鐘。
hystrix.threadpool.default
.allowMaximumSizeToDivergeFromCoreSize
該屬性允許 maximumSize 的配置生效。那么該值可以等于或高于 coreSize。設(shè)置 coreSize 小于 maximumSize 會創(chuàng)建一個線程池,該線程池可以支持 maximumSize 并發(fā),但在相對不活動期間將向系統(tǒng)返回線程。默認值為 false。
hystrix.threadpool.default.metrics
.rollingStats.timeInMilliseconds
設(shè)置滾動時間窗的時間,單位為毫秒,默認值是 10 000。
hystrix.threadpool.default.metrics
.rollingStats.numBuckets
設(shè)置滾動時間窗劃分桶的數(shù)量,默認值為 10。

官方的配置信息文檔請參考:https://github.com/Netflix/Hystrix/wiki/Configuration。

上面列出來的都是 Hystrix 的配置信息,那么在 Spring Cloud 中該如何使用呢?只需要在接口的方法上面使用 HystrixCommand 注解(如下代碼所示),指定對應(yīng)的屬性即可。

@HystrixCommand(fallbackMethod = "defaultCallHello",commandProperties = {
        @HystrixProperty(name="execution.isolation.strategy", value = "THREAD")}
)@GetMapping("/callHello")public String callHello() {
    String result = restTemplate.getForObject("http://localhost:8088/house/hello", String.class);return result;
}

關(guān)于如何使用Hystrix實現(xiàn)容錯處理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

新聞標(biāo)題:如何使用Hystrix實現(xiàn)容錯處理
標(biāo)題URL:http://muchs.cn/article44/pgoeee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)頁設(shè)計公司、網(wǎng)站導(dǎo)航、網(wǎng)站維護、ChatGPT、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)