深入Spring Boot:快速集成Dubbo + Hystrix

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

背景

Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能。

Dubbo是Alibaba開源的,目前國內最流行的java rpc框架。

本文介紹在spring應用里,怎么把Dubbo和Hystrix結合起來使用。

Spring Boot應用

生成dubbo集成spring boot的應用

?

配置spring-cloud-starter-netflix-hystrix

spring boot官方提供了對hystrix的集成,直接在pom.xml里加入依賴:

1

2

3

4

5

<dependency>

????<groupId>org.springframework.cloud</groupId>

????<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

????<version>1.4.4.RELEASE</version>

</dependency>

然后在Application類上增加@EnableHystrix來啟用hystrix starter:

1

2

3

@SpringBootApplication

@EnableHystrix

public class ProviderApplication {

配置Provider端

在Dubbo的Provider上增加@HystrixCommand配置,這樣子調用就會經過Hystrix代理。

1

2

3

4

5

6

7

8

9

10

11

12

@Service(version = "1.0.0")

public class HelloServiceImpl implements HelloService {

????@HystrixCommand(commandProperties = {

????????????????????@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),

????????????????????@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") })

????@Override

????public String sayHello(String name) {

????????// System.out.println("async provider received: " + name);

????????// return "annotation: hello, " + name;

????????throw new RuntimeException("Exception to show hystrix enabled.");

????}

}

配置Consumer端

對于Consumer端,則可以增加一層method調用,并在method上配置@HystrixCommand。當調用出錯時,會走到fallbackMethod = "reliable"的調用里。

1

2

3

4

5

6

7

8

9

10

@Reference(version = "1.0.0")

private HelloService demoService;

?

@HystrixCommand(fallbackMethod = "reliable")

public String doSayHello(String name) {

????return demoService.sayHello(name);

}

public String reliable(String name) {

????return "hystrix fallback value";

}

通過上面的配置,很簡單地就完成了Spring Boot里Dubbo + Hystrix的集成。

傳統Spring Annotation應用

Demo地址

傳統spring annotation應用的配置其實也很簡單,和spring boot應用不同的是:

  1. 顯式配置Spring AOP支持:@EnableAspectJAutoProxy
  2. 顯式通過@Configuration配置HystrixCommandAspect?Bean。

1

2

3

4

5

6

7

8

9

10

11

12

@Configuration

@EnableDubbo(scanBasePackages = "com.alibaba.dubbo.samples.annotation.action")

@PropertySource("classpath:/spring/dubbo-consumer.properties")

@ComponentScan(value = {"com.alibaba.dubbo.samples.annotation.action"})

@EnableAspectJAutoProxy

static public class ConsumerConfiguration {

?

????@Bean

????public HystrixCommandAspect hystrixCommandAspect() {

????????return new HystrixCommandAspect();

????}

}

?

Hystrix集成Spring AOP原理

在上面的例子里可以看到,Hystrix對Spring的集成是通過Spring AOP來實現的。下面簡單分析下實現。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

@Aspect

public class HystrixCommandAspect {

????@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 {

????????????if (!metaHolder.isObservable()) {

????????????????result = CommandExecutor.execute(invokable, executionType, metaHolder);

????????????} else {

????????????????result = executeObservable(invokable, executionType, metaHolder);

????????????}

????????} catch (HystrixBadRequestException e) {

????????????throw e.getCause() != null ? e.getCause() : e;

????????} catch (HystrixRuntimeException e) {

????????????throw hystrixRuntimeExceptionToThrowable(metaHolder, e);

????????}

????????return result;

????}

  1. HystrixCommandAspect里定義了兩個注解的AspectJ Pointcut:@HystrixCommand,?@HystrixCollapser。所有帶這兩個注解的spring bean都會經過AOP處理
  2. @Around?AOP處理函數里,可以看到Hystrix會創建出HystrixInvokable,再通過CommandExecutor來執行

spring-cloud-starter-netflix-hystrix的代碼分析

  1. @EnableHystrix?引入了@EnableCircuitBreaker@EnableCircuitBreaker引入了EnableCircuitBreakerImportSelector

    1

    2

    3

    4

    5

    6

    7

    @EnableCircuitBreaker

    public @interface EnableHystrix {

    }

    ?

    @Import(EnableCircuitBreakerImportSelector.class)

    public @interface EnableCircuitBreaker {

    }

  2. EnableCircuitBreakerImportSelector繼承了SpringFactoryImportSelector<EnableCircuitBreaker>,使spring加載META-INF/spring.factories里的EnableCircuitBreaker聲明的配置在META-INF/spring.factories里可以找到下面的配置,也就是引入了HystrixCircuitBreakerConfiguration

    1

    2

    org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\

    org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration

  3. HystrixCircuitBreakerConfiguration里可以發現創建了HystrixCommandAspect

    1

    2

    3

    4

    5

    6

    7

    @Configuration

    public class HystrixCircuitBreakerConfiguration {

    ?

    ????@Bean

    ????public HystrixCommandAspect hystrixCommandAspect() {

    ????????return new HystrixCommandAspect();

    ????}

可見spring-cloud-starter-netflix-hystrix實際上也是創建了HystrixCommandAspect來集成Hystrix。

另外spring-cloud-starter-netflix-hystrix里還有metrics, health, dashboard等集成。

總結

  • 對于dubbo provider的@Service是一個spring bean,直接在上面配置@HystrixCommand即可
  • 對于dubbo consumer的@Reference,可以通過加一層簡單的spring method包裝,配置@HystrixCommand即可
  • Hystrix本身提供HystrixCommandAspect來集成Spring AOP,配置了@HystrixCommand@HystrixCollapser的spring method都會被Hystrix處理

歡迎學Java和大數據的朋友們加入java架構交流: 855835163
加群鏈接:https://jq.qq.com/?_wv=1027&k=5dPqXGI
群內提供免費的架構資料還有:Java工程化、高性能及分布式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階干貨的免費直播講解 ?可以進來一起學習交流哦
直播課堂地址:https://ke.qq.com/course/260263?flowToken=1007014

轉載于:https://my.oschina.net/u/3959468/blog/3013486

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252280.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ2333 [SCOI2011]棘手的操作 【離線 + 線段樹】

題目 有N個節點&#xff0c;標號從1到N&#xff0c;這N個節點一開始相互不連通。第i個節點的初始權值為a[i]&#xff0c;接下來有如下一些操作&#xff1a; U x y: 加一條邊&#xff0c;連接第x個節點和第y個節點 A1 x v: 將第x個節點的權值增加v A2 x v: 將第x個節點所在的連通…

opencv圖像仿射變換和普通旋轉

背景&#xff1a;今天需要對程序生成的圖像進行旋轉90度和下采樣操作&#xff0c;當然還有改變圖像類型的操作&#xff0c;就是把原來.png的圖像轉換為.jpg的圖像&#xff0c;主要是我目前使用libharu庫&#xff0c;無法成功從本地加載png圖像到pdf中去&#xff0c;不得不使用j…

討厭麻煩的ora 01722無效數字

webservice開發過程中&#xff0c;數據庫由原來的oracle改為現在的sql server。然后重新調試&#xff0c;結果報出ora 01722無效數字的錯誤。 由于連接oracle數據庫的時候并沒有問題&#xff0c;所以一開始我以為是數據庫不同&#xff0c;導致部分數據類型差異&#xff0c;&…

CSS樣式:覆蓋規則

規則一&#xff1a;由于繼承而發生樣式沖突時&#xff0c;最近祖先獲勝。 CSS的繼承機制使得元素可以從包含它的祖先元素中繼承樣式&#xff0c;考慮下面這種情況: <html><head><title>rule 1</title><style>body {color:black;}p {color:blue;}…

try{}里有一個 return 語句,那么緊跟在這個 try 后的 finally {}里的 code 會 不會被執行,什么時候被執行,在 return 前還是后?...

這是一道面試題&#xff0c;首先finally{}里面的code肯定是會執行的&#xff0c;至于在return前還是后&#xff0c; 看答案說的是在return后執行&#xff0c;我覺得不對&#xff0c;百度了一下&#xff0c;有說return前的&#xff0c;有說return后的&#xff0c;還有return中間…

相機和鏡頭選型需要注意哪些問題

背景&#xff1a; 最近需要優于項目需求需要對工業相機和鏡頭進行選型&#xff0c;于是我就開啟的學習相機之旅&#xff0c;雖然我一直在做機器視覺方向&#xff0c;但是我對相機的了解還是很少&#xff0c;我想正好趁這次機會好好學習一下。如果有錯誤的觀點請指正。 一、相…

響應式網頁布局 - W3Schools How-Tos 01

W3Schools教學系列 W3Schools是知名的網頁設計&#xff0f;前端開發教學網站&#xff0c;不僅提供HTML、CSS、JavaScript等的詳盡教學&#xff0c;還可以把它當作說明文件&#xff08;Documents&#xff09;。有經驗的前端或多或少已經接觸過這個網站&#xff0c;因為它經常出現…

正則表達式,終極使用!3個工具,搞定一切

文章前提&#xff0c;本人。不會正則的不論什么語法&#xff0c;僅僅懂一點正則的概念。本人從未自己寫過正則&#xff0c;都是網上收羅進行改動的。相同。沒有時間去研究正則。 可是為了方便&#xff0c;入手了幾個工具。 如今就為大家一一展示。 第一個&#xff0c;regexBuil…

iOS 在tableview的側滑事件里執行tableView.selectRow無效的解決辦法

很奇怪的問題&#xff0c;在執行默認選中一個cell的時候&#xff0c;突然發現這句話不起作用了 &#xff08;我的場景是&#xff1a;當前cell側滑刪除后&#xff0c;默認選中上一個cell&#xff09; 搞了半天&#xff0c;終于發現罪魁禍首竟然是因為&#xff1a;這句話寫在了側…

VS2017 C++工程 執行python腳本

我解決了哪怕很小的一個問題&#xff0c;我也想記錄下來來見證我的經歷。 背景&#xff1a; 一、使用libhuru庫生成pdf報告 最近參與一些測試工作&#xff0c;希望測試結束后能夠根據測試得到的數據和圖像自動生成測試報告&#xff0c;最開始調研到了生成報告的庫有libharu和…

標準正弦波變頻電源調制方式的實現

目前變頻電源正不斷向規模化、專業化、智能化、精細化方向發展。變頻電源的技術隨著工業電器電子制造的興起而不斷得到重視和發展。其中,中港揚以正弦脈SPWM為核心變頻電源系統電路便是一個很好的代表。純硬件電路在焊接電路上比較復雜&#xff0c;但是調節出來的SPWM波形比較完…

Jmeter教程索引貼

Jmeter教程索引貼 新的一年即將到來&#xff0c;不知不覺2015年自己在Jmeter方面總結的文章有十幾篇&#xff0c;在此匯總一下&#xff0c;順便也算是個總結吧。2016年&#xff0c;繼續學習技術&#xff0c;總結&#xff0c;寫文章。 一、基礎部分&#xff1a; 使用Jmeter進行h…

類與接口(二)java的四種內部類詳解

引言 內部類&#xff0c;嵌套在另一個類的里面&#xff0c;所以也稱為 嵌套類; 內部類分為以下四種&#xff1a; 靜態內部類成員內部類局部內部類匿名內部類一、靜態內部類 靜態內部類&#xff1a; 一般也稱”靜態嵌套類“&#xff0c;在類中用static聲明的內部類。 因為是stat…

單例設計模式和多線程

單例設計模式 單例&#xff1a;整個項目中&#xff0c;有某個類或者某些特殊的類&#xff0c;屬于該類的對象只能建立一個。 #include<iostream> using namespace std;class MyCAS { private:MyCAS(){}private:static MyCAS *m_instance;public:static MyCAS *GetInstanc…

運行imgui例程

背景&#xff1a;目前在做一個視覺測試系統&#xff0c;需要做一個界面&#xff0c;將相機獲取的圖像&#xff0c;以及測試過程中的數據呈現在界面上&#xff0c;在我印象里&#xff0c;做界面就用qt吧&#xff0c;直到這個月真要開始做界面了&#xff0c;我的領導給我建議用im…

性能測試總結(三)--工具選型篇

性能測試總結(三)--工具選型篇 本篇文章主要簡單總結下性能測試工具的原理以及如何選型。性能測試和功能測試不同&#xff0c;性能測試的執行是基本功能的重復和并發&#xff0c;需要模擬多用戶&#xff0c;在性能測試執行時需要監控指標參數&#xff0c;同時性能測試的結果不是…

創建一個最簡單的imgui測試用例

在上一篇文章中&#xff0c;我們初步認識了一下imgui,并且成功運行了他提供的demo。這只是開始學習imgui的第一步&#xff0c;在實際使用時&#xff0c;我們需要將imgui應用到自己的工程中去&#xff0c;所以你需要具備將imgui加到你工程中去的能力&#xff0c;簡單起見&#x…

idea中maven的setting.xml的配置

2019獨角獸企業重金招聘Python工程師標準>>> <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

ref和out區別總結

ref&#xff1a;是必需要先初始化才能用,但調用時可以對它什么也不做.out&#xff1a;可以不初始化也能用,但調用時一定要對其賦值(即使已經初始化的也要賦值,哪怕是賦一個和原來一樣的值).轉載于:https://www.cnblogs.com/gjnsmallworld/p/7216206.html

繼 承(面向對象特征之一)

1&#xff1a;成員變量。 當子父類中出現一樣的屬性時&#xff0c;子類類型的對象&#xff0c;調用該屬性&#xff0c;值是子類的屬性值。 如果想要調用父類中的屬性值&#xff0c;需要使用一個關鍵字&#xff1a;super This&#xff1a;代表是本類類型的對象引用。 Super&…