欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析springcloud中的Hystrix

 更新時(shí)間:2021年01月24日 09:41:54   作者:MXC肖某某  
Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)源庫(kù),在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等。這篇文章主要介紹了springcloud中的Hystrix,需要的朋友可以參考下

一、簡(jiǎn)介

源碼地址:https://gitee.com/xiaocheng0902/my-cloud.git

1,定義

  Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)源庫(kù),在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等。Hystrix能夠保證在一個(gè)依賴出問(wèn)題的情況下,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障,以提高分布式系統(tǒng)的彈性。

  "斷路器"本身是一種開(kāi)關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無(wú)法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程不會(huì)被長(zhǎng)時(shí)間的、不必要地占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。

2,作用 

a)服務(wù)降級(jí)

  服務(wù)降級(jí)是從整個(gè)系統(tǒng)的負(fù)荷情況出發(fā)和考慮的,對(duì)某些負(fù)荷會(huì)比較高的情況,為了預(yù)防某些功能(業(yè)務(wù)場(chǎng)景)出現(xiàn)負(fù)荷過(guò)載或者響應(yīng)慢的情況,在其內(nèi)部暫時(shí)舍棄對(duì)一些非核心的接口和數(shù)據(jù)的請(qǐng)求,而直接返回一個(gè)提前準(zhǔn)備好的fallback(退路)錯(cuò)誤處理信息。這樣,雖然提供的是一個(gè)有損的服務(wù),但卻保證了整個(gè)系統(tǒng)的穩(wěn)定性和可用性

 b)服務(wù)熔斷

  服務(wù)熔斷的作用類似于我們家用的保險(xiǎn)絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時(shí)的情況時(shí),為了防止整個(gè)系統(tǒng)出現(xiàn)雪崩,暫時(shí)停止對(duì)該服務(wù)的調(diào)用。

 c)熔斷vs降級(jí)

3,使用依賴

<!--新增hystrix-->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
 <version>2.2.1.RELEASE</version>
</dependency>

二、服務(wù)降級(jí)

1,服務(wù)提供者(自身)

對(duì)應(yīng)源碼:cloud-provider-hystrix-payment8001

  在主啟動(dòng)類Application上注解

@EnableCircuitBreaker

  在service的方法中加入

//主方法
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = { //出現(xiàn)超時(shí),異常調(diào)用fallbackMethod方法
 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒鐘以內(nèi)就是正常的業(yè)務(wù)邏輯
})
public String paymentInfo_TimeOut(Integer id){
 int timeNumber = 5; //1 的時(shí)候?yàn)檎?zhí)行當(dāng)前方法
 //throw new RuntimeException(); //異常情況會(huì)直接跳過(guò)進(jìn)入paymentInfo_TimeOutHandler
 try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
 return "線程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"嗚嗚嗚"+" 耗時(shí)(秒)"+timeNumber;
}

//備選方法
public String paymentInfo_TimeOutHandler(Integer id){
 return "線程池:"+Thread.currentThread().getName()+" 系統(tǒng)繁忙, 請(qǐng)稍候再試 ,id: "+id+"\t"+"哭了哇嗚";
}

2,服務(wù)調(diào)用者(fegin消費(fèi)者)

對(duì)應(yīng)源碼:cloud-consumer-feign-hystrix-order80

  yaml文件中添加配置

feign:
 hystrix:
 enabled: true #如果處理自身的容錯(cuò)就開(kāi)啟。開(kāi)啟方式與生產(chǎn)端不一樣。
 client:
 config:
 default:
 connectTimeout: 5000 # feign 的超時(shí)設(shè)置
 readTimeout: 5000 #同時(shí)配置一下feign的讀取 超時(shí)
#超時(shí)時(shí)間配置,此處全局超時(shí)配置時(shí)間大于@HystrixProperty配置時(shí)間后,@HystrixProperty注解中的超時(shí)才生效
hystrix:
 command:
 default:
 execution:
 isolation:
  thread:
  timeoutInMilliseconds: 10000

  主啟動(dòng)類Application上加上注解

@EnableHystrix

  業(yè)務(wù)類controller中加入

//主方法
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
 @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="1500")//1.5秒鐘以內(nèi)就是正常的業(yè)務(wù)邏輯
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
 String result = paymentHystrixService.paymentInfo_TimeOut(id);
 return result;
}

//備用方法
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
 return "我是消費(fèi)者80,對(duì)付支付系統(tǒng)繁忙請(qǐng)10秒鐘后再試或者自己運(yùn)行出錯(cuò)請(qǐng)檢查自己,(┬_┬)";
}

3,全局服務(wù)降級(jí)(feign消費(fèi)端)

對(duì)應(yīng)源碼:cloud-consumer-feign-hystrix-order80

  解決主方法一個(gè)備用方法的代碼冗余。(源碼同上)

  yaml文件中添加配置

feign:
 hystrix:
 enabled: true #如果處理自身的容錯(cuò)就開(kāi)啟。開(kāi)啟方式與生產(chǎn)端不一樣。
 client:
 config:
 default:
 connectTimeout: 5000 # feign 的超時(shí)設(shè)置
 readTimeout: 5000 #同時(shí)配置一下feign的讀取 超時(shí)
#超時(shí)時(shí)間配置,此處全局超時(shí)配置時(shí)間大于@HystrixProperty配置時(shí)間后,@HystrixProperty注解中的超時(shí)才生效
hystrix:
 command:
 default:
 execution:
 isolation:
  thread:
  timeoutInMilliseconds: 10000

  主啟動(dòng)類Application上加上注解

@EnableHystrix

  業(yè)務(wù)類controller中編碼

@RestController
@DefaultProperties(defaultFallback="paymentGobalFallbackMethod", commandProperties = {
 //如果commandProperties沒(méi)有對(duì)應(yīng)的內(nèi)容就會(huì)走默認(rèn)的HystrixCommandProperties中的配置
 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")})
public class OrderHystrixController {

 @Resource
 private PaymentHystrixService paymentHystrixService;

 //主方法
 @GetMapping("/consumer/payment/hystrix/timeout/{id}")
 @HystrixCommand //標(biāo)識(shí)走全局的備用策略
 public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
 String result = paymentHystrixService.paymentInfo_TimeOut(id);
 return result;
 }

 //全局備用方法
 public String paymentGobalFallbackMethod() {
 return "Gobal全局備選方法,對(duì)象系統(tǒng)繁忙或者已經(jīng)down機(jī)了,請(qǐng)稍后再試";
 }

}

4,降級(jí)分離(feign消費(fèi)端)

對(duì)應(yīng)源碼:cloud-consumer-feign-hystrix-order80

  yaml文件配置

feign:
 hystrix:
 enabled: true #如果處理自身的容錯(cuò)就開(kāi)啟。開(kāi)啟方式與生產(chǎn)端不一樣

  feign調(diào)用的接口

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentHystrixFallbackServiceImpl.class) //配置對(duì)應(yīng)的fallback的類
public interface PaymentHystrixFallbackService {
 @GetMapping("/payment/hystrix/ok/{id}")
 public String paymentInfo_OK(@PathVariable("id") Integer id);

 @GetMapping("/payment/hystrix/timeout/{id}")
 public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}

  feign調(diào)用接口的實(shí)現(xiàn)類

/**
 * fallback類,用于承載整個(gè)類的降級(jí)處理
 */
@Component
public class PaymentHystrixFallbackServiceImpl implements PaymentHystrixFallbackService {
 @Override
 public String paymentInfo_OK(Integer id) {
 return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
 }

 @Override
 public String paymentInfo_TimeOut(Integer id) {
 return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
 }
}

  controller中正常調(diào)用即可

@Slf4j
@RestController
public class OrderHystrixControllerFallbackClass {

 @Resource
 private PaymentHystrixFallbackService paymentHystrixFallbackService;

 @Value("${server.port}")
 private String serverPort;

 @GetMapping("/consumer_all/payment/hystrix/ok/{id}")
 public String paymentInfo_OK(@PathVariable("id") Integer id) {
 String result = paymentHystrixFallbackService.paymentInfo_OK(id);
 log.info("*******result:" + result);
 return result;
 }

 @GetMapping("/consumer_all/payment/hystrix/timeout/{id}")
 public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
 String result = paymentHystrixFallbackService.paymentInfo_TimeOut(id);
 return result;
 }
}

三、服務(wù)熔斷

  熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。當(dāng)扇出鏈路的某個(gè)微服務(wù)出錯(cuò)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí),會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的響應(yīng)信息。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路。

1,實(shí)例(提供端)

源碼:cloud-provider-hystrix-payment8001

  啟動(dòng)類

@EnableCircuitBreaker //啟動(dòng)熔斷
@EnableEurekaClient
@SpringBootApplication
public class CloudHystrixPaymentApplicaiton8001{...}

  service

@Service
public class PaymentCircutBreakerService {
 //服務(wù)熔斷
 @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
  @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否開(kāi)啟斷路器
  @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //請(qǐng)求次數(shù)
  @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //時(shí)間范圍
  @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失敗率達(dá)到多少后跳閘
 })
 public String paymentCircuitBreaker(Integer id){
 if (id < 0){
  throw new RuntimeException("*****id 不能負(fù)數(shù)");
 }
 String serialNumber = IdUtil.simpleUUID();

 return Thread.currentThread().getName()+"\t"+"調(diào)用成功,流水號(hào):"+serialNumber;
 }
 public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
 return "id 不能負(fù)數(shù),請(qǐng)稍候再試,(┬_┬)/~~ id: " +id;
 }
}

  controller

//===服務(wù)熔斷
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
 String result = paymentCircutBreakerService.paymentCircuitBreaker(id);
 log.info("*******result:"+result);
 return result;
}

  測(cè)試

http://localhost:8001/payment/circuit/-1 //多次調(diào)用報(bào)錯(cuò)就會(huì)開(kāi)啟熔斷,此時(shí)再調(diào)用正確發(fā)現(xiàn)不會(huì)立馬返回正確結(jié)果
http://localhost:8001/payment/circuit/1

2,服務(wù)熔斷原理

a)熔斷類型

  熔斷打開(kāi):請(qǐng)求不在進(jìn)行調(diào)用當(dāng)前服務(wù),內(nèi)部設(shè)置始終一般為MTTR(平均故障處理時(shí)間),當(dāng)打開(kāi)時(shí)長(zhǎng)達(dá)到所設(shè)時(shí)鐘則進(jìn)入熔斷狀態(tài)。

  熔斷關(guān)閉:熔斷關(guān)閉不會(huì)對(duì)服務(wù)進(jìn)行熔斷。

  熔斷半開(kāi):部分請(qǐng)求根據(jù)規(guī)則調(diào)用當(dāng)前服務(wù),如果請(qǐng)求成功且符合規(guī)則則認(rèn)為當(dāng)前服務(wù)恢復(fù)正常,關(guān)閉熔斷。

b)斷路器開(kāi)啟條件

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
 @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否開(kāi)啟斷路器
 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //請(qǐng)求次數(shù)
 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //時(shí)間范圍
 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失敗率達(dá)到多少后跳閘
})

涉及到斷路器的是哪個(gè)重要參數(shù):快照時(shí)間窗口、請(qǐng)求總數(shù)閾值、錯(cuò)誤百分比閾值。
1)快照時(shí)間:斷路器確定是否打開(kāi)需要統(tǒng)計(jì)一些請(qǐng)求和錯(cuò)誤數(shù)據(jù),而統(tǒng)計(jì)的時(shí)間范圍就是快照時(shí)間窗,默認(rèn)為最近的10秒。
2)請(qǐng)求總數(shù)閾值:在快照時(shí)間窗內(nèi),必須滿足請(qǐng)求總數(shù)閾值才有資格熔斷。默認(rèn)為20,意味著在10秒內(nèi),如果該hystrix命令的調(diào)用總次數(shù)不足20次,即使所有的請(qǐng)求都超時(shí)或其他原因失敗,斷路器都不會(huì)打開(kāi)。
3)錯(cuò)誤百分比閾值:當(dāng)請(qǐng)求總數(shù)在快照時(shí)間窗內(nèi)超過(guò)閾值,比如發(fā)生了30次調(diào)用,如果在這30次調(diào)用中,有15次發(fā)生了超時(shí)異常,也就是超過(guò)50%的錯(cuò)誤百分比,在默認(rèn)設(shè)定50%閾值情況下,這時(shí)候就會(huì)將斷路器打開(kāi)。

c)斷路器開(kāi)啟后續(xù)

  1,再有請(qǐng)求調(diào)用的時(shí)候,將不會(huì)調(diào)用主邏輯,而是直接調(diào)用降級(jí)fallback。通過(guò)斷路器,實(shí)現(xiàn)了自動(dòng)地發(fā)現(xiàn)錯(cuò)誤并將降級(jí)邏輯切換為主邏輯,減少響應(yīng)延遲的效果。

  2,原來(lái)的主邏輯如何恢復(fù):當(dāng)斷路器打開(kāi),對(duì)主邏輯進(jìn)行熔斷之后,hystrix會(huì)啟動(dòng)一個(gè)休眠時(shí)間窗,在這個(gè)窗內(nèi),降級(jí)邏輯是臨時(shí)的成為主邏輯;當(dāng)休眠時(shí)間窗到期,斷路器會(huì)進(jìn)入半開(kāi)狀態(tài),釋放一次請(qǐng)求到原來(lái)的主邏輯上,如果此時(shí)請(qǐng)求正常返回,那么斷路器將繼續(xù)閉合,主邏輯恢復(fù),如果這次請(qǐng)求依然有問(wèn)題,斷路器繼續(xù)進(jìn)入打開(kāi)狀態(tài),休眠時(shí)間窗重新計(jì)時(shí)。

d)各種參數(shù)

HystrixCommand:

commandKey:用來(lái)標(biāo)識(shí)一個(gè) Hystrix 命令,默認(rèn)會(huì)取被注解的方法名。需要注意:Hystrix 里同一個(gè)鍵的唯一標(biāo)識(shí)并不包括 groupKey,建議取一個(gè)獨(dú)一二無(wú)的名字,防止多個(gè)方法之間因?yàn)殒I重復(fù)而互相影響。
groupKey:一組 Hystrix 命令的集合, 用來(lái)統(tǒng)計(jì)、報(bào)告,默認(rèn)取類名,可不配置。
threadPoolKey:用來(lái)標(biāo)識(shí)一個(gè)線程池,如果沒(méi)設(shè)置的話會(huì)取 groupKey,很多情況下都是同一個(gè)類內(nèi)的方法在共用同一個(gè)線程池,如果兩個(gè)共用同一線程池的方法上配置了同樣的屬性,在第一個(gè)方法被執(zhí)行后線程池的屬性就固定了,所以屬性會(huì)以第一個(gè)被執(zhí)行的方法上的配置為準(zhǔn)。
commandProperties:與此命令相關(guān)的屬性。
threadPoolProperties:與線程池相關(guān)的屬性,
observableExecutionMode:當(dāng) Hystrix 命令被包裝成 RxJava 的 Observer 異步執(zhí)行時(shí),此配置指定了 Observable 被執(zhí)行的模式,默認(rèn)是 ObservableExecutionMode.EAGER,Observable 會(huì)在被創(chuàng)建后立刻執(zhí)行,而 ObservableExecutionMode.EAGER模式下,則會(huì)產(chǎn)生一個(gè) Observable 被 subscribe 后執(zhí)行。我們常見(jiàn)的命令都是同步執(zhí)行的,此配置項(xiàng)可以不配置。
ignoreExceptions:默認(rèn) Hystrix 在執(zhí)行方法時(shí)捕獲到異常時(shí)執(zhí)行回退,并統(tǒng)計(jì)失敗率以修改熔斷器的狀態(tài),而被忽略的異常則會(huì)直接拋到外層,不會(huì)執(zhí)行回退方法,也不會(huì)影響熔斷器的狀態(tài)。
raiseHystrixExceptions:當(dāng)配置項(xiàng)包括 HystrixRuntimeException 時(shí),所有的未被忽略的異常都會(huì)被包裝成 HystrixRuntimeException,配置其他種類的異常好像并沒(méi)有什么影響。
fallbackMethod:方法執(zhí)行時(shí)熔斷、錯(cuò)誤、超時(shí)時(shí)會(huì)執(zhí)行的回退方法,需要保持此方法與 Hystrix 方法的簽名和返回值一致。
defaultFallback:默認(rèn)回退方法,當(dāng)配置 fallbackMethod 項(xiàng)時(shí)此項(xiàng)沒(méi)有意義,另外,默認(rèn)回退方法不能有參數(shù),返回值要與 Hystrix方法的返回值相同。

commandProperties:

線程隔離(Isolation)
execution.isolation.strategy: 配置請(qǐng)求隔離的方式,有 threadPool(線程池,默認(rèn))和 semaphore(信號(hào)量)兩種,信號(hào)量方式高效但配置不靈活,我們一般采用 Java 里常用的線程池方式。
execution.timeout.enabled:是否給方法執(zhí)行設(shè)置超時(shí),默認(rèn)為 true。
execution.isolation.thread.timeoutInMilliseconds:方法執(zhí)行超時(shí)時(shí)間,默認(rèn)值是 1000,即 1秒,此值根據(jù)業(yè)務(wù)場(chǎng)景配置。
execution.isolation.thread.interruptOnTimeout: execution.isolation.thread.interruptOnCancel:是否在方法執(zhí)行超時(shí)/被取消時(shí)中斷方法。需要注意在 JVM 中我們無(wú)法強(qiáng)制中斷一個(gè)線程,如果 Hystrix 方法里沒(méi)有處理中斷信號(hào)的邏輯,那么中斷會(huì)被忽略。
execution.isolation.semaphore.maxConcurrentRequests:默認(rèn)值是 10,此配置項(xiàng)要在 execution.isolation.strategy 配置為 semaphore 時(shí)才會(huì)生效,它指定了一個(gè) Hystrix 方法使用信號(hào)量隔離時(shí)的最大并發(fā)數(shù),超過(guò)此并發(fā)數(shù)的請(qǐng)求會(huì)被拒絕。信號(hào)量隔離的配置就這么一個(gè),也是前文說(shuō)信號(hào)量隔離配置不靈活的原因。
統(tǒng)計(jì)器(Metrics)
metrics.rollingStats.timeInMilliseconds:此配置項(xiàng)指定了窗口的大小,單位是 ms,默認(rèn)值是 1000,即一個(gè)滑動(dòng)窗口默認(rèn)統(tǒng)計(jì)的是 1s 內(nèi)的請(qǐng)求數(shù)據(jù)。
metrics.healthSnapshot.intervalInMilliseconds:它指定了健康數(shù)據(jù)統(tǒng)計(jì)器(影響 Hystrix 熔斷)中每個(gè)桶的大小,默認(rèn)是 500ms,在進(jìn)行統(tǒng)計(jì)時(shí),Hystrix 通過(guò) metrics.rollingStats.timeInMilliseconds / metrics.healthSnapshot.intervalInMilliseconds 計(jì)算出桶數(shù),在窗口滑動(dòng)時(shí),每滑過(guò)一個(gè)桶的時(shí)間間隔時(shí)就統(tǒng)計(jì)一次當(dāng)前窗口內(nèi)請(qǐng)求的失敗率。
metrics.rollingStats.numBuckets:Hystrix 會(huì)將命令執(zhí)行的結(jié)果類型都統(tǒng)計(jì)匯總到一塊,給上層應(yīng)用使用或生成統(tǒng)計(jì)圖表,此配置項(xiàng)即指定了,生成統(tǒng)計(jì)數(shù)據(jù)流時(shí)滑動(dòng)窗口應(yīng)該拆分的桶數(shù)。此配置項(xiàng)最易跟上面的 metrics.healthSnapshot.intervalInMilliseconds 搞混,認(rèn)為此項(xiàng)影響健康數(shù)據(jù)流的桶數(shù)。 此項(xiàng)默認(rèn)是 10,并且需要保持此值能被 metrics.rollingStats.timeInMilliseconds 整除。
metrics.rollingPercentile.enabled:是否統(tǒng)計(jì)方法響應(yīng)時(shí)間百分比,默認(rèn)為 true 時(shí),Hystrix 會(huì)統(tǒng)計(jì)方法執(zhí)行的 1%,10%,50%,90%,99% 等比例請(qǐng)求的平均耗時(shí)用以生成統(tǒng)計(jì)圖表。
metrics.rollingPercentile.timeInMilliseconds:統(tǒng)計(jì)響應(yīng)時(shí)間百分比時(shí)的窗口大小,默認(rèn)為 60000,即一分鐘。
metrics.rollingPercentile.numBuckets:統(tǒng)計(jì)響應(yīng)時(shí)間百分比時(shí)滑動(dòng)窗口要?jiǎng)澐值耐坝茫J(rèn)為6,需要保持能被metrics.rollingPercentile.timeInMilliseconds 整除。
metrics.rollingPercentile.bucketSize:統(tǒng)計(jì)響應(yīng)時(shí)間百分比時(shí),每個(gè)滑動(dòng)窗口的桶內(nèi)要保留的請(qǐng)求數(shù),桶內(nèi)的請(qǐng)求超出這個(gè)值后,會(huì)覆蓋最前面保存的數(shù)據(jù)。默認(rèn)值為 100,在統(tǒng)計(jì)響應(yīng)百分比配置全為默認(rèn)的情況下,每個(gè)桶的時(shí)間長(zhǎng)度為 10s = 60000ms / 6,但這 10s 內(nèi)只保留最近的 100 條請(qǐng)求的數(shù)據(jù)。
熔斷器(Circuit Breaker)
circuitBreaker.enabled:是否啟用熔斷器,默認(rèn)為 true;
circuitBreaker.forceOpen: circuitBreaker.forceClosed:是否強(qiáng)制啟用/關(guān)閉熔斷器,強(qiáng)制啟用關(guān)閉都想不到什么應(yīng)用的場(chǎng)景,保持默認(rèn)值,不配置即可。
circuitBreaker.requestVolumeThreshold:?jiǎn)⒂萌蹟嗥鞴δ艽翱跁r(shí)間內(nèi)的最小請(qǐng)求數(shù)。試想如果沒(méi)有這么一個(gè)限制,我們配置了 50% 的請(qǐng)求失敗會(huì)打開(kāi)熔斷器,窗口時(shí)間內(nèi)只有 3 條請(qǐng)求,恰巧兩條都失敗了,那么熔斷器就被打開(kāi)了,5s 內(nèi)的請(qǐng)求都被快速失敗。此配置項(xiàng)的值需要根據(jù)接口的 QPS 進(jìn)行計(jì)算,值太小會(huì)有誤打開(kāi)熔斷器的可能,值太大超出了時(shí)間窗口內(nèi)的總請(qǐng)求數(shù),則熔斷永遠(yuǎn)也不會(huì)被觸發(fā)。建議設(shè)置為 QPS * 窗口秒數(shù) * 60%。
circuitBreaker.errorThresholdPercentage:在通過(guò)滑動(dòng)窗口獲取到當(dāng)前時(shí)間段內(nèi) Hystrix 方法執(zhí)行的失敗率后,就需要根據(jù)此配置來(lái)判斷是否要將熔斷器打開(kāi)了。 此配置項(xiàng)默認(rèn)值是 50,即窗口時(shí)間內(nèi)超過(guò) 50% 的請(qǐng)求失敗后會(huì)打開(kāi)熔斷器將后續(xù)請(qǐng)求快速失敗。
circuitBreaker.sleepWindowInMilliseconds:熔斷器打開(kāi)后,所有的請(qǐng)求都會(huì)快速失敗,但何時(shí)服務(wù)恢復(fù)正常就是下一個(gè)要面對(duì)的問(wèn)題。熔斷器打開(kāi)時(shí),Hystrix 會(huì)在經(jīng)過(guò)一段時(shí)間后就放行一條請(qǐng)求,如果這條請(qǐng)求執(zhí)行成功了,說(shuō)明此時(shí)服務(wù)很可能已經(jīng)恢復(fù)了正常,那么會(huì)將熔斷器關(guān)閉,如果此請(qǐng)求執(zhí)行失敗,則認(rèn)為服務(wù)依然不可用,熔斷器繼續(xù)保持打開(kāi)狀態(tài)。此配置項(xiàng)指定了熔斷器打開(kāi)后經(jīng)過(guò)多長(zhǎng)時(shí)間允許一次請(qǐng)求嘗試執(zhí)行,默認(rèn)值是 5000。
其他(Context/Fallback)
requestCache.enabled:是否啟用請(qǐng)求結(jié)果緩存。默認(rèn)是 true,但它并不意味著我們的每個(gè)請(qǐng)求都會(huì)被緩存。緩存請(qǐng)求結(jié)果和從緩存中獲取結(jié)果都需要我們配置 cacheKey,并且在方法上使用 @CacheResult 注解聲明一個(gè)緩存上下文。
requestLog.enabled:是否啟用請(qǐng)求日志,默認(rèn)為 true。
fallback.enabled:是否啟用方法回退,默認(rèn)為 true 即可。
fallback.isolation.semaphore.maxConcurrentRequests:回退方法執(zhí)行時(shí)的最大并發(fā)數(shù),默認(rèn)是10,如果大量請(qǐng)求的回退方法被執(zhí)行時(shí),超出此并發(fā)數(shù)的請(qǐng)求會(huì)拋出 REJECTED_SEMAPHORE_FALLBACK 異常。

threadPoolProperties:

coreSize:核心線程池的大小,默認(rèn)值是 10,一般根據(jù) QPS * 99% cost + redundancy count 計(jì)算得出。
allowMaximumSizeToDivergeFromCoreSize:是否允許線程池?cái)U(kuò)展到最大線程池?cái)?shù)量,默認(rèn)為 false;
maximumSize:線程池中線程的最大數(shù)量,默認(rèn)值是 10,此配置項(xiàng)單獨(dú)配置時(shí)并不會(huì)生效,需要啟用 allowMaximumSizeToDivergeFromCoreSize 項(xiàng)。
maxQueueSize:作業(yè)隊(duì)列的最大值,默認(rèn)值為 -1,設(shè)置為此值時(shí),隊(duì)列會(huì)使用 SynchronousQueue,此時(shí)其 size 為0,Hystrix 不會(huì)向隊(duì)列內(nèi)存放作業(yè)。如果此值設(shè)置為一個(gè)正的 int 型,隊(duì)列會(huì)使用一個(gè)固定 size 的 LinkedBlockingQueue,此時(shí)在核心線程池內(nèi)的線程都在忙碌時(shí),會(huì)將作業(yè)暫時(shí)存放在此隊(duì)列內(nèi),但超出此隊(duì)列的請(qǐng)求依然會(huì)被拒絕。
queueSizeRejectionThreshold:由于 maxQueueSize 值在線程池被創(chuàng)建后就固定了大小,如果需要?jiǎng)討B(tài)修改隊(duì)列長(zhǎng)度的話可以設(shè)置此值,即使隊(duì)列未滿,隊(duì)列內(nèi)作業(yè)達(dá)到此值時(shí)同樣會(huì)拒絕請(qǐng)求。此值默認(rèn)是 5,所以有時(shí)候只設(shè)置了 maxQueueSize 也不會(huì)起作用。
keepAliveTimeMinutes:由上面的 maximumSize,我們知道,線程池內(nèi)核心線程數(shù)目都在忙碌,再有新的請(qǐng)求到達(dá)時(shí),線程池容量可以被擴(kuò)充為到最大數(shù)量,等到線程池空閑后,多于核心數(shù)量的線程還會(huì)被回收,此值指定了線程被回收前的存活時(shí)間,默認(rèn)為 2,即兩分鐘。

四、Hystrix dashboard

源碼:cloud-consumer-hystrix-dashboard9001

1,yaml文件

#指定端口號(hào)即可
server:
 port: 9001

2,application啟動(dòng)類

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

3,被監(jiān)控類(provider服務(wù))

pom文件

 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application啟動(dòng)類中添加

//SpringCloud升級(jí)方便使用hystrix的dashboard監(jiān)控
@Bean
public ServletRegistrationBean getServlet(){
 HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
 ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
 registrationBean.setLoadOnStartup(1);
 registrationBean.addUrlMappings("/hystrix.stream");
 registrationBean.setName("HystrixMetricsStreamServlet");
 return registrationBean;
}

4,啟動(dòng)并使用

訪問(wèn)地址:http://localhost:9001/hystrix

應(yīng)用說(shuō)明

到此這篇關(guān)于解析SpringCould中的Hystrix的文章就介紹到這了,更多相關(guān)SpringCould中的Hystrix內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論