SpringCloud系列(31)--使用Hystrix進行服務降級

前言:在上一章節中我們創建了服務消費者模塊,而本節內容則是使用Hystrix對服務進行服務降級處理。

1、首先我們先對服務提供者的服務進行服務降級處理
(1)修改cloud-provider-hystrix-payment8001子模塊的PaymentServiceImpl類

注:@HystrixProperty注解的更多key/value參數設置可以查看HystrixCommandProperties 類

package com.ken.springcloud.service.impl;import com.ken.springcloud.service.PaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class PaymentServiceImpl implements PaymentService {@Overridepublic String paymentInfoOK(Integer id) {return "線程池:" + Thread.currentThread().getName() + "paymentInfoOK,id: " + id;}@Override//一旦調用服務方法失敗并拋出了錯誤信息后,會自動調用@HystrixCommand標注好的fallbackMethod調用類中的指定方法,這里設置服務降級的條件為連接超時超過3秒,即3秒內走paymentInfoTimeOut方法內的業務邏輯,超過3秒走paymentInfoTimeOutHandler方法@HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})public String paymentInfoTimeOut(Integer id) {int timeNumber = 5;try {TimeUnit.SECONDS.sleep(timeNumber);} catch (InterruptedException e) {e.printStackTrace();}return "線程池:" + Thread.currentThread().getName() + "paymentInfoTimeOut,id: " + id + "耗時" + timeNumber + "秒";}public String paymentInfoTimeOutHandler(Integer id) {return "系統繁忙,請稍后再試";}}
(2)修改cloud-provider-hystrix-payment8001子模塊的PaymentHystrixMain8001啟動類
package com.ken.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
//使用Feign,激活并開啟
@EnableEurekaClient
//開啟斷路器功能
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentHystrixMain8001.class, args);}}
(3)?分別啟動eureka-server7001、cloud-provider-hystrix-payment8001服務

效果圖:

(4)?在瀏覽器的地址欄里分別輸入http://localhost:8001/payment/hystrix/timeout/1通過調用這個接口查看服務提供者的服務降級功能是否正常運行

效果圖:
?

由圖可知服務提供者的服務降級成功,客戶端連接cloud-provider-hystrix-payment8001服務超時后最后執行了paymentInfoTimeOutHandler方法,由paymentInfoTimeOutHandler方法進行兜底處理,而且值得注意的是正常調用服務使用到的線程池和服務降級時使用到的線程池不是同一個,這意味著hystrix用單獨的一個線程池作服務降級處理,起到了隔離的效果

正常的:

?

降級處理的:

2、在上述的操作中我們對服務提供者的服務成功地進行了服務降級處理,接下來我們對服務消費者的服務同樣進行服務降級處理
(1)修改cloud-consumer-feign-hystrix-order80子模塊的application.yml文件,加上feign:hystrix:enabled:true的配置,使feign調用啟用hystrix

關于feign:hystrix:enabled:true配置的相關官方文檔,官方文檔介紹如果配置feign.hystrix.Enabled=true,則Feign將使用斷路器包裝所有方法https://cloud.spring.io/spring-cloud-openfeign/reference/html/#spring-cloud-feign-hystrix-fallback

server:port: 8080
eureka:client:#表示是否將自己注冊進Eureka Server里,默認為trueregister-with-eureka: falseservice-url:defaultZone: http://eureka7001.com:7001/eureka/feign:client:config:default:#指的是建立連接所用的時間,適用于網絡狀況正常的情況下,兩端連接所用的時間connect-timeout: 5000#指的是建立連接后從服務器讀取到可用資源所用的時間read-timeout: 5000#feign調用啟用hystrix,啟用后feign調用可以使用hystrix的服務降級、服務熔斷、服務隔離等,從上述的設置可知feign請求超過5s就會進行服務降級、服務熔斷、服務隔離等相關操作hystrix:enabled: true#設置命令執行的超時時間,默認1000ms,因為開啟了feign:hystrix:enabled:true,這里要設置為5000ms,否則設置ribbon的超時時間也沒用,ribbon的超時時間會被強制改為了1000ms
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 5000
(2)修改cloud-consumer-feign-hystrix-order80子模塊的OrderHystrixMain80啟動類,開啟斷路器功能
package com.ken.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
//使用Feign,激活并開啟
@EnableFeignClients
//開啟斷路器功能
@EnableCircuitBreaker
public class OrderHystrixMain80 {public static void main(String[] args) {SpringApplication.run(OrderHystrixMain80.class, args);}}
(3)修改cloud-provider-hystrix-payment8001子模塊的PaymentServiceImpl類,把睡眠時間調為2秒,模擬服務提供者正常運行
package com.ken.springcloud.service.impl;import com.ken.springcloud.service.PaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class PaymentServiceImpl implements PaymentService {@Overridepublic String paymentInfoOK(Integer id) {return "線程池:" + Thread.currentThread().getName() + "paymentInfoOK,id: " + id;}@Override//一旦調用服務方法失敗并拋出了錯誤信息后,會自動調用@HystrixCommand標注好的fallbackMethod調用類中的指定方法,這里設置服務降級的條件為連接超時超過3秒,即3秒內走paymentInfoTimeOut方法內的業務邏輯,超過3秒走paymentInfoTimeOutHandler方法@HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})public String paymentInfoTimeOut(Integer id) {int timeNumber = 2;try {TimeUnit.SECONDS.sleep(timeNumber);} catch (InterruptedException e) {e.printStackTrace();}return "線程池:" + Thread.currentThread().getName() + "paymentInfoTimeOut,id: " + id + "耗時" + timeNumber + "秒";}public String paymentInfoTimeOutHandler(Integer id) {return "線程池:" + Thread.currentThread().getName() + "系統繁忙,請稍后再試";}}
(4)修改cloud-consumer-feign-hystrix-order80子模塊的OrderHystrixController類,設置超時時間為1.5秒,這里是模擬服務消費者端的響應時間短但是服務提供者端返回資源的時間長,從而觀察服務消費者端在超時后會作出什么反應
package com.ken.springcloud.controller;import com.ken.springcloud.service.PaymentHystrixService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
public class OrdertHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@GetMapping("/consumer/payment/hystrix/ok/{id}")public String paymentInfoOK(@PathVariable("id") Integer id) {String result = paymentHystrixService.paymentInfoOK(id);return result;}@GetMapping("/consumer/payment/hystrix/timeout/{id}")//一旦調用服務方法失敗并拋出了錯誤信息后,會自動調用@HystrixCommand標注好的fallbackMethod調用類中的指定方法,這里設置服務降級的條件為連接超時超過3秒,即3秒內走paymentInfoTimeOut方法內的業務邏輯,超過3秒走paymentInfoTimeOutHandler方法@HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})public String paymentInfoTimeOut(@PathVariable("id") Integer id) {String result = paymentHystrixService.paymentInfoTimeOut(id);return result;}public String paymentInfoTimeOutHandler(Integer id) {return "服務提供者繁忙,請稍后再試";}}
(5)?分別啟動eureka-server7001、cloud-provider-hystrix-payment8001服務、cloud-consumer-feign-hystrix-order80服務

效果圖:

(6)?在瀏覽器的地址欄里分別輸入http://localhost:8080/consumer/payment/hystrix/timeout/1通過調用這個接口查看服務消費者的服務降級功能是否正常運行

由圖可知服務消費者的服務降級成功,服務消費者連接服務提供者的服務超過1.5秒后超時,最后執行了paymentInfoTimeOutHandler方法,由paymentInfoTimeOutHandler方法進行兜底處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15738.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習elixir(1)

突然發現elixir很有趣&#xff0c;所以想記錄以下學習內容 # .ex .exs file elixir simple.exs # mix new <app_name> # mix deps.get; mix deps.update; mix deps.compile # 怎么使用mix escript.build # eg. 在mix.exs添加escript: [main_module: IntentionCLI, name:…

Window在VScode運行C/C++程序

首先說明&#xff1a;不同運行環境&#xff08;Linux/Window&#xff09;下的頭文件會有差異&#xff0c;要注意變換&#xff01;生成可執行文件 Window默認生成a.exe&#xff0c;Linux默認生成a.out # C源代碼 g test.cpp # C語言源代碼 g test.c 或 gcc test.c直接輸入a.ex…

從零開始學逆向,js逆向啟蒙:有道翻譯

語言&#xff1a;js、python 工具&#xff1a;pycharm、chrome瀏覽器F12調試、chatgpt&#xff08;補充js第三方庫&#xff0c;轉python&#xff09;、node.js(js運行)&#xff08;必須&#xff09; 目標&#xff1a;學習掌握基本js逆向知識。 對象&#xff1a; 有道翻譯 &a…

怎么判斷同步時序邏輯電路和異步時序邏輯電路?

&#x1f3c6;本文收錄于「Bug調優」專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&&…

力扣刷題---2418. 按身高排序【簡單】

題目描述 給你一個字符串 數組 names &#xff0c;和一個由 互不相同 的正整數組成的數組 heights 。兩個數組的長度均為 n 。 對于每個下標 i&#xff0c;names[i] 和 heights[i] 表示第 i 個人的名字和身高。 請按身高 降序 順序返回對應的名字數組 names 。 示例 1&…

僵尸進程,孤兒進程,守護進程

【一】僵尸進程 1.僵尸進程是指完成自己的任務之后&#xff0c;沒有被父進程回收資源,占用系統資源,對計算機有害&#xff0c;應該避免 """ 所有的子進程在運行結束之后都會變成僵尸進程(死了沒死透)還保留著pid和一些運行過程的中的記錄便于主進程查看(短時間…

嵌入式作業5

在函數main.c中初始化三種顏色的燈&#xff1a; gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF); //藍燈 gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF); //綠燈 gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF); //紅燈 同時為了響應以上修改&#xff0c;進入isr。c…

STM32 CubeMX使用記錄

取消DMA中斷默認使能 DMA中斷默認使能勾選無法取消選中 取消勾選Force DMA channels interrupts

cadence23---PCB Editer 學習筆記

1.交互式布局 在Orcad中點擊圖標N生成第一網表&#xff1a; 在PCB Editer中導入第一網表&#xff0c; 之后點擊移動命令并在右側屬性框中勾選Symbol選項卡&#xff1a; 設置--應用模式--點擊常規編輯&#xff1a; 之后就可以進行交互式選擇了。 綠色圖標為打開全部飛線&#…

web前端學習筆記11

11. CSS3高級特效 11.1 CSS3變形 CSS3變形是一些效果的集合, 如平移、旋轉、縮放、傾斜效果 每個效果都可以稱為變形(transform),它們可以分別操控元素發生平移、旋轉、縮放、傾斜等變化 語法 transform:[transform-function] ; /* 設置變形函數,可以是一個,也可以是多…

2024年【N1叉車司機】考試題及N1叉車司機找解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 N1叉車司機考試題參考答案及N1叉車司機考試試題解析是安全生產模擬考試一點通題庫老師及N1叉車司機操作證已考過的學員匯總&#xff0c;相對有效幫助N1叉車司機找解析學員順利通過考試。 1、【多選題】《特種設備使用…

git使用介紹

一、為什么做版本控制&#xff08;git是版本控制工具&#xff09; 為了保留之前所以的版本&#xff0c;以便回滾和修改 二、點擊安裝 三、基礎操作 1、初步認識 想要讓git對一個目錄進行版本控制需要以下步驟&#xff1a; 進入要管理的文件夾進行初始化命令 git init管理…

Amesim基礎篇-元件詳解-H型膨脹閥四象限解析

一 膨脹閥簡介 膨脹閥的主要功能是節流和調節過熱度,庫內膨脹閥包含節流管、H型膨脹閥、T型膨脹閥三種: 節流管:一根內徑較小的管路,當制冷劑通過他時發生等等焓降壓降溫,具有成本低,內徑不可變的特點,因此普遍在家用空調中使用,在汽車空調上使用較少。當我們建模過程…

Linux虛擬主機中如何創建文件和文件夾

我想創建一個新的文件夾&#xff0c;由于我使用的Hostease的Linux虛擬主機產品默認帶普通用戶權限的cPanel面板&#xff0c;但是不知道如何在cPanel上操作創建文件&#xff0c;因為也是對于Hostease主機產品不是很了解&#xff0c;因此聯系Hostease的咨詢了Hostease技術支持&am…

JAVA線程池的線程數量配置

一 JAVA線程池的線程數量配置 關于線程的配置&#xff0c;線程數量配置多少這個問題呢&#xff1f;往往不同的環境與不同的線程中的代碼決定其配置的線程的數量。 二 常見的線程量配置 最常見的方式根據線程中處理的代碼劃分為CPU密集型或IO密集型&#xff1a; CPU密集型&…

【多標簽分類問題的樣本挖掘】Pytorch中的TripletMarginLoss的樣本挖掘

多數度量學習的代碼都需要進行挖掘&#xff0c;樣本挖掘過程就是把一個Batch中的所有樣本&#xff0c;根據標簽來劃分成正樣本和負樣本 這里我們只討論多標簽分類問題&#xff0c;標簽是onehot編碼&#xff0c;如果是單標簽分類任務可以去看pytorch_metric_learning這個庫有實現…

學習Uni-app開發小程序Day18

昨天學習了使用輪播顯示圖片和文字&#xff0c;輪播方式縱向和橫向。今天使用擴展組件和scroll-view顯示圖片&#xff0c;使用scroll-view的grid方式、插槽slot、自定義組件、磨砂背景定位布局做專題組件 這就是需要做成的效果&#xff0c;下面將一步一步的完成。 首先&#x…

如何高效創建與配置工程環境:零基礎入門

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、工程環境的搭建與準備 二、配置虛擬環境與選擇解釋器 三、編寫代碼與自動添加多行注釋 …

git describe --tags報錯 fatal: No names found, cannot describe anything.

文章目錄 git describe --tags報錯 fatal: No names found, cannot describe anything. git describe --tags報錯 fatal: No names found, cannot describe anything. 問題描述&#xff1a; git describe --tags fatal: No names found, cannot describe anything.原因分析&a…

SpringMVC筆記

一、SpringMVC 簡介 1.1 什么是 MVC MVC 是一種軟件架構的思想&#xff0c;將軟件按照模型、視圖、控制器來劃分 1.M&#xff1a;Model 模型層&#xff0c;指工程中的 JavaBean &#xff0c;作用是處理數據 JavaBean 分為兩類 實體類Bean&#xff1a;專門存儲業務數據的…