spring cloud 实践之hystrix注意事项
当我们写类似下面代码时
package demo1.demo1; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; @RestController public class TestRest { protected final static Logger logger = LoggerFactory.getLogger(TestRest.class); @HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "20000") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "64") }, threadPoolKey = "test1") @GetMapping("/testdemo1") public long getStringtest2() { logger.info("我收到了其他服务调用"); // 返回当前时间毫秒 来发现访问变化 return System.currentTimeMillis(); } }
如果方法之间有嵌套(注意不要像下面那样写)
package demo1.demo1; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; @RestController public class TestRest { protected final static Logger logger = LoggerFactory.getLogger(TestRest.class); @HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "20000") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "64") }, threadPoolKey = "test1") @GetMapping("/testdemo1") public long getStringtest2() { logger.info("我收到了其他服务调用"); // 返回当前时间毫秒 来发现访问变化 //报个异常试试 //int a=1/0; test(); return System.currentTimeMillis(); } @HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "20000") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "64") }, threadPoolKey = "test1") private void test(){ //code } }
因为使用了@HystrixCommand注解之后方法会放到隔离线程池中执行已经不再是tomcat或jetty等容器创建的web http线程池执行方法了,如果有两个可能会占用两个被隔离的线程执行方法。