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;
}