Spring Boot 集成 Hystrix
2018-08-02 05:53:43来源:博客园 阅读 ()
续:
《Hystrix介绍》
《Hystrix是如何工作的》
《SpringCloud学习笔记(3)——Hystrix》
Hystrix使用
1 package com.cjs.example; 2 3 import com.netflix.hystrix.HystrixCommand; 4 import com.netflix.hystrix.HystrixCommandGroupKey; 5 6 public class CommandHelloWorld extends HystrixCommand<String> { 7 8 private String name; 9 10 public CommandHelloWorld(HystrixCommandGroupKey group, String name) { 11 super(group); 12 this.name = name; 13 } 14 15 public CommandHelloWorld(Setter setter, String name) { 16 super(setter); 17 this.name = name; 18 } 19 20 @Override 21 protected String run() throws Exception { 22 if ("Alice".equals(name)) { 23 throw new RuntimeException("出错了"); 24 } 25 return "Hello, " + name; 26 } 27 28 @Override 29 protected String getFallback() { 30 return "Failure, " + name; 31 } 32 33 }
1 package com.cjs.example; 2 3 import com.netflix.hystrix.HystrixCommand; 4 import com.netflix.hystrix.HystrixCommandGroupKey; 5 import com.netflix.hystrix.HystrixCommandProperties; 6 import com.netflix.hystrix.HystrixThreadPoolProperties; 7 import org.junit.Test; 8 import rx.Observable; 9 import rx.Observer; 10 11 import java.util.concurrent.ExecutionException; 12 import java.util.concurrent.Future; 13 14 import static org.junit.Assert.*; 15 import static org.junit.Assert.assertEquals; 16 17 public class CommandHelloWorldTest { 18 19 @Test 20 public void testSync() { 21 HystrixCommandGroupKey hystrixCommandGroupKey = HystrixCommandGroupKey.Factory.asKey("ExampleGroup"); 22 CommandHelloWorld command = new CommandHelloWorld(hystrixCommandGroupKey, "World"); 23 String result = command.execute(); 24 assertEquals("Hello, World", result); 25 } 26 27 @Test 28 public void testAsync() throws ExecutionException, InterruptedException { 29 HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("ExampleGroup"); 30 assertEquals("Hello, Jack", new CommandHelloWorld(groupKey, "Jack").queue().get()); 31 assertEquals("Hello, Rose", new CommandHelloWorld(groupKey, "Rose").queue().get()); 32 33 CommandHelloWorld command = new CommandHelloWorld(groupKey, "Cheng"); 34 Future<String> future = command.queue(); 35 String result = future.get(); 36 assertEquals("Hello, Cheng", result); 37 38 // blocking 39 Observable<String> observable = new CommandHelloWorld(groupKey, "Lucy").observe(); 40 assertEquals("Hello, Lucy", observable.toBlocking().single()); 41 42 // non-blocking 43 Observable<String> observable2 = new CommandHelloWorld(groupKey, "Jerry").observe(); 44 observable2.subscribe(new Observer<String>() { 45 @Override 46 public void onCompleted() { 47 System.out.println("completed"); 48 } 49 50 @Override 51 public void onError(Throwable throwable) { 52 throwable.printStackTrace(); 53 } 54 55 @Override 56 public void onNext(String s) { 57 System.out.println("onNext: " + s); 58 } 59 }); 60 } 61 62 @Test 63 public void testFail() throws ExecutionException, InterruptedException { 64 HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("Group2"); 65 assertEquals("Failure, Alice", new CommandHelloWorld(groupKey,"Alice").execute()); 66 assertEquals("Failure, Alice", new CommandHelloWorld(groupKey,"Alice").queue().get()); 67 } 68 69 @Test 70 public void testProp() { 71 HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("Group3"); 72 73 HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter() 74 .withCoreSize(10) 75 .withMaximumSize(10); 76 77 HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter() 78 .withCircuitBreakerEnabled(true) 79 .withExecutionTimeoutInMilliseconds(100); 80 81 HystrixCommand.Setter setter = HystrixCommand.Setter.withGroupKey(groupKey); 82 setter.andThreadPoolPropertiesDefaults(threadPoolProperties); 83 setter.andCommandPropertiesDefaults(commandProperties); 84 85 assertEquals("Hello, Cheng", new CommandHelloWorld(setter, "Cheng").execute()); 86 87 } 88 }
Spring Boot中使用Hystrix
1. Maven依赖
2. 使用@HystrixCommand注解
1 package com.cjs.example; 2 3 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 4 import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; 5 import org.apache.commons.lang.StringUtils; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RestController; 8 9 @RestController 10 @RequestMapping("/greet") 11 public class GreetController { 12 13 @HystrixCommand(fallbackMethod = "onError", 14 commandProperties = { 15 @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"), 16 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"), 17 @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), 18 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2")}, 19 threadPoolProperties = { 20 @HystrixProperty(name = "coreSize", value = "5"), 21 @HystrixProperty(name = "maximumSize", value = "5"), 22 @HystrixProperty(name = "maxQueueSize", value = "10") 23 }) 24 @RequestMapping("/sayHello") 25 public String sayHello(String name) { 26 try { 27 Thread.sleep(200); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 return "Hello, " + name; 32 } 33 34 @HystrixCommand 35 @RequestMapping("/sayHi") 36 public String sayHi(String name) { 37 if (StringUtils.isBlank(name)) { 38 throw new RuntimeException("name不能为空"); 39 } 40 return "Good morning, " + name; 41 } 42 43 /** 44 * 如果fallback方法的参数和原方法参数个数不一致,则会出现FallbackDefinitionException: fallback method wasn't found 45 */ 46 public String onError(String name) { 47 return "Error!!!" + name; 48 } 49 50 }
3. Hystrix配置
1 package com.cjs.example; 2 3 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 4 import com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect; 5 import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; 6 import org.springframework.boot.web.servlet.ServletContextInitializer; 7 import org.springframework.boot.web.servlet.ServletRegistrationBean; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 11 import javax.servlet.Servlet; 12 13 @Configuration 14 public class HystrixConfig { 15 16 /** 17 * A {@link ServletContextInitializer} to register {@link Servlet}s in a Servlet 3.0+ container. 18 */ 19 @Bean 20 public ServletRegistrationBean hystrixMetricsStreamServlet() { 21 return new ServletRegistrationBean(new HystrixMetricsStreamServlet(), "/hystrix.stream"); 22 } 23 24 /** 25 * AspectJ aspect to process methods which annotated with {@link HystrixCommand} annotation. 26 * 27 * {@link HystrixCommand} annotation used to specify some methods which should be processes as hystrix commands. 28 */ 29 @Bean 30 public HystrixCommandAspect hystrixCommandAspect() { 31 return new HystrixCommandAspect(); 32 } 33 34 }
4. hystrix-dashboard
http://localhost:7979/hystrix-dashboard/
参考
https://github.com/Netflix/Hystrix/wiki/Configuration
https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-metrics-event-stream
https://github.com/Netflix-Skunkworks/hystrix-dashboard
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash