hystrix threadpool coresize_Hystrix斷路器 - 求知若渴的蝸牛

Hystrix介紹

在微服務場景中,通常會有很多層的服務調用。如果一個底層服務出現問題,故障會被向上傳播給用戶。我們需要一種機制,當底層服務不可用時,可以阻斷故障的傳播。這就是斷路器的作用。他是系統服務穩定性的最后一重保障。

在springcloud中斷路器組件就是Hystrix。Hystrix也是Netflix套件的一部分。他的功能是,當對某個服務的調用在一定的時間內(默認10s),有超過一定次數(默認20次)并且失敗率超過一定值(默認50%),該服務的斷路器會打開。返回一個由開發者設定的fallback。

fallback可以是另一個由Hystrix保護的服務調用,也可以是固定的值。fallback也可以設計成鏈式調用,先執行某些邏輯,再返回fallback。

Hystrix作用:

能夠實現 服務的降級,服務的熔斷,接近實時的監控

官網資料?https://github.com/Netflix/Hystrix/wiki/How-To-Use

Hystrix官宣,停更進維?https://github.com/Netflix/Hystrix

Hystrix重要概念

服務降級

? ? ? ? 服務器忙,請稍候再試,不讓客戶端等待并立刻返回一個友好提示,fallback

哪些情況會觸發降級

? ? ? ? 程序運行異常

? ? ? ? 超時

? ? ? ? 服務熔斷觸發服務降級

? ? ? ? 線程池/信號量打滿也會導致服務降級

服務熔斷

? ? ? ? 類比保險絲達到最大服務訪問后,直接拒絕訪問,拉閘限電,然后調用服務降級的方法并返回友好提示

就是保險絲?服務的降級->進而熔斷->恢復調用鏈路

服務限流??

? ? ? ? 秒殺高并發等操作,嚴禁一窩蜂的過來擁擠,大家排隊,一秒鐘N個,有序進行

hystrix案例

? 在上一節整合openfeign的基礎上整合hystrix 主要用到了這個三個服務

a8231738f6d18301c81c43c6e3d22d52.png

? 模擬故障

? 服務提供者有一個耗時的服務,消費者調用一次訪問特別慢,轉圈但是最終可以訪問

5cfc70c153d7aa29d611ce84cc677543.png

?但是不影響這個接口

99833bc576cde5fffc7d5fd0dfa66512.png

?當開啟多線程測試,訪問量為2000去訪問

5cfc70c153d7aa29d611ce84cc677543.png

再次訪問

21e98a110614710c24fa7ac5b84f6443.png

也開始轉圈了

導致原因

? ? ? 8001同一層次的其他接口服務被困死,因為tomcat線程里面的工作線程已經被擠占完畢

? ? ? 80此時調用8001,客戶端訪問響應緩慢,轉圈圈

上訴結論

? ? ? ?正因為有上述故障或不佳表現,才有我們的降級/容錯/限流等技術誕生

? ? ? ?如何解決?解決的要求

超時導致服務器變慢(轉圈)?超時不再等待

? ? ? ?出錯(宕機或程序運行出錯)?出錯要有兜底

解決?

? ? ? ? ?對方服務(8001)超時了,調用者(80)不能一直卡死等待,必須有服務降級

? ? ? ? ?對方服務(8001)down機了,調用者(80)不能一直卡死等待,必須有服務降級

? ? ? ? ?對方服務(8001)OK,調用者(80)自己出故障或有自我要求(自己的等待時間小于服務提供者),自己處理降級

服務降級

? ? ?pom文件加入依賴

<!--整合熔斷器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

? ? ? ?降低配置??@HystrixCommand

? ? ? ?8001先從自身找問題? ?設置自身調用超時時間的峰值,峰值內可以正常運行,超過了需要有兜底的方法處理,作服務降級fallback8001fallback

業務類啟用

package com.shiwen.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.shiwen.entity.CommonResult;
import com.shiwen.entity.Payment;
import com.shiwen.service.PaymentService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;import java.util.concurrent.TimeUnit;/*** 支付表(Payment)表控制層** @author wangjie* @since 2020-09-27 17:19:14*/@RestController
@RequestMapping("payment")
public class PaymentController {/*** 服務對象*/@Autowiredprivate PaymentService paymentService;@Value("${}")private String serverPort;/*** 通過主鍵查詢單條數據** @param id 主鍵* @return 單條數據*/@ApiOperation(value = "根據id查詢數據")@GetMapping("select-one/{id}")public CommonResult selectOne(@PathVariable  Long id) {Payment payment = (id);return new CommonResult(200,"成功"+serverPort,payment);}/*** 增加*/@ApiOperation(value = "添加數據")@PostMapping("add")public CommonResult addPayment(@RequestBody Payment payment){boolean insert = (payment);if(insert==true){return new CommonResult(200,"插入成功人不輸"+serverPort,true);}else{return new CommonResult(500,"插入失敗"+serverPort,false);}}/*** 編寫超時程序*/@GetMapping("timeout")@HystrixCommand(fallbackMethod = "timeOutMethod",commandProperties = {@HystrixProperty(name = "",value = "3000") //三秒以內正常})public CommonResult timeOutMethods(){try {(5);} catch (InterruptedException e) {();}return new CommonResult(200,"超時服務",serverPort);}//兜底的方法public  CommonResult  timeOutMethod(){return new CommonResult(200,"系統占時繁忙請稍后重試",serverPort);}}

 啟動類添加@EnableHystrix

af57a76425cf07d9e52c4bddc349da61.png

 一旦調用服務方法失敗并拋出了錯誤信息后,會自動調用@HystrixCommand標注好的fallbackMethod調用類中的指定方法timeOutMethod圖示

7df6774ce2f8dc642804ab653136f9c7.png

?這樣寫一個方法一個兜底的方法代碼太過臃腫,通過注解@DefaultProperties(defaultFallback = "globalTimeOutMethod")配置全局的兜底方法

@RestController
@RequestMapping("/order")
@DefaultProperties(defaultFallback = "globalTimeOutMethod")
public class FeignController {@Autowiredprivate FeignService feignService;@GetMapping("/selete/{id}")public CommonResult getUserById(@PathVariable Long id){return feignService.selectOne(id);}@GetMapping("/timeout")//@HystrixCommand(defaultFallback = "orderTimeOutMethod",commandProperties = {@HystrixProperty(name = "",value = "1500")})@HystrixCommandpublic CommonResult getTimeOut(){return feignService.timeOutMethods();}public CommonResult orderTimeOutMethod(){return new CommonResult(200,"消費端兜底的方法","===================");}public CommonResult globalTimeOutMethod(){return new CommonResult(200,"消費端全局的兜底方法","=====================");}
}

  還有一個問題是兜底的方法和業務代碼混合在一起 以下的降級實在80消費端完成的

第一步創建

FeignServiceImpl類實現FeignService接口 編寫每一個方法對應的兜底內容
@Component
public class FeignServiceImpl  implements FeignService {@Overridepublic CommonResult selectOne(Long id) {return null;}@Overridepublic CommonResult timeOutMethods() {return new CommonResult(200,"我是一接口的形式實現兜底方法的","====================");}
}

第二步?FeignService 接口指名兜底的類fallback =

@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = )
public interface FeignService {@GetMapping("payment/select-one/{id}")CommonResult selectOne(@PathVariable("id") Long id);@GetMapping("payment/timeout")CommonResult timeOutMethods();  

第三步controller調用
package com.shiwen.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.shiwen.entity.CommonResult;
import com.shiwen.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author wangjie* @Title: FeignController* @Description: openfeign服務的調用* @company: 西安石文軟件有限公司* @date 2020/10/1411:13*/
@RestController
@RequestMapping("/order")
//@DefaultProperties(defaultFallback = "globalTimeOutMethod")
public class FeignController {@Autowiredprivate FeignService feignService;@GetMapping("/selete/{id}")public CommonResult getUserById(@PathVariable Long id){return feignService.selectOne(id);}@GetMapping("/timeout")//@HystrixCommand(defaultFallback = "orderTimeOutMethod",commandProperties = {@HystrixProperty(name = "",value = "1500")})//@HystrixCommandpublic CommonResult getTimeOut(){return feignService.timeOutMethods();}public CommonResult orderTimeOutMethod(){return new CommonResult(200,"消費端兜底的方法","===================");}public CommonResult globalTimeOutMethod(){return new CommonResult(200,"消費端全局的兜底方法","=====================");}
}

  yml編寫 開啟hystrix

feign:
hystrix:
enabled: true
測試依次啟動注冊中心,服務提供者,消費者
訪問http://localhost/order/timeout 當程序訪問超時就會走實現類了兜底

19beee51f679b3f522a5900abb639175.png

?服務熔斷

0c4d9c10060a84bcf270d3a7b4af1d6d.png

說白了就是程序不正常了,再這一段時間訪問并不會立馬崩掉,而是訪問失敗的次數大于設定的比率,就會跳閘,對服務實現降級,之后走的是兜底方法,當程序再次恢復正常時,并不會里面返回正確的數據。還是走的是兜底的方法,同樣需要在一段時間訪問成功的次數大于設定的比率,會再次跳閘。程序恢復正常(就是檢測到改節點微服務調用響應正常后,恢復調用鏈路)

服務熔斷需要配置的參數

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "",value = "true"), //是否開啟斷路器
@HystrixProperty(name = "",value = "10"), //請求次數
@HystrixProperty(name = "",value = "10000"), //時間范圍
@HystrixProperty(name = "",value = "60"), //失敗率達到多少后跳閘
})

package com.shiwen.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.shiwen.entity.CommonResult;
import com.shiwen.entity.Payment;
import com.shiwen.service.PaymentService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;import java.util.concurrent.TimeUnit;/*** 支付表(Payment)表控制層** @author wangjie* @since 2020-09-27 17:19:14*/@RestController
@RequestMapping("payment")
public class PaymentController {/*** 服務對象*/@Autowiredprivate PaymentService paymentService;@Value("${}")private String serverPort;/*** 通過主鍵查詢單條數據** @param id 主鍵* @return 單條數據*/@ApiOperation(value = "根據id查詢數據")@GetMapping("select-one/{id}")@HystrixCommand(fallbackMethod = "timeOutMethodAll",commandProperties = {@HystrixProperty(name = "",value = "true"), //是否開啟斷路器@HystrixProperty(name = "",value = "10"), //請求次數@HystrixProperty(name = "",value = "10000"), //時間范圍@HystrixProperty(name = "",value = "60"), //失敗率達到多少后跳閘})public CommonResult selectOne(@PathVariable  Long id) {if(id<){int i=10/0;return new CommonResult(200,"成功"+serverPort,"程序出錯了");}else {Payment payment = (id);return new CommonResult(200,"成功"+serverPort,payment);}}/*** 增加*/@ApiOperation(value = "添加數據")@PostMapping("add")public CommonResult addPayment(@RequestBody Payment payment){boolean insert = (payment);if(insert==true){return new CommonResult(200,"插入成功人不輸"+serverPort,true);}else{return new CommonResult(500,"插入失敗"+serverPort,false);}}/*** 編寫超時程序*/@GetMapping("timeout")public CommonResult timeOutMethods(){try {(6);} catch (InterruptedException e) {();}return new CommonResult(200,"超時服務",serverPort);}//兜底的方法public  CommonResult timeOutMethodAll(Long id){return new CommonResult(200,"系統占時繁忙請稍后重試",serverPort);}}

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

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

相關文章

ionic保存到mysql_ionic sqlite 存取數據封裝(兼容真機與webkit瀏覽器)

不管是真機還是H5&#xff0c;都有提供sqlite數據庫進行存儲數據。那么我們只要封裝好函數就能隨意調用了。如果只是存儲簡單的鍵值對形式的話&#xff0c;ionic官網也提供了一個兼容網頁的storage&#xff0c;https://ionicframework.com/docs/storage&#xff0c;但只能key/v…

sql plus 表的總記錄數是多少_直播回顧 | 億級并發絲毫不虛,TDSQL-SQL引擎是如何煉成的...

騰訊云數據庫國產數據庫專題線上技術沙龍正在火熱進行中&#xff0c;3月19日唐顥的分享已經結束&#xff0c;沒來得及參與的小伙伴不用擔心&#xff0c;以下就是直播的視頻和文字回顧。關注“騰訊云數據庫”公眾號&#xff0c;回復“0319唐顥”&#xff0c;即可下載直播分享PPT…

java plug機制_插件機制 - OpooPress - 基于 Java 的靜態博客生成器

插件機制通過插件機制可以很容易的擴展 OpooPress 博客系統的功能。 Plugin 定義如下public interface Plugin{/**** param registry*/void initialize(Registry registry);}Registry 接口定義如下&#xff1a;public interface Registry {Site getSite();void registerConvert…

運放放大倍數計算公式_19.運算放大器的特性與應用,不得不掌握的知識點(一)...

運算放大器&#xff0c;簡稱“運放”&#xff0c;是電力電子中最重要的器件之一&#xff0c;主要作用為&#xff1a;信號放大、信號運算、信號處理、波形的產生和變換。一、運算放大器的內部結構集成運算放大器內部結構集成運算放大器內部一般由四個單元組成&#xff0c;各單元…

java選項設置_java環境配置

javac無法執行檢查&#xff1a;看看java 相關的java相關路徑有沒有多余的符號&#xff0c;比如多出分號&#xff0c;逗號(筆者上面是正確的路徑展示形式)Win10下 Java環境變量配置首先&#xff0c;你應該已經安裝了 Java 的 JDK 了(如果沒有安裝JDK&#xff0c;請跳轉到此網址&…

teleport 組件的作用_人臉識別綜述! 覆蓋人臉檢測,預處理和特征表示三大核心組件!...

The Elements of End-to-end Deep Face Recognition: A Survey of Recent Advances 人臉識別是計算機視覺社區中最基礎和歷史悠久的話題之一。隨著深度卷積網絡和大尺度數據集發展&#xff0c;深度人臉識別取得極大進步并且應用到許多領域。給定一個自然圖像或者視頻幀作為輸入…

itunes未能連接到iphone_iTunes下載_蘋果iTunes官方下載「32位|64位」

iTunes是蘋果官方推出的Apple官方數字媒體播放與管理應用程序。蘋果iTunes官方下載中文版能將您所有的媒體文件和應用收藏導入iPad和iPhone&#xff0c;您還可以通過它購買應用、數字音樂、視頻、電視及游戲等等。iTunes是目前最專業的iPad和iPhone管理應用工具。本站提供蘋果i…

java短視頻上傳阿里云流程_短視頻上傳

啟動上傳前需要設置上傳回調&#xff0c;需要實現VODSVideoUploadCallback回調&#xff1a;vodsVideoUploadClient.uploadWithVideoAndImg(vodSessionCreateInfo, new VODSVideoUploadCallback() {Overridepublic void onUploadSucceed(String videoId, String imageUrl) {//上…

feko軟件_計算電磁學各種方法和電磁仿真軟件簡述

計算電磁學中有眾多不同的算法&#xff0c;如時域有限差分法(FDTD)、時域有限積分法(FITD)、有限元法(FE)、矩量法(MoM)、邊界元法(BEM)、 譜域法(SM)、傳輸線法(TLM)、模式匹配法(MM)、橫向諧振法(TRM)、線方法(ML)和解析法等等。在頻域&#xff0c;數值算法有&#xff1a;有限…

出租車管理系統java_基于jsp的出租車管理系統-JavaEE實現出租車管理系統 - java項目源碼...

基于jspservletpojomysql實現一個javaee/javaweb的出租車管理系統, 該項目可用各類java課程設計大作業中, 出租車管理系統的系統架構分為前后臺兩部分, 最終實現在線上進行出租車管理系統各項功能,實現了諸如用戶管理, 登錄注冊, 權限管理等功能, 并實現對各類出租車管理系統相…

cad常青藤插件_原來還有這么好用的CAD插件,半小時就能做完一張圖

作為一名優秀的設計師或者建筑師&#xff0c;如果你沒用過逆天的CAD插件&#xff0c;我覺得不行&#xff0c;所以下面小編就給大家推薦幾個非常好用的CAD插件&#xff0c;希望可以幫助大家大幅提升工作效率。接下來小編就帶大家一起看看吧&#xff01;1、天正建筑天正建筑顧名思…

java 停止線程播放音頻_Notification?播放?關閉?聲音----轉載

NotificationPlayer.java定義一個播放Notification聲音的player&#xff0c;本質上仍然是一個MediaPlayer&#xff0c;這個是多線程編程的很好的例子public class NotificationPlayer implements OnCompletionListener {//發送播放和停止的cmdprivate static final int PLAY 1…

java main是標識符嗎_main方法的認識 、通配符、java的注釋、java的符(標識符)【Java基礎】...

main方法的認識print()和println()的區別print()打印不換行println()打印并換行通配符\n換行符\t制表符都應用于控制臺\n換行\t以表格的形式顯示System.out.println("----------英雄排行榜------------");System.out.println("\t|編號\t|名字\t|戰力值\t|"…

對于半圓形的點擊區域該怎么做_十堰混合型塑膠跑道怎么選,橡膠跑道卷材型號...

河北邁弘體育設施有限公司為您詳細解讀hVgkXc十堰混合型塑膠跑道怎么選的相關知識與詳情&#xff0c;校園跑道、體育館田徑跑道等都是體育活動的首先場合。由于終年正在室外遭到風吹日曬&#xff0c;還要接受日常體育活動的摩擦、描寫、化學物量腐蝕或重物擠壓等因素&#xff0…

希望得到學術會議的及時回復該怎么說_張燁:在“選礦”博士的世界里,腳踏實地從來都不是說說而已!| 中南達人NO.188...

張燁資源加工與生物工程學院礦業工程2017級博士中南大學2019年大學生年度人物之一獲獎經歷(部分)2016年中南大學FMG獎勵金優秀學生獎2017年中南大學優秀畢業生2018年中南大學優秀學生2019年中南大學優秀學生博士研究生國家獎學金中南大學大學生年度人物2017-2019年博士一等學業…

java編寫一個集合類_Java集合類

數組是一種很常見的數據結構&#xff0c;開始接觸編程的時候多數程序都和數組相關。剛開始接觸Java時也是一直使用數組寫一些程序&#xff0c;后來越來越覺得數組這東西沒法滿足需求了&#xff0c;這時一位“前輩”對我說了一句&#xff1a;不會用集合類就等于沒學過Java。然后…

python 當前文件路徑獲取方式_Python獲取當前文件路徑

一. Python 獲取當前文件路徑方法2. sys.path[0]獲取文件當前工作目錄路徑(絕對路徑)sys.argv[0]|獲得模塊所在的路徑(由系統決定是否是全名)若顯示調用python指令&#xff0c;如python demo.py&#xff0c;會得到絕對路徑;若直接執行腳本&#xff0c;如./demo.py&#xff0c;會…

pdf不支持64位瀏覽器_4MLinux 31.0 發布,不支持32位

Zbigniew Konojacki宣布發布4MLinux 31.0&#xff0c;這是該項目極簡發行版的新穩定版本&#xff0c;專注于四個功能&#xff1a;維護(作為系統救援Live CD)&#xff0c;多媒體(用于播放視頻DVD和其他多媒體文件)&#xff0c;迷你服務器(使用inetd守護程序)和神秘的版本(提供幾…

java期末考試2013及答案_java筆試經典(題及答案)2013.doc

java筆試經典(題及答案)2013.doc Java筆試經典(基礎部分及答案和分析)1、一個“.java“源文件中是否可以包括多個類(不是內部類)&#xff1f;有什么限制&#xff1f;7答:可以包括多個類&#xff0c;但是最多只能有一個public修飾的類。2、Java有沒有goto?7答&#xff1a;java中…

datatables 行分組信息展開與折疊的功能實現_[LaTeX 嘗試] fancyvrb - 修復行引用的超鏈接跳轉位置

本文已加入專欄文章目錄&#xff0c;歸入「進階使用」文章系列。本文可以看作對這個發生于 2019 年 7 月中旬的 TeX-SX 上自問自答的展開說明。那個回答中避免了 python 的使用&#xff0c;而是利用 zref 宏包把位置信息以文本形式在 pdf 中呈現&#xff0c;好處是不用引入 pyt…