日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

快速入門 | 輕松掌握Hystrix實(shí)現(xiàn)資源隔離保護(hù)系統(tǒng)穩(wěn)定

來源: 責(zé)編: 時(shí)間:2023-11-09 09:14:57 331觀看
導(dǎo)讀先看下如下圖,兩個(gè)服務(wù)之間的調(diào)用 A服務(wù)調(diào)用另外一個(gè)B服務(wù)。圖片在這個(gè)圖當(dāng)中有個(gè)接口A需要調(diào)用另外一個(gè)服務(wù)的接口B。這里看似沒有什么問題。例如,本身A服務(wù)接口執(zhí)行邏輯需要5ms執(zhí)行完后再調(diào)用B服務(wù)接口的,調(diào)用B接口執(zhí)

先看下如下圖,兩個(gè)服務(wù)之間的調(diào)用 A服務(wù)調(diào)用另外一個(gè)B服務(wù)。MU528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片MU528資訊網(wǎng)——每日最新資訊28at.com

MU528資訊網(wǎng)——每日最新資訊28at.com

在這個(gè)圖當(dāng)中有個(gè)接口A需要調(diào)用另外一個(gè)服務(wù)的接口B。這里看似沒有什么問題。MU528資訊網(wǎng)——每日最新資訊28at.com

例如,本身A服務(wù)接口執(zhí)行邏輯需要5ms執(zhí)行完后再調(diào)用B服務(wù)接口的,調(diào)用B接口執(zhí)行完成需要4s,比如下面的下定單扣庫(kù)存的流程:MU528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片MU528資訊網(wǎng)——每日最新資訊28at.com

MU528資訊網(wǎng)——每日最新資訊28at.com

這里整個(gè)接口調(diào)用鏈執(zhí)行完成需要實(shí)際T=4s+5ms;MU528資訊網(wǎng)——每日最新資訊28at.com

當(dāng)有大量的請(qǐng)求調(diào)用時(shí)我們的所有線程都會(huì)被阻塞T的時(shí)間。本身Tomcat線程池的線程數(shù)量是有限的,這就會(huì)造成很多的客戶端只能等待,尤其是越是后來的請(qǐng)求等待的時(shí)間會(huì)越長(zhǎng),同時(shí)由于這一個(gè)接口把所有的tomcat線程全部占用完,導(dǎo)致了其他的所有服務(wù)不可用全部處于等待狀態(tài),從而會(huì)拖垮整個(gè)tomcat,而這種現(xiàn)象我們稱誒雪崩效應(yīng)。MU528資訊網(wǎng)——每日最新資訊28at.com

對(duì)于服務(wù)之間的調(diào)用我們也應(yīng)該能夠設(shè)置一個(gè)超時(shí)時(shí)間,不能讓其一直等待下去。當(dāng)超過了給定的時(shí)間后我們也能夠給予用戶一個(gè)響應(yīng),通過這種方式來避免這種級(jí)聯(lián)的故障。如上所述,當(dāng)整個(gè)A服務(wù)不可用的時(shí)候 這時(shí)候的B服務(wù)也就不可用了,這種現(xiàn)象被稱為雪崩效應(yīng)。MU528資訊網(wǎng)——每日最新資訊28at.com

雪崩效應(yīng)常見場(chǎng)景

  • 硬件故障:如服務(wù)器宕機(jī),機(jī)房斷電,光纖被挖斷等。
  • 流量激增:如異常流量,重試加大流量等。
  • 緩存穿透:一般發(fā)生在應(yīng)用重啟,所有緩存失效時(shí),以及短時(shí)間內(nèi)大量緩存失效時(shí)。大量的緩存不命中,使請(qǐng)求直擊后端服務(wù),造成服務(wù)提供者超負(fù)荷運(yùn)行,引起服務(wù)不可用。
  • 程序BUG:如程序邏輯導(dǎo)致內(nèi)存泄漏,JVM長(zhǎng)時(shí)間FullGC等。
  • 同步等待:服務(wù)間采用同步調(diào)用模式,同步等待造成的資源耗盡。

雪崩效應(yīng)應(yīng)對(duì)策略

針對(duì)造成雪崩效應(yīng)的不同場(chǎng)景,可以使用不同的應(yīng)對(duì)策略,沒有一種通用所有場(chǎng)景的策略,參考如下:MU528資訊網(wǎng)——每日最新資訊28at.com

  • 硬件故障:多機(jī)房容災(zāi)、異地多活等。
  • 流量激增:服務(wù)自動(dòng)擴(kuò)容、流量控制(限流、關(guān)閉重試)等。
  • 緩存穿透:緩存預(yù)加載、緩存異步加載等。
  • 程序BUG:修改程序bug、及時(shí)釋放資源等。
  • 同步等待:資源隔離、MQ解耦、不可用服務(wù)調(diào)用快速失敗等。資源隔離通常指不同服務(wù)調(diào)用采用不同的線程池;不可用服務(wù)調(diào)用快速失敗一般通過熔斷器模式結(jié)合超時(shí)機(jī)制實(shí)現(xiàn)。

在程序中我們能通過Hystrix來實(shí)現(xiàn)資源的隔離,保護(hù)我們的服務(wù),不至于導(dǎo)致整個(gè)tomcat服務(wù)不可用。MU528資訊網(wǎng)——每日最新資訊28at.com

Hystrix是Netflix開源的一款針對(duì)分布式系統(tǒng)的延遲和容錯(cuò)庫(kù),目的是用來隔離分布式服務(wù)故障。它提供線程和信號(hào)量隔離,以減少不同服務(wù)之間資源競(jìng)爭(zhēng)帶來的相互影響;提供優(yōu)雅降級(jí)機(jī)制;提供熔斷機(jī)制使得服務(wù)可以快速失敗,而不是一直阻塞等待服務(wù)響應(yīng),并能從中快速恢復(fù)。Hystrix通過這些機(jī)制來阻止級(jí)聯(lián)失敗并保證系統(tǒng)彈性、可用。通過下圖來理解:MU528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片MU528資訊網(wǎng)——每日最新資訊28at.com

也就是在調(diào)用B服務(wù)接口的時(shí)候我們放到另外的一個(gè)線程中去執(zhí)行,防止出現(xiàn)上面說的問題。MU528資訊網(wǎng)——每日最新資訊28at.com

接下來我們來通過程序代碼來看看如何使用hystrix。MU528資訊網(wǎng)——每日最新資訊28at.com

這里我們以調(diào)用訂單服務(wù)為例MU528資訊網(wǎng)——每日最新資訊28at.com

pom.xml加入依賴

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

方式1:

通過繼承HystrixCommandMU528資訊網(wǎng)——每日最新資訊28at.com

public class OrdersCommand extends HystrixCommand<Orders> {  private RestTemplate restTemplate ;  private Long id ;  public OrdersCommand(RestTemplate restTemplate, Long id) {    super(buildSetter()) ;    this.restTemplate = restTemplate ;    this.id = id ;  }  private static Setter buildSetter() {    comflix.hystrix.HystrixThreadPoolProperties.Setter threadPoolProp = comflix.hystrix.HystrixThreadPoolProperties.Setter() ;    threadPoolProp.withCoreSize(5)      .withKeepAliveTimeMinutes(5)      .withMaxQueueSize(Integer.MAX_VALUE)      .withQueueSizeRejectionThreshold(1000) ;    comflix.hystrix.HystrixCommandProperties.Setter commandProp = comflix.hystrix.HystrixCommandProperties.Setter() ;    commandProp.withCircuitBreakerEnabled(true)      .withExecutionTimeoutInMilliseconds(6000)      .withRequestCacheEnabled(true)      .withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD);    return Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("orders"))           .andCommandKey(HystrixCommandKey.Factory.asKey("getOrder"))           .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("order-pool"))           .andThreadPoolPropertiesDefaults(threadPoolProp)           .andCommandPropertiesDefaults(commandProp) ;  }  @Override  protected Orders run() throws Exception {    return restTemplate.getForObject("http://localhost:9810/orders/queryOrder/{1}", Orders.class, id);  }  @Override  protected Orders getFallback() {    return new Orders() ;  }  @Override  protected String getCacheKey() {    return "order-" + this.id ;  }}

這里我們實(shí)現(xiàn)了父類的getFallback方法MU528資訊網(wǎng)——每日最新資訊28at.com

該方法為當(dāng)服務(wù)調(diào)用失敗或者超時(shí)會(huì)被調(diào)用。MU528資訊網(wǎng)——每日最新資訊28at.com

這里通過buildSetter方法來構(gòu)建hystrix相關(guān)的配置。說明:MU528資訊網(wǎng)——每日最新資訊28at.com

threadPoolProp.withCoreSize(5)      .withKeepAliveTimeMinutes(5)      .withMaxQueueSize(Integer.MAX_VALUE)      .withQueueSizeRejectionThreshold(1000) ;

以上是對(duì)線程池的配置。MU528資訊網(wǎng)——每日最新資訊28at.com

其它設(shè)置:

RequestVolumeThreshold

HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(int)表示在滑動(dòng)窗口中,至少有多少個(gè)請(qǐng)求,才可能觸發(fā)斷路。Hystrix 經(jīng)過斷路器的流量超過了一定的閾值,才有可能觸發(fā)斷路。比如說,要求在 10s 內(nèi)經(jīng)過斷路器的流量必須達(dá)到 20 個(gè),而實(shí)際經(jīng)過斷路器的流量才 10 個(gè),那么根本不會(huì)去判斷要不要斷路。MU528資訊網(wǎng)——每日最新資訊28at.com

ErrorThresholdPercentage

HystrixCommandProperties.Setter().withCircuitBreakerErrorThresholdPercentage(int)表示異常比例達(dá)到多少,才會(huì)觸發(fā)斷路,默認(rèn)值是 50(%)。如果斷路器統(tǒng)計(jì)到的異常調(diào)用的占比超過了一定的閾值,比如說在 10s 內(nèi),經(jīng)過斷路器的流量達(dá)到了 30 個(gè),同時(shí)其中異常訪問的數(shù)量也達(dá)到了一定的比例,比如 60% 的請(qǐng)求都是異常(報(bào)錯(cuò) / 超時(shí) / reject),就會(huì)開啟斷路。MU528資訊網(wǎng)——每日最新資訊28at.com

SleepWindowInMilliseconds

HystrixCommandProperties.Setter().withCircuitBreakerSleepWindowInMilliseconds(int)斷路開啟,也就是由 close 轉(zhuǎn)換到 open 狀態(tài)(close -> open)。那么之后在 SleepWindowInMilliseconds 時(shí)間內(nèi),所有經(jīng)過該斷路器的請(qǐng)求全部都會(huì)被斷路,不調(diào)用后端服務(wù),直接走 fallback 降級(jí)機(jī)制。而在該參數(shù)時(shí)間過后,斷路器會(huì)變?yōu)?half-open 半開閉狀態(tài),嘗試讓一條請(qǐng)求經(jīng)過斷路器,看能不能正常調(diào)用。如果調(diào)用成功了,那么就自動(dòng)恢復(fù),斷路器轉(zhuǎn)為 close 狀態(tài)。MU528資訊網(wǎng)——每日最新資訊28at.com

EnabledHystrixCommandProperties.Setter().withCircuitBreakerEnabled(boolean)控制是否允許斷路器工作,包括跟蹤依賴服務(wù)調(diào)用的健康狀況,以及對(duì)異常情況過多時(shí)是否允許觸發(fā)斷路。默認(rèn)值是 true。MU528資訊網(wǎng)——每日最新資訊28at.com

ForceOpen

HystrixCommandProperties.Setter().withCircuitBreakerForceOpen(boolean)如果設(shè)置為 true 的話,直接強(qiáng)迫打開斷路器,相當(dāng)于是手動(dòng)斷路了,手動(dòng)降級(jí),默認(rèn)值是 false。MU528資訊網(wǎng)——每日最新資訊28at.com

ForceClosedHystrixCommandProperties.Setter().withCircuitBreakerForceClosed(boolean)MU528資訊網(wǎng)——每日最新資訊28at.com

如果設(shè)置為 true,直接強(qiáng)迫關(guān)閉斷路器,相當(dāng)于手動(dòng)停止斷路了,手動(dòng)升級(jí),默認(rèn)值是 false。MU528資訊網(wǎng)——每日最新資訊28at.com

參考:MU528資訊網(wǎng)——每日最新資訊28at.com

圖片圖片MU528資訊網(wǎng)——每日最新資訊28at.com

comflix.hystrix.HystrixCommandProperties.Setter commandProp = comflix.hystrix.HystrixCommandProperties.Setter() ;    commandProp.withCircuitBreakerEnabled(true)      .withExecutionTimeoutInMilliseconds(6000)      .withRequestCacheEnabled(true)      .withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD);

以上是對(duì)命令屬性的配置。MU528資訊網(wǎng)——每日最新資訊28at.com

withCircuitBreakerEnabled:控制是否允許斷路器工作,包括跟蹤依賴服務(wù)調(diào)用的健康狀況,以及對(duì)異常情況過多時(shí)是否允許觸發(fā)斷路。默認(rèn)值是 true。MU528資訊網(wǎng)——每日最新資訊28at.com

withExecutionTimeoutInMilliseconds:執(zhí)行超時(shí)時(shí)間的設(shè)置。如果一個(gè) command 運(yùn)行時(shí)間超過了設(shè)定的時(shí)長(zhǎng),那么就被認(rèn)為是 timeout,然后 Hystrix command 標(biāo)識(shí)為 timeout,同時(shí)執(zhí)行 fallback 降級(jí)邏輯。MU528資訊網(wǎng)——每日最新資訊28at.com

withExecutionIsolationStrategy:執(zhí)行隔離的策略,這里設(shè)置為線程。還可以設(shè)置為基于信號(hào)量的MU528資訊網(wǎng)——每日最新資訊28at.com

ExecutionIsolationStrategy.SEMAPHORE:一般如果并發(fā)量比較大的情況下我們用信號(hào)量,性能要好。如果并發(fā)量大你還用線程池,那么你該創(chuàng)建多少的線程呢?而過多的線程帶來了更多線程的切換而影響性能。MU528資訊網(wǎng)——每日最新資訊28at.com

return Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("orders"))   .andCommandKey(HystrixCommandKey.Factory.asKey("getOrder"))   .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("order-pool"))   .andThreadPoolPropertiesDefaults(threadPoolProp)   .andCommandPropertiesDefaults(commandProp) ;

withGroupKey:服務(wù)分組;比如這里調(diào)用訂單系統(tǒng)就是一個(gè)服務(wù)分組。模塊;MU528資訊網(wǎng)——每日最新資訊28at.com

andCommandKey:服務(wù)標(biāo)識(shí);比如這里訂單系統(tǒng)有一個(gè)獲取訂單信息服務(wù)。子模塊;MU528資訊網(wǎng)——每日最新資訊28at.com

andThreadPoolKey:線程池名稱;MU528資訊網(wǎng)——每日最新資訊28at.com

andThreadPoolPropertiesDefaults:線程池配置;MU528資訊網(wǎng)——每日最新資訊28at.com

andCommandPropertiesDefaults:命令屬性配置;MU528資訊網(wǎng)——每日最新資訊28at.com

示例:MU528資訊網(wǎng)——每日最新資訊28at.com

@GetMapping("/custom/{id}")public Object custom(@PathVariable Long id) {  HystrixRequestContext ctx = HystrixRequestContext.initializeContext() ;  try {    OrdersCommand command = new OrdersCommand(restTemplate, id) ;    System.out.println(Thread.currentThread().getName() + ": " + System.currentTimeMillis()) ;    Orders res = command.execute() ;  } finally {    ctx.shutdown() ;  }  return null ;}

注意:HystrixRequestContext ctx =HystrixRequestContext.initializeContext() ;這行代碼必須調(diào)用。MU528資訊網(wǎng)——每日最新資訊28at.com

方式2:

通過注解的方式。MU528資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class RemoteHystrixService {  @Resource  private RestTemplate restTemplate ;  /**   *  <p>   *    groupKey: 服務(wù)分組;比如這里調(diào)用訂單系統(tǒng)就是一個(gè)服務(wù)分組。模塊   *    commandKey: 服務(wù)標(biāo)識(shí);比如這里訂單系統(tǒng)有一個(gè)獲取訂單信息服務(wù)。子模塊   *    threadPoolKey: 線程池名稱;   *    threadPoolProperties:線程池配置   *  </p>   * @author 爺爺   * @param id   * @return Orders   */  @HystrixCommand(fallbackMethod = "defaultOrder",       groupKey = "orders",       commandKey = "getOrder",      threadPoolKey = "order-pool",      threadPoolProperties = {          @HystrixProperty(name = "coreSize", value = "10"),          @HystrixProperty(name = "keepAliveTimeMinutes", value = "5"),          @HystrixProperty(name = "maxQueueSize", value = "1000000"),          @HystrixProperty(name = "queueSizeRejectionThreshold", value = "1000")      },      commandProperties = {          @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),          @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "6000")      }    )  public Orders getOrder(Long id) {    System.out.println(Thread.currentThread() + ", start") ;    Orders res = restTemplate.getForObject("http://localhost:9810/orders/queryOrder/{1}", Orders.class, id);    System.out.println(Thread.currentThread() + ", end") ;    return res ;  }  public Orders defaultOrder(Long id) {    return new Orders() ;  }}

這里具體注解屬性的說明與方式1中 一一對(duì)應(yīng)。MU528資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17895-0.html快速入門 | 輕松掌握Hystrix實(shí)現(xiàn)資源隔離保護(hù)系統(tǒng)穩(wěn)定

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: DDD 與 CQRS 才是黃金組合,你覺得呢?

下一篇: 兩種基于時(shí)間窗口的限流器的簡(jiǎn)單實(shí)現(xiàn)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 芮城县| 扎鲁特旗| 曲沃县| 左云县| 宿松县| 丹寨县| 镶黄旗| 苗栗县| 衡南县| 全椒县| 盘锦市| 绥江县| 汾西县| 罗定市| 枣强县| 东城区| 白山市| 郁南县| 丹巴县| 错那县| 敦化市| 百色市| 青海省| 同仁县| 大足县| 崇信县| 理塘县| 江川县| 辉县市| 茂名市| 来凤县| 扶沟县| 泰兴市| 漾濞| 临江市| 甘孜| 滕州市| 永济市| 临沭县| 台北市| 周宁县|