• Spring Boot 集成 Hystrix


    续:

    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

  • 相关阅读:
    真理
    使用C#调用QC的接口
    如何让asp.net应用程序定时自动执行代码
    对话
    科学●哲学●艺术●恶搞
    避免asp.net程序session过期的一个另类方法
    醉翁之意不在酒
    测试团队的新兴职位:测试设计师
    1和0的世界
    名词解释:高阻态,上拉电阻
  • 原文地址:https://www.cnblogs.com/mrchenzheng/p/12165710.html
Copyright © 2020-2023  润新知