SpringCloud之Hystrix的詳細(xì)使用
1.概念
服務(wù)降級:服務(wù)器繁忙,請稍后再試,不讓客戶端等待,并立即返回一個友好的提示(一般發(fā)生在 程序異常,超時,服務(wù)熔斷觸發(fā)服務(wù)降級,線程池、信號量 打滿也會導(dǎo)致服務(wù)降級)
服務(wù)熔斷 : 達(dá)到最大服務(wù)訪問后,直接拒絕訪問,然后調(diào)用服務(wù)降級的方法并返回友好提示(如保險絲一樣)
服務(wù)限流 : 秒殺等高并發(fā)操作,嚴(yán)禁一窩蜂的過來擁擠,排隊進(jìn)入,一秒鐘N個,有序進(jìn)行
***一.服務(wù)降級***
2.不使用Hystrix的項目
大致的Service和Controller層如下
***************Controller*****************
package com.sky.springcloud.controller;
import com.sky.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
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
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverport;
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo_Ok(@PathVariable("id") Integer id){
String result = paymentService.paymentInfo_ok(id);
log.info("*****"+ result);
return result;
}
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
String result = paymentService.payment_Info_TimeOut(id);
}
*******************Service********************
package com.sky.springcloud.service;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class PaymentServiceImpl implements PaymentService{
@Override
public String paymentInfo_ok(Integer id) {
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_Ok. id:" + id + "\t" + "~~~~~";
public String payment_Info_TimeOut(Integer id) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut. id:" + id + "\t" + "~~~~~";在這種情況時,當(dāng)通過瀏覽器訪問 TimeOut這個方法,會三秒后返回結(jié)果,而當(dāng)訪問 OK 這個方法時,會直接返回結(jié)果(但是這是在訪問量很少的時候,一旦訪問量過多,訪問OK時也會出現(xiàn)延遲,這里可以使用Jmeter模擬兩萬個訪問量,如下)


使用 Jmeter 模擬后,再去訪問OK,會明顯出現(xiàn)加載的效果
3. 使用Hystrix
在主啟動類添加注解
@EnableHystrix
package com.sky.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@SpringBootApplication
@EnableEurekaClient //啟用Eureka
@EnableHystrix //啟用Hystrix
public class Payment8001 {
public static void main(String[] args) {
SpringApplication.run(Payment8001.class,args);
}
}在原有的基礎(chǔ)上,在Service層加上如下注解
@HystrixCommand(fallbackMethod = "payment_Info_TimeOutHandler",//當(dāng)服務(wù)降級時,調(diào)用payment_Info_TimeOutHandler方法
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",
value = "3000")//設(shè)置時間為3秒,超過三秒就為時間超限*****************改后的Service*******************
package com.sky.springcloud.service;
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{
@Override
public String paymentInfo_ok(Integer id) {
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_Ok. id:" + id + "\t" + "~~~~~";
}
@HystrixCommand(fallbackMethod = "payment_Info_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String payment_Info_TimeOut(Integer id) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// int a = 10 / 0;
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut. id:" + id + "\t" + "~~~~~";
}
public String payment_Info_TimeOutHandler(Integer id){
return "線程超時或異常 " + Thread.currentThread().getName();
}
}如上Service所示,如果再次訪問TimeOut需要等待五秒,但是Hystrix設(shè)置的超時時間為三秒,所以當(dāng)三秒后沒有結(jié)果就會服務(wù)降級,從而調(diào)用TimeOutHandler這個指定 的方法來執(zhí)行(或者有程序出錯等情況也會服務(wù)降級)
4. 全局的Hystrix配置
@DefaultProperties(defaultFallback = “Gloub_Test”)
package com.sky.springcloud.service;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
@Service
@DefaultProperties(defaultFallback = "Gloub_Test")
public class PaymentServiceImpl implements PaymentService{
@Override
@HystrixCommand
public String paymentInfo_ok(Integer id) {
int a = 10 / 0;
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_Ok. id:" + id + "\t" + "~~~~~";
}
@HystrixCommand(fallbackMethod = "payment_Info_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String payment_Info_TimeOut(Integer id) {
/* try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
return "線程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut. id:" + id + "\t" + "~~~~~";
public String payment_Info_TimeOutHandler(Integer id){
return "線程超時或異常 " + Thread.currentThread().getName();
public String Gloub_Test(){
return "走了全局的";
}如上Service所示,加了@HystrixCommand的方法里,
如果沒指定fallbackMethod 就會默認(rèn)去找全局的defaultFallback
這里 當(dāng)paymentInfo_ok 方法出錯時,會調(diào)用Gloub_Test方法
當(dāng)payment_Info_TimeOut出錯時,會調(diào)用payment_Info_TimeOutHandler方法
***二.服務(wù)熔斷***
1.熔斷機制概述
熔斷機制是應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機制,當(dāng)扇出鏈路的某個微服務(wù)出錯不可用或者響應(yīng)時間太長,會進(jìn)行服務(wù)的降級,進(jìn)而熔斷該節(jié)點微服務(wù)的調(diào)用,快速返回錯誤的相應(yīng)信息.當(dāng)檢測到該節(jié)點微服務(wù)調(diào)用相應(yīng)正常后,恢復(fù)調(diào)用鏈路.
2.項目中使用
在上面的基礎(chǔ)上,改寫Service和Controller(添加以下代碼)
//是否開啟服務(wù)熔斷(斷路器)
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
//服務(wù)請求的次數(shù)
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
//時間的窗口期
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
//當(dāng)失敗率達(dá)到多少后發(fā)生熔斷
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
******************Service*****************
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",
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(@PathVariable("id") Integer id){
if(id<0){
throw new RuntimeException("********** id不能為負(fù)");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t" + serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
return "id 不能為負(fù):" + id;
************Controller********************
@GetMapping("/payment/circuit/{id}")
String result = paymentService.PaymentCircuitBreaker(id);
log.info(result + "***********");
return result;如上所示,當(dāng)訪問paymentCircuitBreaker時,如果id小于零則會有一個運行錯誤,這時候就會通過服務(wù)降級來調(diào)用paymentCircuitBreaker_fallback方法,當(dāng)錯誤的次數(shù)達(dá)到60%的時候(自己設(shè)的),就會出現(xiàn)服務(wù)熔斷,這個時候再訪問id大于零的情況,也會發(fā)生服務(wù)降級,因為開起了服務(wù)熔斷,需要慢慢的恢復(fù)正常.
到此這篇關(guān)于SpringCloud之Hystrix的詳細(xì)使用的文章就介紹到這了,更多相關(guān)SpringCloud Hystrix使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴展,socket
這篇文章主要介紹了Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴展,socket的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java二維數(shù)組與動態(tài)數(shù)組ArrayList類詳解
這篇文章主要給大家介紹了關(guān)于Java二維數(shù)組與動態(tài)數(shù)組ArrayList類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot Scheduling定時任務(wù)的示例代碼
springBoot提供了定時任務(wù)的支持,通過注解簡單快捷,對于日常定時任務(wù)可以使用。本文詳細(xì)的介紹一下使用,感興趣的可以了解一下2021-08-08
淺談SpringCloud?Alibaba和SpringCloud的區(qū)別
這篇文章主要介紹了淺談SpringCloud?Alibaba和SpringCloud的區(qū)別,Spring?Cloud?Netflix框架也屬于Spring?Cloud,但是Netflix并不是由spring來進(jìn)行開發(fā)的,需要的朋友可以參考下2023-05-05
IDEA引MAVEN項目jar包依賴導(dǎo)入問題解決方法
這篇文章主要介紹了IDEA引MAVEN項目jar包依賴導(dǎo)入問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

