自个儿有时间也会测一下永利官方网站

hystrix是微服务中用来做熔断、降级的工具。

第7楚辞 springboot + hystrix(一),springboothystrix

hystrix是微服务中用来做熔断、降级的工具。

功效:防止因为叁个服务的调用战败、调用延时导致多少个请求的封堵以及多少个请求的调用退步。

1、pom.xml(引入hystrix-core包)

永利官方网站 11 <!–
hystrix –> 2 <dependency> 3
<groupId>com.netflix.hystrix</groupId> 4
<artifactId>hystrix-core</artifactId> 5
<version>1.5.2</version> 6 </dependency> View Code

2、application.properties

永利官方网站 21 #hystrix
2 hystrix.timeoutInMillions = 3000 View Code

表达:设置hystrix属性,如上是”服务调用超时时间”,别的属性设置见:https://github.com/Netflix/Hystrix/wiki/Configuration

3、HyStrixProperties

永利官方网站 3 1 package
com.xxx.firstboot.hystrix; 2 3 import
org.springframework.boot.context.properties.ConfigurationProperties; 4
import org.springframework.stereotype.Component; 5 6 import
lombok.Getter; 7 import lombok.Setter; 8 9 @Getter @Setter 10 @Component
11 @ConfigurationProperties(prefix = “hystrix”) 12 public class
HyStrixProperties { 13 private int timeoutInMillions; 14 } View Code

4、MyHyStrixCommand

永利官方网站 4 壹 package
com.xxx.firstboot.hystrix; 2 3 import org.slf四j.Logger; 四 import
org.slf四j.LoggerFactory; 5 6 import com.netflix.hystrix.HystrixCommand;
柒 import com.squareup.okhttp.OkHttpClient; 八 import
com.squareup.okhttp.Request; 九 import com.squareup.okhttp.Response; 拾1一 public class MyHystrixCommand extends HystrixCommand<Response>
{ 1二 private static final Logger LOGGE索罗德 =
LoggerFactory.getLogger(MyHystrixCommand.class); 一3 private String url;
1四 一5 public MyHystrixCommand(Setter setter, String url) { 16super(setter); 一七 this.url = url; 1八 } 1玖 20 @Override 二一 protected
Response run() throws Exception { 22LOGGEBMWX三.info(“服务正被调用,当前线程:'{}'”,
Thread.currentThread().getName()); 贰3 Request request = new
Request.Builder().url(url).build(); 二4 return new
OkHttpClient().newCall(request).execute(); 二5 } 26 27 @Override 2捌public Response getFallback() { 29LOGGE君越.error(“服务调用败北,service:'{}'”); 30 return null; 31 } 3二 }
View Code

说明:

  • 该类是最要害的3个类。
  • 继承HystrixCommand<T>
  • 添加构造器,注意:不大概添加无参构造器,由此该类不可能作为spring的bean来进行政管理制
  • 程序初步时执行run(),当执行产生错误或超时时,执行getFallback()

5、HyStrixUtil

永利官方网站 5 1 package
com.xxx.firstboot.hystrix; 二 三 import
java.util.concurrent.ExecutionException; 4 import
java.util.concurrent.Future; 五 陆 import
org.springframework.beans.factory.annotation.Autowired; ⑦ import
org.springframework.stereotype.Component; 8 玖 import
com.netflix.hystrix.HystrixCommand.Setter; 10 import
com.netflix.hystrix.HystrixCommandGroupKey; 1一 import
com.netflix.hystrix.HystrixCommandKey; 12 import
com.netflix.hystrix.HystrixCommandProperties; 一3 import
com.squareup.okhttp.Response; 1四 1五 @Component 16 public class
HystrixUtil { 17 18 @Autowired 1九 private HyStrixProperties hp; 20 二1public Response execute(String hotelServiceName, 2二 String
hotelServiceMethodGetHotelInfo, 2叁 String url) throws
InterruptedException, ExecutionException { 贰肆 Setter setter =
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(hotelServiceName));//被调用服务
二伍setter.andCommandKey(HystrixCommandKey.Factory.asKey(hotelServiceMethodGetHotelInfo));//被调用服务的叁个被调用方法
二陆setter.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutIn米尔iseconds(hp.getTimeoutInMillions()));
27 return new MyHystrixCommand(setter, url).execute();//同步执行 28 //
Future<Response> future = new MyHystrixCommand(setter,
url).queue();//异步执行 2玖 // return future.get();//供给时收获 30 } 31
32 } View Code

说明:

  • hystrix的实施格局
    • 壹同施行:超时时间起作用
    • 异步执行:超时时间不起效能(一.四.0在此以前的版本,在调用get()的时候初叶计时起效果)
  • hystrix的隔断级别
    • HystrixCommandGroupKey:这些的名号设置为一个被调用的劳动,eg.hotelService,全体那一个服务下的艺术都用同二个线程池(前提是平素不配备ThreadPoolKey)
    • HystrixCommandKey:这么些称号常常是被调用服务的一个措施的名字(实际上正是被调用服务某三个controller中的3个对外方法),eg.getHotelInfo()
    • ThreadPoolKey:这么些用的很少,除非三个被调用服务中的有个别被调用方法快、有的被调用艺术慢,那样的话,就须求各自选拔二个ThreadPoolKey,为每八个格局单独分配线程池

6、application.properties

永利官方网站 61
service.hotel.name = hotelService 2 service.hotel.method.getHotelInfo =
getHotelInfo View Code

注脚:定义被调用服务的服务名和被调用方法名,当然服务名也足以应用被调用服务的controller的总结类名。

7、HystrixController

永利官方网站 7 1 package
com.xxx.firstboot.web; 2 3 import java.io.IOException; 4 import
java.util.concurrent.ExecutionException; 5 6 import
org.springframework.beans.factory.annotation.Autowired; 7 import
org.springframework.beans.factory.annotation.Value; 8 import
org.springframework.web.bind.annotation.RequestMapping; 9 import
org.springframework.web.bind.annotation.RequestMethod; 10 import
org.springframework.web.bind.annotation.RequestParam; 11 import
org.springframework.web.bind.annotation.RestController; 12 13 import
com.squareup.okhttp.Response; 14 import
com.xxx.firstboot.hystrix.HystrixUtil; 15 16 @RestController 17
@RequestMapping(“/hystrix”) 18 public class HystrixController { 19 20
@Value(“${service.hotel.url}”) 21 private String HOTEL_URL; 22 23
@Value(“${service.hotel.name}”) 24 private String hotelServiceName; 25
26 @Value(“${service.hotel.method.getHotelInfo}”) 27 private String
hotelServiceMethodGetHotelInfo; 28 29 @Autowired 30 private HystrixUtil
hystrixUtil; 31 32 @RequestMapping(value = “/firstHystrix”, method =
RequestMethod.GET) 33 public String getHotelInfo(@RequestParam(“id”) int
id, @RequestParam(“name”) String name) { 34 String url =
String.format(HOTEL_URL, id, name); 35 Response response = null; 36 try
{ 37 response = hystrixUtil.execute(hotelServiceName,
hotelServiceMethodGetHotelInfo, url); 38 if (response != null) { 39
return response.body().string(); 40 } 41 } catch (IOException e) { 42
e.printStackTrace(); 43 } catch (InterruptedException e) { 44
e.printStackTrace(); 45 } catch (ExecutionException e) { 46
e.printStackTrace(); 47 } finally { 48 if (response != null &&
response.body() != null) { 4九 try { 50 response.body().close();//
能源关闭 5一 } catch (IOException e) { 5贰 e.printStackTrace(); 伍三 } 5肆 }
5伍 } 56 return “获取酒店消息战败”; 57 } 5八 59 } View Code

说明:

  • 行使@value做属性注入,假诺大家是在consul上安排了application.properties内容,当修改了质量文件的故事情节后,该服务也非得重启,因为@value只读2遍(没测过,同事说的)
  • 行使spring的Environment实行注入,当修改了品质文件的始末后,服务不要求重启,会每5分钟再度刷三回(没测过,同事说的)
  • 利用boot创设一性情能收集类,如上边包车型客车HyStrixProperties类,不晓得是不是必要重启(没测过)

有测过的心上人和自己讲一下,作者有时光也会测一下。

上面是被调用服务的代码:

8、HotelController

永利官方网站 8 一@RestController 2 @RequestMapping(“/hotel”) 三@Api(“HotelController相关api”) 四 public class HotelController { 5@ApiOperation(“获取商旅Hotel音信:getHotelInfo”) 陆@RequestMapping(value=”/getHotelInfo”,method=RequestMethod.GET) 七 public
Hotel getHotelInfo(@RequestParam(“id”) int id, @RequestParam(“name”)
String name) { 八 // try { 九 //
TimeUnit.MILLISECONDS.sleep(两千);//用于测试超时 10 // } catch
(InterruptedException e) { 1一 // e.printStackTrace(); 12 // } 一3 return
new Hotel(id, name); 14 } 一伍 } View
Code

测试:运行被调用服务–>运转调用服务

 

参考:

http://blog.csdn.net/xiaoyu411502/article/details/50601687 官方的国语总括

https://stonetingxin.gitbooks.io/hystrix/content/ 基本上是官方的汉译

https://github.com/Netflix/Hystrix/wiki/Configuration hystrix配置介绍

http://blog.vicoder.com/hystrix-configuration/ 配置介绍

http://www.insaneprogramming.be/blog/2014/08/19/hystrix-spring-boot/ boot集成hystrix

http://www.bkjia.com/Javabc/1128132.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1128132.htmlTechArticle第十九章 springboot +
hystrix(1),springboothystrix
hystrix是微服务中用来做熔断、降级的工具。
效能:制止因为贰个服务的调用战败、调用延时…

作用:防止因为贰个劳务的调用失利、调用延时导致四个请求的短路以及三个请求的调用失败。

1、pom.xml(引入hystrix-core包)

永利官方网站 9永利官方网站 10

1          <!-- hystrix -->   
2         <dependency>
3             <groupId>com.netflix.hystrix</groupId>
4             <artifactId>hystrix-core</artifactId>
5             <version>1.5.2</version>
6         </dependency>

View Code

2、application.properties

永利官方网站 11永利官方网站 12

1 #hystrix
2 hystrix.timeoutInMillions = 3000

View Code

注解:设置hystrix属性,如上是”服务调用超时时间”,别的属性设置见:https://github.com/Netflix/Hystrix/wiki/Configuration

3、HyStrixProperties

永利官方网站 13永利官方网站 14

 1 package com.xxx.firstboot.hystrix;
 2 
 3 import org.springframework.boot.context.properties.ConfigurationProperties;
 4 import org.springframework.stereotype.Component;
 5 
 6 import lombok.Getter;
 7 import lombok.Setter;
 8 
 9 @Getter @Setter
10 @Component
11 @ConfigurationProperties(prefix = "hystrix")
12 public class HyStrixProperties {
13     private int timeoutInMillions;
14 }

View Code

4、MyHyStrixCommand

永利官方网站 15永利官方网站 16

 1 package com.xxx.firstboot.hystrix;
 2 
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 
 6 import com.netflix.hystrix.HystrixCommand;
 7 import com.squareup.okhttp.OkHttpClient;
 8 import com.squareup.okhttp.Request;
 9 import com.squareup.okhttp.Response;
10 
11 public class MyHystrixCommand extends HystrixCommand<Response> {
12     private static final Logger LOGGER = LoggerFactory.getLogger(MyHystrixCommand.class);
13     private String url;
14 
15     public MyHystrixCommand(Setter setter, String url) {
16         super(setter);
17         this.url = url;
18     }
19 
20     @Override
21     protected Response run() throws Exception {
22         LOGGER.info("服务正被调用,当前线程:'{}'", Thread.currentThread().getName());
23         Request request = new Request.Builder().url(url).build();
24         return new OkHttpClient().newCall(request).execute();
25     }
26 
27     @Override
28     public Response getFallback() {
29         LOGGER.error("服务调用失败,service:'{}'");
30         return null;
31     }
32 }

View Code

说明:

  • 此类是最要害的3个类。
  • 继承HystrixCommand<T>
  • 添加构造器,注意:不能够添加无参构造器,因而该类不可能作为spring的bean来拓展田管
  • 程序初始时执行run(),当执行发生错误或超时时,执行getFallback()

5、HyStrixUtil

永利官方网站 17永利官方网站 18

 1 package com.xxx.firstboot.hystrix;
 2 
 3 import java.util.concurrent.ExecutionException;
 4 import java.util.concurrent.Future;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Component;
 8 
 9 import com.netflix.hystrix.HystrixCommand.Setter;
10 import com.netflix.hystrix.HystrixCommandGroupKey;
11 import com.netflix.hystrix.HystrixCommandKey;
12 import com.netflix.hystrix.HystrixCommandProperties;
13 import com.squareup.okhttp.Response;
14 
15 @Component
16 public class HystrixUtil {
17 
18     @Autowired
19     private HyStrixProperties hp;
20     
21     public Response execute(String hotelServiceName, 
22                             String hotelServiceMethodGetHotelInfo, 
23                             String url) throws InterruptedException, ExecutionException {
24         Setter setter = Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(hotelServiceName));//被调用服务
25         setter.andCommandKey(HystrixCommandKey.Factory.asKey(hotelServiceMethodGetHotelInfo));//被调用服务的一个被调用方法
26         setter.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(hp.getTimeoutInMillions()));
27         return new MyHystrixCommand(setter, url).execute();//同步执行
28 //        Future<Response> future = new MyHystrixCommand(setter, url).queue();//异步执行
29 //        return future.get();//需要时获取
30     }
31 
32 }

View Code

说明:

  • hystrix的履行措施
    • 同台执行:超时时间起效果
    • 异步执行:超时时间不起效用(1.4.0在此之前的版本,在调用get()的时候起头计时起效果)
  • hystrix的隔开级别
    • HystrixCommandGroupKey:那些的称呼设置为3个被调用的服务,eg.hotelService,全数这几个服务下的办法都用同叁个线程池(前提是不曾配备ThreadPoolKey)
    • HystrixCommandKey:这些称呼平时是被调用服务的一个艺术的名字(实际上正是被调用服务某四个controller中的七个对外方法),eg.getHotelInfo()
    • ThreadPoolKey:这一个用的很少,除非3个被调用服务中的有个别被调用方法快、有的被调用艺术慢,那样的话,就要求各自使用3个ThreadPoolKey,为每2个办法单独分配线程池

6、application.properties

永利官方网站 19永利官方网站 20

1 service.hotel.name = hotelService
2 service.hotel.method.getHotelInfo = getHotelInfo 

View Code

证实:定义被调用服务的劳务名和被调用方法名,当然服务名也能够运用被调用服务的controller的简易类名。

7、HystrixController

永利官方网站 21永利官方网站 22

 1 package com.xxx.firstboot.web;
 2 
 3 import java.io.IOException;
 4 import java.util.concurrent.ExecutionException;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.beans.factory.annotation.Value;
 8 import org.springframework.web.bind.annotation.RequestMapping;
 9 import org.springframework.web.bind.annotation.RequestMethod;
10 import org.springframework.web.bind.annotation.RequestParam;
11 import org.springframework.web.bind.annotation.RestController;
12 
13 import com.squareup.okhttp.Response;
14 import com.xxx.firstboot.hystrix.HystrixUtil;
15 
16 @RestController
17 @RequestMapping("/hystrix")
18 public class HystrixController {
19 
20     @Value("${service.hotel.url}")
21     private String HOTEL_URL;
22 
23     @Value("${service.hotel.name}")
24     private String hotelServiceName;
25     
26     @Value("${service.hotel.method.getHotelInfo}")
27     private String hotelServiceMethodGetHotelInfo;
28     
29     @Autowired
30     private HystrixUtil hystrixUtil;
31 
32     @RequestMapping(value = "/firstHystrix", method = RequestMethod.GET)
33     public String getHotelInfo(@RequestParam("id") int id, @RequestParam("name") String name) {
34         String url = String.format(HOTEL_URL, id, name);
35         Response response = null;
36         try {
37             response = hystrixUtil.execute(hotelServiceName, hotelServiceMethodGetHotelInfo, url);
38             if (response != null) {
39                 return response.body().string();
40             }
41         } catch (IOException e) {
42             e.printStackTrace();
43         } catch (InterruptedException e) {
44             e.printStackTrace();
45         } catch (ExecutionException e) {
46             e.printStackTrace();
47         } finally {
48             if (response != null && response.body() != null) {
49                 try {
50                     response.body().close();// 资源关闭
51                 } catch (IOException e) {
52                     e.printStackTrace();
53                 }
54             }
55         }
56         return "获取酒店信息失败";
57     }
58 
59 }

View Code

说明:

  • 使用@value做属性注入,借使我们是在consul上配置了application.properties内容,当修改了质量文件的内容后,该服务也亟须重启,因为@value只读1次(没测过,同事说的)
  • 接纳spring的Environment实行注入,当修改了质量文件的内容后,服务不必要重启,会每5分钟再一次刷二回(没测过,同事说的)
  • 行使boot营造3个属性收集类,如上面包车型地铁HyStrixProperties类,不明了是还是不是要求重启(没测过)

有测过的朋友和自个儿讲一下,作者有时光也会测一下。

上边是被调用服务的代码:

8、HotelController

永利官方网站 23永利官方网站 24

 1 @RestController
 2 @RequestMapping("/hotel")
 3 @Api("HotelController相关api")
 4 public class HotelController {
 5     @ApiOperation("获取酒店Hotel信息:getHotelInfo")
 6     @RequestMapping(value="/getHotelInfo",method=RequestMethod.GET)
 7     public Hotel getHotelInfo(@RequestParam("id") int id, @RequestParam("name") String name) {
 8 //        try {
 9 //            TimeUnit.MILLISECONDS.sleep(2000);//用于测试超时
10 //        } catch (InterruptedException e) {
11 //            e.printStackTrace();
12 //        }
13         return new Hotel(id, name);
14     }
15 }

View Code

测试:运转被调用服务–>运行调用服务

 

参考:

http://blog.csdn.net/xiaoyu411502/article/details/50601687 官方的国语总括

https://stonetingxin.gitbooks.io/hystrix/content/ 基本上是法定的汉译

https://github.com/Netflix/Hystrix/wiki/Configuration hystrix配置介绍

http://blog.vicoder.com/hystrix-configuration/ 配置介绍

http://www.insaneprogramming.be/blog/2014/08/19/hystrix-spring-boot/ boot集成hystrix

相关文章