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

Spring Boot中如何使用斷路器詳解

 更新時間:2018年08月26日 15:44:13   作者:只喝牛奶的殺手  
這篇文章主要給大家介紹了關(guān)于Spring Boot中如何使用斷路器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

隨著使用 Spring 進行開發(fā)的個人和企業(yè)越來越多,Spring 也慢慢從一個單一簡潔的小框架變成一個大而全的開源軟件,Spring 的邊界不斷的進行擴充,到了后來 Spring 幾乎可以做任何事情了,市面上主流的開源軟件、中間件都有 Spring 對應(yīng)組件支持,人們在享用 Spring 的這種便利之后,也遇到了一些問題。

斷路器本身是電路上的一種過載保護裝置,當(dāng)線路中有電器發(fā)生短路時,它能夠及時的切斷故障電路以防止嚴(yán)重后果發(fā)生。通過服務(wù)熔斷(也可以稱為斷路)、降級、限流(隔離)、異步RPC等手段控制依賴服務(wù)的延遲與失敗,防止整個服務(wù)雪崩。一個斷路器可以裝飾并且檢測了一個受保護的功能調(diào)用。根據(jù)當(dāng)前的狀態(tài)決定調(diào)用時被執(zhí)行還是回退。通常情況下,一個斷路器實現(xiàn)三種類型的狀態(tài):open、half-open以及closed:

  • closed狀態(tài)的調(diào)用被執(zhí)行,事務(wù)度量被存儲,這些度量是實現(xiàn)一個健康策略所必備的。
  • 倘若系統(tǒng)健康狀況變差,斷路器就處在open狀態(tài)。此種狀態(tài)下,所有調(diào)用會被立即回退并且不會產(chǎn)生新的調(diào)用。open狀態(tài)的目的是給服務(wù)器端回復(fù)和處理問題的時間。
  • 一旦斷路器進入一個open狀態(tài),超時計時器開始計時。如果計時器超時,斷路器切換到half-open狀態(tài)。在half-open狀態(tài)調(diào)用間歇性執(zhí)行以確定問題是否已解決。如果解決,狀態(tài)切換回closed狀態(tài)。


斷路器背后的基本思想非常簡單。將受保護的函數(shù)調(diào)用包裝在斷路器對象中,該對象監(jiān)視故障。一旦故障達到某個閾值,斷路器就會跳閘,并且所有對斷路器的進一步調(diào)用都會返回錯誤,而根本不會進行受保護的呼叫。通常,如果斷路器跳閘,您還需要某種監(jiān)控器警報。

如何快速使用Hystrix呢?下面跟著我1234……

1、加入@EnableCircuitBreaker注解

@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClientspublic class DroolsAppApplication {
 public static void main(String[] args) {
  SpringApplication.run(DroolsAppApplication.class, args);
 }
}

Hystrix整體執(zhí)行過程,首先,Command會調(diào)用run方法,如果run方法超時或者拋出異常,且啟用了降級處理,則調(diào)用getFallback方法進行降級;

 

2、使用@HystrixCommand注解

@HystrixCommand(fallbackMethod = "reliable")
 public String readingList() {
  for (int i = 0; i < 10; i++) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  return "jinpingmei";
 }

 public String reliable() {
  return "you love interesting book";
 }

3、添加引用

 compile("org.springframework.cloud:spring-cloud-starter-hystrix")
 compile('org.springframework.cloud:spring-cloud-starter-turbine')

4、設(shè)置超時時間

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

執(zhí)行結(jié)果如下:

 

正常應(yīng)該返回:

 

你不要喜歡jinpingmei,要喜歡有意思的書;這樣使用好舒服啊,@EnableCircuitBreaker這個注解就這么強大嗎?

HystrixCommandAspect 通過AOP攔截所有的@HystrixCommand注解的方法,從而使得@HystrixCommand能夠集成到Spring boot中,

HystrixCommandAspect的關(guān)鍵代碼如下:

1.方法 hystrixCommandAnnotationPointcut() 定義攔截注解HystrixCommand

 2.方法 hystrixCollapserAnnotationPointcut()定義攔截注解HystrixCollapser

 3.方法methodsAnnotatedWithHystrixCommand(…)通過@Around(…)攔截所有HystrixCommand和HystrixCollapser注解的方法。詳細(xì)見方法注解

@Aspect
public class HystrixCommandAspect {

 private static final Map<HystrixPointcutType, MetaHolderFactory> META_HOLDER_FACTORY_MAP;

 static {
  META_HOLDER_FACTORY_MAP = ImmutableMap.<HystrixPointcutType, MetaHolderFactory>builder()
    .put(HystrixPointcutType.COMMAND, new CommandMetaHolderFactory())
    .put(HystrixPointcutType.COLLAPSER, new CollapserMetaHolderFactory())
    .build();
 }

 @Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")

 public void hystrixCommandAnnotationPointcut() {
 }

 @Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)")
 public void hystrixCollapserAnnotationPointcut() {
 }

 @Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")
 public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
  Method method = getMethodFromTarget(joinPoint);
  Validate.notNull(method, "failed to get method from joinPoint: %s", joinPoint);
  if (method.isAnnotationPresent(HystrixCommand.class) && method.isAnnotationPresent(HystrixCollapser.class)) {
   throw new IllegalStateException("method cannot be annotated with HystrixCommand and HystrixCollapser " +
     "annotations at the same time");
  }
  MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));
  MetaHolder metaHolder = metaHolderFactory.create(joinPoint);
  HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);
  ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?
    metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();
  Object result;
  try {
   result = CommandExecutor.execute(invokable, executionType, metaHolder);
  } catch (HystrixBadRequestException e) {
   throw e.getCause();
  }
  return result;
 }

那么HystrixCommandAspect是如何初始化,是通過HystrixCircuitBreakerConfiguration實現(xiàn)的

@Configuration
public class HystrixCircuitBreakerConfiguration {

@Bean
public HystrixCommandAspect hystrixCommandAspect() {
return new HystrixCommandAspect();
}

那么誰來觸發(fā)HystrixCircuitBreakerConfiguration執(zhí)行初始化

先看spring-cloud-netflix-core**.jar包的spring.factories里有這段配置,是由注解EnableCircuitBreaker觸發(fā)

org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\
org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration

那么@EnableCircuitBreaker如何觸發(fā)HystrixCircuitBreakerConfiguration

通過源碼查看,此類通過@Import初始化EnableCircuitBreakerImportSelector類

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableCircuitBreakerImportSelector.class)
public @interface EnableCircuitBreaker {
}

EnableCircuitBreakerImportSelector是SpringFactoryImportSelector子類。此類在初始化后,會執(zhí)行selectImports(AnnotationMetadata metadata)的方法。此方法會根據(jù)注解啟動的注解(這里指@EnableCircuitBreaker)從spring.factories文件中獲取其配置需要初始化@Configuration類(這里是org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration),從而最終初始化HystrixCommandAspect 類,從而實現(xiàn)攔截HystrixCommand的功能

以上就是通過@EnableCircuitBreake可以開啟Hystrix的原理。Hystrix用到了觀察者模式AbstractCommand.executeCommandAndObserve()模式,下次我們來深入說一下觀察者模式。歡迎拍磚!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 基于XML的Spring聲明事務(wù)控制

    基于XML的Spring聲明事務(wù)控制

    這篇文章主要為大家詳細(xì)介紹了基于XML的Spring聲明事務(wù)控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決

    MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決

    mybatisplus是個很好用的插件,相信小伙伴們都知道,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實現(xiàn)分頁查詢與多條件查詢介紹及查詢過程中空值問題的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 詳解如何在Spring Boot啟動后執(zhí)行指定代碼

    詳解如何在Spring Boot啟動后執(zhí)行指定代碼

    這篇文章主要介紹了在Spring Boot啟動后執(zhí)行指定代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式

    SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式

    這篇文章主要介紹了SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java設(shè)計模式之橋模式(Bridge模式)介紹

    Java設(shè)計模式之橋模式(Bridge模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實現(xiàn)橋模式、Bridge模式在EJB中的應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 一看就懂 詳解JAVA泛型通配符T,E,K,V區(qū)別

    一看就懂 詳解JAVA泛型通配符T,E,K,V區(qū)別

    泛型從字面上理解,是指一個類、接口或方法支持多種類型,使之廣泛化、一般化和更加通用。通配符只有在修飾一個變量時會用到,使用它可方便地引用包含了多種類型的泛型;下面我們來深入了解一下吧
    2019-06-06
  • Java日期毫秒值和常見日期時間格式相互轉(zhuǎn)換方法

    Java日期毫秒值和常見日期時間格式相互轉(zhuǎn)換方法

    這篇文章主要給大家介紹了關(guān)于Java日期毫秒值和常見日期時間格式相互轉(zhuǎn)換的相關(guān)資料,在Java的日常開發(fā)中,會隨時遇到需要對時間處理的情況,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    這篇文章主要介紹了StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot自動裝配原理詳細(xì)解析

    SpringBoot自動裝配原理詳細(xì)解析

    這篇文章主要介紹了SpringBoot自動裝配原理詳細(xì)解析,一個對象交給Spring來管理的三種方式 @Bean @Compoment @Import,
    @Bean主要在@Configuration中,通過方法進行注入相關(guān)的Bean,@Compoent與@Service歸為一類,在類上加注入對應(yīng)的類,需要的朋友可以參考下
    2024-01-01
  • 高效的java版排列組合算法

    高效的java版排列組合算法

    這篇文章主要為大家詳細(xì)介紹了高效的java版排列組合算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論

尚志市| 淳化县| 彭州市| 界首市| 安龙县| 定远县| 浪卡子县| 舞钢市| 罗田县| 苍梧县| 泰安市| 剑河县| 吉安县| 会昌县| 武平县| 如东县| 高雄县| 施秉县| 登封市| 道真| 永德县| 贡嘎县| 万年县| 沭阳县| 孝义市| 尼勒克县| 奎屯市| 荔浦县| 鄂伦春自治旗| 周口市| 英超| 来凤县| 罗江县| 浑源县| 汉寿县| 前郭尔| 石首市| 波密县| 潞城市| 苍溪县| 赞皇县|