一. 为服务添加报警
-
pom.xml添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-
在application.yml中添加配置
redis:
database: 0
host: 127.0.0.1
port: 6379
timeout: 2000
-
在@HystrixCommand(fallbackMethod = "saveOrderFail")的fallbackMethod方法中做报警处理
@RestController
@RequestMapping("api/v1/order")
public class OrderController {
@Autowired
private ProductOrderService productOrderService;
@Autowired
private StringRedisTemplate redisTemplate;
@RequestMapping("save")
@HystrixCommand(fallbackMethod = "saveOrderFail")
public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId, HttpServletRequest request){
Map<String, Object> data = new HashMap<>();
data.put("code", 0);
data.put("data", productOrderService.save(userId, productId));
return data;
}
//注意,方法签名一定要要和api方法一致
private Object saveOrderFail(int userId, int productId, HttpServletRequest request){
//监控报警
String saveOrderKye = "save-order";
//根据key在redis中取值
String sendValue = redisTemplate.opsForValue().get(saveOrderKye);
final String ip = request.getRemoteAddr();
new Thread( ()->{
if (StringUtils.isBlank(sendValue)) {
System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址是="+ip);
// TODO: 2019/3/4 发送一个http请求,调用短信服务
//向redis中设置值,倒数第一个参数是超时时间的单位,倒数第二个是值
redisTemplate.opsForValue().set(saveOrderKye, "save-order-fail", 20, TimeUnit.SECONDS);
}else{
System.out.println("已经发送过短信,20秒内不重复发送");
}
}).start();
Map<String, Object> msg = new HashMap<>();
msg.put("code", -1);
msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
return msg;
}
}
二. Hystrix降级策略调整
-
官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
-
查看默认讲解策略 HystrixCommandProperties
-
execution.isolation.strategy 隔离策略
-
THREAD 线程池隔离 (默认)
-
SEMAPHORE 信号量:信号量适用于接口并发量高的情况,如每秒数千次调用的情况,导致的线程开销过高,通常只适用于非网络调用,执行速度快
-
-
execution.isolation.thread.timeoutInMilliseconds 超时时间,默认1000ms
-
execution.timeout.enabled 是否开启超时限制 (一定不要禁用)
-
execution.isolation.semaphore.maxConcurrentRequests 隔离策略为 信号量的时候,如果达到最大并发数时,后续请求会被拒绝,默认是10
-
-
调整策略
超时时间调整:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000