【spring cloud】(三)服務降級——Hystrix

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛

💡服務調用知識點速覽

  • 🍹 Hystrix
    • 🍸 初識Hystrix
      • 🍷 Hystrix是什么?
  • 🍹 Hystrix三大概念
    • 🍸 服務降級(fallback)
      • 🍷 fallback是什么?
      • 🍷 服務提供方實現服務降級
      • 🍷 服務調用方實現服務降級
      • 🍷 服務降級優化
    • 🍸 服務熔斷(break)
      • 🍷 break是什么?
      • 🍷 服務提供方實現服務熔斷
    • 🍸 服務限流(flowlimit)
      • 🍷 flowlimit是什么?
  • 🍹 Hystrix圖形化監控

🍹 Hystrix

🍸 初識Hystrix

🍷 Hystrix是什么?

??Java應用程序講求“高內聚低耦合”,而spring cloud是一種微服務架構理念,將原來的一個應用程序拆分成許多微服務來調用,這樣的話就可以滿足“低耦合”的要求,但是隨之而來的就是“服務雪崩”問題。

??所謂的服務雪崩就是指,由于服務提供者不可用導致服務調用者不可用,并且在生產過程中,這種不可用逐漸擴大的現象。想要解決“服務雪崩”問題就需要用到Hystrix(豪豬)

??Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,在分布式系統里,許多依賴不可避免的會調用失敗,比如超時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分布式系統的彈性。

??"斷路器”本身是一種開關裝置,當某個服務單元發生故障之后,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地占用,從而避免了故障在分布式系統中的蔓延,乃至雪崩。

🍹 Hystrix三大概念

🍸 服務降級(fallback)

🍷 fallback是什么?

??所謂的服務降級就是當服務出現程序運行異常、超時、服務熔斷觸發服務降級、線程池/信號量打滿等情況,此時應該返回一個符合預期的、可處理的備選響應(fallback),以提高用戶的使用體驗而不是長時間的等待請求或者返回一個超時異常頁面。總而言之,當出現以上問題時,要有一個兜底方案來提高用戶的使用體驗

??服務降級的解決方案可以分為服務提供方和服務調用方,兩面都可以實現服務降級

🍷 服務提供方實現服務降級

??第一步: 對服務提供方的service接口方法進行加強,主要就是針對可能出現超時等異常情況的接口,新建方法對其進行兜底,如果原接口出現問題則使用兜底方案進行反饋
??使用@HystrixCommand注解的fallbackMethod屬性指定兜底方法名,使用commandProperties屬性的@HystrixProperty注解指定異常類型(超時異常和超時時間)

/*** 超時訪問,設置自身調用超時的峰值,峰值內正常運行,超過了峰值需要服務降級 自動調用fallbackMethod 指定的方法* 超時異常或者運行異常 都會進行服務降級* @param id* @return*/
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String paymentInfoTimeOut(Integer id) {int second = 5;try {TimeUnit.SECONDS.sleep(second);} catch (InterruptedException e) {e.printStackTrace();}return "線程池:  " + Thread.currentThread().getName() + " paymentInfoTimeOut,id:  " + id + "\t"+ "O(∩_∩)O哈哈~" + "  耗時(秒): " + second;
}public String paymentInfo_TimeOutHandler(Integer id) {return "超時異常兜底方案!線程池:  " + Thread.currentThread().getName() + " paymentInfo_TimeOutHandler,id:  " + id + "\t";
}

??第二步: 服務提供方的主啟動類上使用@EnableCircuitBreaker注解開啟“熔斷器”,這樣的話前面的配置才能生效

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class HystrixPaymentMain8001 {public static void main(String[] args) {SpringApplication.run(HystrixPaymentMain8001.class, args);}
}

??除了上述可以自定義超時時間的異常,出現其他運行時異常也會調用兜底方案返回
在這里插入圖片描述

🍷 服務調用方實現服務降級

??第一步: 使用配置文件開啟hystrix

feign:hystrix:enabled: true

??第二步: 服務調用方的controller加強,新建方法對其進行兜底,使用方式與服務提供方一樣,主要就是服務調用方和服務提供方兩套方案,可以實現兩邊定制化。

@GetMapping("/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", 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 paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {return "服務調用方兜底方案!我是消費者80,對方支付系統繁忙請10秒鐘后再試或者自己運行出錯請檢查自己,o(╥﹏╥)o";
}

??第三步: 服務調用方的主程序類上使用@EnableHystrix注解開啟hystrix

🍷 服務降級優化

解決冗余問題

??前面的每一個方法都對應一個兜底方案,這樣的話會顯得代碼十分臃腫,實際上很多的接口都可以使用一個兜底方案,于是我們就可以配置默認的兜底方案,在沒有使用@HystrixCommand注解指定的時候,類中的所有接口都會走默認兜底方案

??@DefaultProperties注解的defaultFallback屬性指定默認兜底方法,如果類中存在@HystrixCommand注解中不使用屬性指定特定兜底方案的情況,就說明這個接口使用是默認兜底方案

@RestController
@RequestMapping("consumer")
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@HystrixCommand@GetMapping("/payment/hystrix/ex/{id}")public String paymentInfoException(@PathVariable("id") Integer id) {int age = 10/0;String result = paymentHystrixService.paymentInfoException(id);return result;}/*** hystrix 全局fallback方法* @return*/public String payment_Global_FallbackMethod() {return "Global異常處理信息,請稍后再試,/(ㄒoㄒ)/~~";}
}

解決耦合問題

??上述操作中,原方案和兜底方案都在controller中定義,想要解決這個耦合問題可以使用一個類實現service接口,然后重寫所有的接口方法,然后使用service接口上@FeignClient注解的fallback屬性指定接口的實現類為兜底類

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")String paymentInfoOK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")String paymentInfoTimeOut(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/ex/{id}")String paymentInfoException(Integer id);
}
@Component
public class PaymentFallbackService implements PaymentHystrixService {@Overridepublic String paymentInfoOK(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_OK ,o(╥﹏╥)o";}@Overridepublic String paymentInfoTimeOut(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_TimeOut ,o(╥﹏╥)o";}@Overridepublic String paymentInfoException(Integer id) {return "-----PaymentFallbackService fall back-paymentInfoException ,o(╥﹏╥)o";}}

🍸 服務熔斷(break)

🍷 break是什么?

??微服務鏈路中某個微服務的請求達到最大訪問之后,直接拒絕訪問,然后調用服務降級的方法返回友好的提示;當檢測到該節點微服務調用響應正常之后,還可以恢復鏈路的正常調用。hystrix會默認在服務5秒內調用失敗20次后觸發熔斷機制,但是也可以使用配置對其進行修改。

🍷 服務提供方實現服務熔斷

??首先service層使用注解配置服務熔斷的相關值和熔斷時的備選方案,就以下代碼為例:在10S的時間窗口期中,10次請求中失敗率達到60%就會觸發熔斷啟動備選方案。

??如果在10S的時間窗口期中,請求次數不足10次,那么根本就不可能觸發熔斷器。當熔斷器開啟后所有的請求都不會被轉發,一段時間窗口期之后(默認5秒,可以自定義配置)斷路器切換為半開狀態,此時會讓其中一個請求進行轉發,成功則關閉斷路器,反之繼續開啟

@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),/* 是否開啟斷路器*/@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 請求次數@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 時間窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),// 失敗率達到多少后跳閘
})
public String paymentCircuitBreaker(Integer id) {if (id < 0) {throw new RuntimeException("******id 不能負數");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName() + "\t" + "調用成功,流水號: " + serialNumber;
}public String paymentCircuitBreakerFallback(Integer id) {return Thread.currentThread().getName() + "\t" + "id 不能負數或超時或自身錯誤,請稍后再試,/(ㄒoㄒ)/~~   id: " + id;
}

??controller中調用service方法

@GetMapping("/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {String result = paymentService.paymentCircuitBreaker(id);log.info("****result: " + result);return result;
}

🍸 服務限流(flowlimit)

🍷 flowlimit是什么?

??在秒殺等高并發的操作下,為了防止大量請求一塊發送過來,采用排隊的方式,把請求按照順序排隊發送過來。由于hystrix已經停止更新,而且Alibaba的sentinel在進行服務限流的處理時比hystrix更加優秀,所以說這一部分知識可以放在后面進行學習。

🍹 Hystrix圖形化監控

??第一步: 新建一個模塊用于監控,導入相關依賴

<dependencies><!--最主要的依賴,用于引入圖形化dashboard--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><!-- 引入自己定義的api通用包 --><dependency><groupId>com.xiaochen</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

??第一步: 配置文件配置端口號

server:port: 9001

??第三步: 主啟動類開啟HystrixDashboard,

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {public static void main(String[] args) {SpringApplication.run(HystrixDashboardMain9001.class, args);}
}

??此外,所有的服務提供方也就是被監控的服務都要引入spring-boot-starter-actuator依賴,表示自己可以受監控。然后就是在服務的主啟動類上要使用以下代碼中的addUrlMappings配置受監控的路徑

/*** 注意:新版本Hystrix需要在主啟動類中指定監控路徑* 此配置是為了服務監控而配置,與服務容錯本身無關,spring cloud升級后的坑* ServletRegistrationBean因為springboot的默認路徑不是"/hystrix.stream",* 只要在自己的項目里配置上下面的servlet就可以了** @return ServletRegistrationBean*/
@Bean
public ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);// 一啟動就加載registrationBean.setLoadOnStartup(1);// 添加urlregistrationBean.addUrlMappings("/hystrix.stream");// 設置名稱registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;
}

??啟動監控模塊、eureka模塊、受監控模塊之后,訪問以下路徑可以通過路徑監控指定的服務,設置后點擊下面的Monitor Stream按鈕即可進入圖形化監控界面在這里插入圖片描述
圖形化界面各處代表的含義如下:在這里插入圖片描述

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

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

相關文章

mysql高級查詢教程_MYSQL高級查詢

實際開發中&#xff0c;經常需要對某些數據進行統計&#xff0c;比如&#xff0c;統計某個字段的最大值、最小值、平均值等。MySQL中&#xff0c;提供了一些函數來實現這些功能聚合函數COUNT()——返回某列的行數SUM()——返回某列值的和AVG()——返回某列的平均值MAX()——返回…

【dubbo】(一) dubbo是什么?

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的dubbo專欄&#xff0c;在這個系列專欄中我對B站尚硅谷雷神的dubbo教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;dubbo知識點速覽&a…

axios安裝_Vue腳手架安裝,與基本語法(干貨)

首先&#xff0c;這篇Vue文章是為了下一篇我整合springbootvue前后分離的小demo&#xff0c;這兩天整理好會上傳哈哈1. Node.js安裝1.1 下載安裝在node.js 官網下載&#xff0c; 根據自己電腦系統安裝&#xff0c;一直點下一步即可1.2 測試安裝是否成功WindowsR打開cmd窗口&…

mysql port range_MySQL 數據庫常見調優方法及參數設置_MySQL

1. 關閉 SELinuxvim /etc/selinux/config 更改 SELINUXenforcing 為 SELINUXdisabled2. 更改 IO Schedule, 對于 SSD 硬盤無需更改echo deadline > /sys/block/sda/queue/scheduler3. 更改 ulimitvim /etc/security/limits.conf* soft nofile 65535* hard nofile 65535roo…

base64 能放數組里面么_數組:總結篇

我們做個總結吧數組理論基礎數組是非常基礎的數據結構&#xff0c;在面試中&#xff0c;考察數組的題目一般在思維上都不難&#xff0c;主要是考察對代碼的掌控能力也就是說&#xff0c;想法很簡單&#xff0c;但實現起來 可能就不是那么回事了。首先要知道數組在內存中的存儲方…

xampp mysql 卸載_卸載Xampp并安裝apache + mysql + php 過程

首先是卸載xampp&#xff0c;打開xampp-control.exe 控制面板&#xff0c;停止apache和mysql服務。如果你是安裝版xampp&#xff0c;可以到如果不是則安裝如下方法。停止服務之后。就需要卸載服務。打開cmd&#xff0c;用sc.exe這個Windows命令開始——運行——cmd.exe&#xf…

python判斷正確錯誤_python錯誤和異常

Python3 錯誤和異常 作為 Python 初學者&#xff0c;在剛學習 Python 編程時&#xff0c;經常會看到一些報錯信息&#xff0c;在前面我們沒有提及&#xff0c;這章節我們會專門介紹。 Python 有兩種錯誤很容易辨認&#xff1a;語法錯誤和異常。 Python assert&#xff08;斷言&…

nodejs mysql 返回json_python向mysql中存儲JSON及Nodejs取出

雖然把JSON數據存入mysql也是比較蛋疼&#xff0c;但是相比使用Nodejs嵌套處理多個mysql查詢并拼接返回數據也算是沒mongo時的一個折中方案了。我使用python拼接了一個json格式的字符串&#xff0c;卻遇到了一些問題1&#xff0c;如果把json數據轉成str存入&#xff0c;那么nod…

17個常用經典數據可視化圖表與冷門圖表

數據可視化是創建信息圖形表示的過程。隨著可視化技術的飛速發展&#xff0c;可以利用強大的可視化工具選擇合適的數據可視化圖表來展示數據。以下專業人士都應該知道的一些最重要的數據可視化圖表。 常見數據可視化圖表 餅圖 餅圖是最常見和最基本的數據可視化圖表之一。餅圖…

python keyerror_盤點Python 初學者最容易犯的10大錯誤!你中招了嗎?

對于新手&#xff0c;初學Python時&#xff0c;總會遇到這樣那樣的報錯&#xff0c;想要弄懂Python錯誤信息的含義可能還不知道怎么做&#xff0c;這里列出了一些比較常見的Python報錯問題&#xff0c;希望對于學習Python的人能夠有些幫助。發現有很多想要學習Python卻不知道如…

mysql index sub part_mysql中的key和index 理解

mysql的key和index多少有點令人迷惑&#xff0c;這實際上考察對數據庫體系結構的了解的。1 key 是數據庫的物理結構&#xff0c;它包含兩層意義&#xff0c;一是約束(偏重于約束和規范數據庫的結構完整性)&#xff0c;二是索引(輔助查詢用的)。包括primary key, unique key, fo…

【spring cloud】(六)消息總線——springcloud Bus

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的spring cloud專欄&#xff0c;在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Bus…

python快速排序代碼_Python實現快速排序算法

原標題&#xff1a;Python實現快速排序算法 Python實現快速排序算法 快速排序算法是一種基于交換的高效的排序算法&#xff0c;由C.R.A.Hoare于1962年提出&#xff0c;是一種劃分交換排序。它采用了一種分治的策略&#xff0c;通常稱其為分治法(Divide and conquer algorithm)。…

docker mysql 生產環境_如何部署Docker MySQL生產環境?

1 前言Docker容器原則上是短暫的&#xff0c;如果容器被刪除或損毀&#xff0c;數據或配置將丟失&#xff0c;所以上個章節部署的MySQL只適合于測試環境&#xff0c;由于生產的需求&#xff0c;本章將使用Docker卷機制持久保存Docker容器中創建的數據。2 最佳實踐2.1 環境配置2…

kali 切換root權限_Ubuntu 被曝嚴重漏洞:切換系統語言 + 輸入幾行命令,就能獲取 root 權限...

公眾號關注 “GitHubDaily”設為 “星標”&#xff0c;帶你了解技術圈內新鮮事&#xff01;來自量子位無需系統密碼&#xff0c;就能添加新的 sudo 用戶、獲取 root 權限&#xff0c;事后還能刪除不留痕跡。這是 GitHub 安全研究員 Kevin Backhouse 發現的一個 Ubuntu 系統大漏…

oracle定義變量sql賦值_ORACLE獲取SQL綁定變量值的方法總結

本文總結一下ORACLE數據庫中如何獲取SQL綁定變量值的方法&#xff0c;在SQL優化調優過程中&#xff0c;經常會用到這方面的知識點。在此梳理、總結一下這方面的知識點&#xff0c;方面日后查找、翻閱。方法1&#xff1a;查詢V$SQLV$SQL視圖中的BIND_DATA字段用來存儲綁定變量的…

transition css_Transition 過渡

1&#xff1a;基本概念在一定時間內平滑的過渡&#xff0c;也就是圓滑的以動畫效果改變css的屬性值。它的過渡可以由鼠標點擊、焦點獲取或者失去、被點擊事件或對元素的改變中觸發&#xff1b;不能主動觸發&#xff0c;只能被動觸發。常用的基本屬性有&#xff1a;Transition-d…

jdbc mysql分頁_JDBC【數據庫連接池、DbUtils框架、分頁】

1.數據庫連接池什么是數據庫連接池簡單來說&#xff1a;數據庫連接池就是提供連接的。。。為什么我們要使用數據庫連接池數據庫的連接的建立和關閉是非常消耗資源的頻繁地打開、關閉連接造成系統性能低下編寫連接池編寫連接池需實現java.sql.DataSource接口創建批量的Connectio…

python讀寫文件操作_詳解Python文件讀寫操作

讀文件 打開文件&#xff08;文件需要存在&#xff09;#打開文件 f open("data.txt","r") #設置文件對象 print(f)#文件句柄 f.close() #關閉文件 #為了方便&#xff0c;避免忘記close掉這個文件對象&#xff0c;可以用下面這種方式替代 with open(data.t…

keyloadtool_phoenix 利用CsvBulkLoadTool 批量帶入數據并自動創建索引

需要先創建表&#xff1a;CREATE TABLE IF NOT EXISTS population (state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINTCONSTRAINT my_pk PRIMARY KEY (state, city));在phoenix 目錄下執行hadoop jar /home/phoenix-4.6.0-HBase-1.0-bin/phoenix-4.6.0-HBase-…