3.3:降级报警通知以及Hystrix降级策略调整

一. 为服务添加报警

  1. pom.xml添加redis依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

  1. 在application.yml中添加配置

redis:

  database: 0

  host: 127.0.0.1

  port: 6379

  timeout: 2000

  1. 在@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降级策略调整

  1. 官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy

  2. 查看默认讲解策略 HystrixCommandProperties

    1. execution.isolation.strategy   隔离策略

      1. THREAD 线程池隔离 (默认)

      2. SEMAPHORE 信号量:信号量适用于接口并发量高的情况,如每秒数千次调用的情况,导致的线程开销过高,通常只适用于非网络调用,执行速度快

    2. execution.isolation.thread.timeoutInMilliseconds  超时时间,默认1000ms

    3. execution.timeout.enabled 是否开启超时限制 (一定不要禁用)

    4. execution.isolation.semaphore.maxConcurrentRequests 隔离策略为 信号量的时候,如果达到最大并发数时,后续请求会被拒绝,默认是10

  3. 调整策略

超时时间调整:

hystrix:

  command:

    default:

      execution:

        isolation:

          thread:

            timeoutInMilliseconds: 4000

发布了96 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq919694688/article/details/103155658