最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理

 更新時(shí)間:2019年04月01日 16:11:22   作者:Yrion  
這篇文章主要介紹了springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言:目前我們的項(xiàng)目是微服務(wù)架構(gòu),基于dubbo框架,服務(wù)之間的調(diào)用是通過(guò)rpc調(diào)用的。剛開(kāi)始沒(méi)有任何問(wèn)題,項(xiàng)目運(yùn)行健康、良好。可是過(guò)了一段時(shí)間,線上總有人反應(yīng)查詢訂單失敗,等過(guò)了一段時(shí)間才能查到。這是怎么回事呢?打開(kāi)后臺(tái)的日志一看出現(xiàn)了一些RpcException和TimeOutException,原來(lái)是遠(yuǎn)程調(diào)用超時(shí)了,可能某個(gè)服務(wù)在請(qǐng)求的高發(fā)期訪問(wèn)數(shù)據(jù)庫(kù)異常,IO阻塞,返回接口異常了。后來(lái)這個(gè)問(wèn)題越來(lái)越頻繁,如何解決這個(gè)棘手的問(wèn)題呢?

一:Hystrix是什么?

1.1:基本解釋

Hystrix最開(kāi)始由Netflix(看過(guò)美劇的都知道,它是一個(gè)美劇影視制作的巨頭公司)開(kāi)源的,后來(lái)由Spring Cloud Hystrix基于這款框架實(shí)現(xiàn)了斷路器、線程隔離等一系列服務(wù)保護(hù)功能,該框架的目標(biāo)在于通過(guò)控制訪問(wèn)遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而延遲和故障提供更強(qiáng)大的容錯(cuò)能力。hystrix具備服務(wù)降級(jí)、服務(wù)熔斷、線程和信號(hào)隔離、請(qǐng)求緩存、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能。起到了微服務(wù)的保護(hù)機(jī)制,防止某個(gè)單元出現(xiàn)故障.從而引起依賴關(guān)系引發(fā)故障的蔓延,最終導(dǎo)致整個(gè)系統(tǒng)的癱瘓。

1.2:斷路器的概念

斷路器本身是一個(gè)開(kāi)關(guān)裝置,用在電路上保護(hù)線路過(guò)載,當(dāng)線路中有電器發(fā)生短路的時(shí)候?!皵嗦菲鳌蹦軌蚣皶r(shí)切斷故障,防止發(fā)生過(guò)載、發(fā)熱甚至起火等嚴(yán)重后果。當(dāng)分布式架構(gòu)中,斷路器模式起到的作用也是類(lèi)似的。當(dāng)某個(gè)服務(wù)發(fā)生故障的時(shí)候,通過(guò)斷路器的故障監(jiān)控向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的線程掛機(jī),無(wú)限等待。這樣就不會(huì)使線程因故障服務(wù)被長(zhǎng)時(shí)間占用不釋放,避免了故障在分布式系統(tǒng)中的蔓延。如下圖是現(xiàn)實(shí)中的斷路器,它是一個(gè)開(kāi)關(guān)裝置:

二:Hystrix解決超時(shí)問(wèn)題

2.1:?jiǎn)栴}

假設(shè)我們前端提供了用戶查詢訂單的功能,首先請(qǐng)求映射到OrderController,控制器通過(guò)調(diào)用服務(wù)orderService獲取訂單信息,前端傳過(guò)來(lái)兩個(gè)參數(shù):一個(gè)是訂單id,一個(gè)是用戶id,orderService需要通過(guò)用戶id調(diào)取用戶服務(wù)來(lái)獲取用戶的相關(guān)信息返回給訂單服務(wù)去組裝信息,假設(shè)這里是通過(guò)http請(qǐng)求的,我們有一個(gè)單獨(dú)的工程叫做:userService部署在其他的服務(wù)器上。但是這個(gè)服務(wù)器宕機(jī)了,這時(shí)候訂單服務(wù)調(diào)取用戶信息就失敗了,然后查詢訂單整個(gè)請(qǐng)求就失敗了!由一個(gè)服務(wù)的宕機(jī)就導(dǎo)致整個(gè)查詢都失敗了,牽一發(fā)而動(dòng)全身。流程見(jiàn)下圖:

2.2:使用Hystrix進(jìn)行服務(wù)降級(jí)

2.2.1:引入hystrix依賴 這里引入了spring-cloud-starter-netflix-hystrix,springboot的starter里面整合了hystrix

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>

    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>4.5.1</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

2.2.2:模擬訂單請(qǐng)求

首先通過(guò)OrderController映射/order請(qǐng)求,獲取前端傳入的參數(shù)orderId和useId,然后調(diào)用orderDetailService方法,

@RestController
public class OrderController {

  @Resource
  private OrderService orderService;


  /**
   * 獲取訂單信息
   *
   * @param orderNo
   * @return
   */
  @PostMapping("/order")
  public ResultVo<OrderDetail> getOrderInfo(@RequestParam("orderId") Long orderNo, @RequestParam("userId") Long userId) {

    OrderDetail orderDetail = orderService.orderDetailService(orderNo, userId);
    ResultVo resultVo = new ResultVo<>();
    resultVo.setCode(100);
    resultVo.setMessage("請(qǐng)求成功");
    resultVo.setData(orderDetail);
    return resultVo;
  }
}

2.2.3:訂單服務(wù)調(diào)取其他服務(wù)

這里引入了RestTemplate,它是一個(gè)spring封裝的http映射請(qǐng)求工具類(lèi),然后通過(guò)http請(qǐng)求訪問(wèn)url = "http://192.168.80.153:8070/user/getUser"獲取用戶名,將值給訂單對(duì)象。不過(guò)假如在這其中發(fā)生了調(diào)用異常,請(qǐng)求用戶服務(wù)異常的話,那么返回給前端就是一串空的訂單信息,導(dǎo)致用戶看到的訂單為空。在使用hystrix之后,可以用@HystrixCommand(fallbackMethod = "orderFallBack")注解,在fallbackMethod中指定回退的方法,這里必須注意在@HystrixCommand上的方法其指定的回調(diào)方法必須和原方法的參數(shù)保持一致,這里包括參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)順序。我們?cè)诨卣{(diào)用法中模擬去查詢緩存數(shù)據(jù),返回給訂單。有人又要問(wèn)了,如果查詢緩存服務(wù)器再異常呢?不排除這種可能性。如果是這樣的話,依然可以使用@HystrixCommand注解在回調(diào)方法中,再指定其他的回調(diào)方法:

@Service
public class OrderService {
  @Autowired
  private RestTemplate restTemplate;
  /**
   * 根據(jù)訂單id獲取訂單詳情
   *
   * @param orderId
   * @param userId
   * @return
   */
  @HystrixCommand(fallbackMethod = "orderFallBack")
  public OrderDetail orderDetailService(Long orderId, Long userId) {

    if (Objects.isNull(orderId)) {
      return null;
    }

    OrderDetail orderDetail = OrderDBSource.getOrderDB().get(orderId);
    //調(diào)用user服務(wù)
    final String url = "http://192.168.80.153:8070/user/getUser";
    String userName = "";
    ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, userId, String.class);
    String returnContent = responseEntity.getBody();
    if (Objects.nonNull(responseEntity) && StrUtil.isNotEmpty(returnContent)) {
      userName = returnContent;
    }
    if (ObjectUtil.isNotNull(orderDetail)){
      orderDetail.setUserName(userName);
    }
    return orderDetail;
  }
  /**
   * 異常調(diào)用的回調(diào)方法
   *
   * @return
   */
  public OrderDetail orderFallBack(Long orderId, Long userId) {
    OrderDetail orderDetail = OrderDBSource.getOrderCache().get(orderId);
    final String unknown = "未知用戶";
    orderDetail.setUserName(unknown);
    return orderDetail;
  }
}

2.3.4:模擬測(cè)試

為了方便測(cè)試,首先我們將請(qǐng)求服務(wù)暫時(shí)先注釋?zhuān)缓笥胮ostman測(cè)試看正常的返回應(yīng)該是這樣的,這里使用了備注為數(shù)據(jù)庫(kù)獲取的訂單,表明它沒(méi)有走回調(diào)方法,因?yàn)檫@里沒(méi)有訪問(wèn)用戶url獲取用戶信息,程序可以正常訪問(wèn)。我再放開(kāi)

加上獲取用戶服務(wù)的鏈接,實(shí)際上用戶服務(wù)是無(wú)法訪問(wèn)到的,訪問(wèn)的話就會(huì)超時(shí),超時(shí)會(huì)被hystrix捕捉到,然后走fallBack指定的方法,我們來(lái)測(cè)試一下,可以看到實(shí)際上走的是緩存中查詢到的訂單,可以看到用戶服務(wù)已經(jīng)成功的降級(jí)了,降級(jí)后的訂單信息雖然是緩存獲取到的,可能會(huì)存在延時(shí)等問(wèn)題(當(dāng)然只要維護(hù)好緩存就可以避免這個(gè)問(wèn)題)。但是比沒(méi)有任何數(shù)據(jù)帶來(lái)的用戶一點(diǎn)會(huì)更好!

三:Hystrix的流程

Hystrix實(shí)際上的工作原理是這樣的:通過(guò)command來(lái)解耦請(qǐng)求與返回操作,在具體的實(shí)例中就是,Hystrix會(huì)對(duì)依賴的服務(wù)進(jìn)行觀察,通過(guò)command.toObservable調(diào)用返回一個(gè)觀察的對(duì)象,同時(shí)發(fā)起一個(gè)事件,然后用Subscriber對(duì)接受到的事件進(jìn)行處理。在command命令發(fā)出請(qǐng)求后,它通過(guò)一系列的判斷,順序依次是緩存是否命中、斷路器是否打開(kāi)、線程池是否占滿,然后它才會(huì)開(kāi)始對(duì)我們編寫(xiě)的代碼進(jìn)行實(shí)際的請(qǐng)求依賴服務(wù)的處理,也就是Hystrix.run方法,如果在這其中任一節(jié)點(diǎn)出現(xiàn)錯(cuò)誤或者拋出異常,它都會(huì)返回到fallback方法進(jìn)行服務(wù)降級(jí)處理,當(dāng)降級(jí)處理完成之后,它會(huì)將結(jié)果返回給,際的調(diào)用者,經(jīng)過(guò)一系列流程處理的,它的具體工作流程如下:

四:總結(jié)

本篇博客講述了Hystrix是什么?然后解釋了Hystrix如何進(jìn)行服務(wù)降級(jí)處理以及簡(jiǎn)單的處理流程,講到的內(nèi)容是最為常用的功能,還有一些關(guān)于Hystrix的緩存、線程池的隔離技術(shù)等由于篇幅的原因,沒(méi)有詳細(xì)的講解到,不過(guò)作為一篇入門(mén)級(jí)的Hystrix教程博客是基本夠的。在實(shí)際的開(kāi)發(fā)中,如何保持服務(wù)的健壯性、服務(wù)的可用性、盡量的減少bug,提升用戶體驗(yàn)都是我們開(kāi)發(fā)者的使命,這條優(yōu)化和提升之路永遠(yuǎn)沒(méi)有盡頭,go ahead!

參考資料《spring cloud微服務(wù)實(shí)戰(zhàn)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring是怎么擴(kuò)展解析xml接口的

    Spring是怎么擴(kuò)展解析xml接口的

    這篇文章主要介紹了Spring是怎么擴(kuò)展解析xml接口的,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • SpringBoot自定義對(duì)象參數(shù)實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化

    SpringBoot自定義對(duì)象參數(shù)實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化

    SpringBoot 通過(guò)自定義對(duì)象參數(shù),可以實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化,并可以級(jí)聯(lián)封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • springMVC實(shí)現(xiàn)文件上傳和下載

    springMVC實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了springMVC實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JVM常量池的深入講解

    JVM常量池的深入講解

    這篇文章主要給大家介紹了關(guān)于JVM常量池的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java Collection 移除元素方法及注意事項(xiàng)

    Java Collection 移除元素方法及注意事項(xiàng)

    這篇文章主要介紹了Java Collection 移除元素方法及注意事項(xiàng),通過(guò)一個(gè)簡(jiǎn)單實(shí)例給大家講解,需要的朋友可以參考下
    2020-01-01
  • JAVA獲取rabbitmq消息總數(shù)過(guò)程詳解

    JAVA獲取rabbitmq消息總數(shù)過(guò)程詳解

    這篇文章主要介紹了JAVA獲取rabbitmq消息總數(shù)過(guò)程詳解,公司使用的是rabbitMQ,需要做監(jiān)控預(yù)警的job去監(jiān)控rabbitMQ里面的堆積消息個(gè)數(shù),如何使用rabbitMQ獲取監(jiān)控的隊(duì)列里面的隊(duì)列消息個(gè)數(shù)呢,需要的朋友可以參考下
    2019-07-07
  • springboot使用自定義注解實(shí)現(xiàn)aop切面日志

    springboot使用自定義注解實(shí)現(xiàn)aop切面日志

    這篇文章主要為大家詳細(xì)介紹了springboot使用自定義注解實(shí)現(xiàn)aop切面日志,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Jrebel啟動(dòng)失敗解決方案詳解

    Jrebel啟動(dòng)失敗解決方案詳解

    這篇文章主要介紹了Jrebel啟動(dòng)失敗解決方案詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring?Boot?整合持久層之Spring Data JPA

    Spring?Boot?整合持久層之Spring Data JPA

    在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn),O/R映射即將領(lǐng)域模型類(lèi)和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)
    2022-08-08
  • Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    在Java當(dāng)中synchronized關(guān)鍵字通常是用來(lái)標(biāo)記一個(gè)方法或者代碼塊。本文將通過(guò)示例為大家詳細(xì)介紹一下Synchronized的各種使用方法,需要的可以參考一下
    2022-08-08

最新評(píng)論

德惠市| 延津县| 新营市| 汤原县| 平潭县| 彰化县| 额尔古纳市| 蒲江县| 武平县| 江城| 遂溪县| 集贤县| 碌曲县| 商水县| 北安市| 牙克石市| 瓮安县| 古丈县| 阿拉善右旗| 兴文县| 策勒县| 玉环县| 南安市| 上杭县| 伊通| 安义县| 桓仁| 宜都市| 庐江县| 开封市| 建湖县| 承德市| 贵溪市| 时尚| 三穗县| 淳安县| 新和县| 开原市| 徐州市| 巴彦淖尔市| 怀来县|