一、Hystrix项目实践
1、在Cinema影院工程中增加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2、配置属性
server: port: 8301 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ management: endpoints: web: exposure: exclude: "*" spring: application: name: cinema-service datasource: url: jdbc:mysql://127.0.0.1:3306/springclouddeep?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=UTC username: root password: 123456 filters: log4j, wall, mergeState mybatis-plus: mapper-locations: classpath*:com/example/springclouddeep/**/xml/*Mapper.xml global-config: id-type: 0 db-column-underline: false refresh-mapper: true
3、增加注解
4、对方法配置Hystrix
ignoreExceptions的配置CommonServiceException,当抛出CommonServiceException,不做降级处理。
@HystrixCommand(fallbackMethod = "fallbackMethod", commandProperties = { @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"), @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value= "1000"), @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "1"), @HystrixProperty(name = "maxQueueSize", value = "10"), @HystrixProperty(name = "keepAliveTimeMinutes", value = "1000"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "8"), @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"), @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1500") },ignoreExceptions = CommonServiceException.class) @RequestMapping(value = "",method = RequestMethod.GET) public BaseResponseVO describeCinemas(BasePageVO basePageVO) throws CommonServiceException { IPage<DescribeCinemasRespVO> describeCinemasRespVOIPage = cinemaServiceAPI.describeCinemas(basePageVO.getNowPage(), basePageVO.getPageSize()); if(basePageVO.getNowPage()>10000){ //throw new CommonServiceException(400,"nowPage太大了,不支持此处理"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } // TODO 调用封装的分页返回方法 return BaseResponseVO.success(); }
对nowPage值大于10000时,线程休眠2秒,而配置的超时时间timeoutInMilliseconds为1秒 。从而触发熔断,调用fallbackMethod方法。
fallbackMethod方法如下,该方法的参数和返回值要与describeCinemas保持一致。
public BaseResponseVO fallbackMethod(BasePageVO basePageVO) throws CommonServiceException{ // 返回一定是成功,或者业务处理失败 Map<String,Object> result = Maps.newHashMap(); result.put("code", 500); result.put("message","请求处理降级返回"); return BaseResponseVO.success(result); }
5、调用请求
当nowPage小于等于10000时,返回成功
当nowPage大于10000时,触发熔断
二、Hystrix的Dashboard使用
1、打开http://localhost:8301/hystrix
添加监控http://localhost:8301/actuator/hystrix.stream
2、监控图
3、监控图数字含义
Hystrix很少作为监控使用,它一般只有2分钟左右的状态,不能查历史状态,比较难找原因。适合双十一,比如每分钟都要监控到。