使用redis和thread告警并避免重复告警

spring cloud使用redis 增加监控,微服务的监控体系特别重要,这里增加了告警(使用thread异步告警),同时不能短时间内不能重复告警(使用redis避免重复)

1、增加依赖

            <dependency>

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

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

</dependency>

2、配置redis服务信息

redis:

     database: 0

     host: 127.0.0.1

     port: 6379

     timeout: 2000

3、使用redis

    在controller包下的类中增加

@Autowired

private StringRedisTemplate stringRedisTemplate;//引入redis

        

        并在saveOrderFail方法中增加监控发短信伪代码

         //增加监控报警

String saveOrderKey="saveOrderKey";

String sendString =stringRedisTemplate.opsForValue().get(saveOrderKey);

//使用异步调用,启动一个异步线程,thread

new Thread(()->{

if (StringUtils.isBlank(sendString)){

System.out.println(saveOrderKey+"服务存在问题,请及时处理!");

//这里是伪代码, 实际情况为调用一个http请求调用短信服务,即可发送短信告警

stringRedisTemplate.opsForValue().set(saveOrderKey, "save -order-fail",20, TimeUnit.SECONDS);

//20秒内不重复发送,生产中一般使用分钟或者小时

}

else

{

System.out.println(saveOrderKey+"服务存在问题,已经告警不再重复告警!");

}

}).start();

        

 

4、可以获取会话的IP地址

    在saveOrderFail的参数中增加HttpServletRequest ,同时要在save方法中增加参数HttpServletRequest

     public Object save( @RequestParam("userId") int userId,@RequestParam("productId") int productId)

        改为

public Object save( @RequestParam("userId") int userId,@RequestParam("productId") int productId,HttpServletRequest httpServletRequest)

 

        private Object saveOrderFail(int userId,int productId)

        改为

private Object saveOrderFail(int userId,int productId,HttpServletRequest httpServletRequest)

 

    

    增加获取IP地址并在报警信息中增加

     final String ip=httpServletRequest.getRemoteAddr();

     System.out.println(saveOrderKey+"服务存在问题,请及时处理!ip地址是:"+ip);

      

    

    方法完整代码为:

     @HystrixCommand(fallbackMethod = "saveOrderFail")

public Object save( @RequestParam("userId") int userId,@RequestParam("productId") int productId,HttpServletRequest httpServletRequest)

{

Map<String,Object> msg=new HashMap<>();

msg.put("code",0);

msg.put("msg",productOrderFeignHystrixService.save(userId,productId));

return msg;

}

private Object saveOrderFail(int userId,int productId,HttpServletRequest httpServletRequest)

{

//增加监控报警

String saveOrderKey="saveOrderKey";

String sendString =stringRedisTemplate.opsForValue().get(saveOrderKey);

//使用异步调用,启动一个异步线程,thread

new Thread(()->{

if (StringUtils.isBlank(sendString)){

                    final String ip=httpServletRequest.getRemoteAddr();

                    //final String ip="localhost";

System.out.println(saveOrderKey+"服务存在问题,请及时处理!ip地址是:"+ip);

//这里是伪代码, 实际情况为调用一个http请求调用短信服务,即可发送短信告警

stringRedisTemplate.opsForValue().set(saveOrderKey, "save -order-fail",20, TimeUnit.SECONDS);

//20秒内不重复发送,生产中一般使用分钟或者小时

}

else

{

System.out.println(saveOrderKey+"服务存在问题,已经告警不再重复告警!");

}

}).start();

 

 

Map<String,Object> msg=new HashMap<>();

msg.put("code",-1);

msg.put("msg","抢购人数太多!您被挤出来了,请稍等重试!");

return msg;

 

}        

 

        

原文地址:https://www.cnblogs.com/programer-xinmu78/p/10541083.html