SpringBoot知识体系(六)——监控与邮件提醒

简述

利用spring框架中的任务注解@Scheduled定时执行任务,监控某个服务,并把其状态通过邮件发送给管理员。

发邮件使用springbootJavaMailSender类。这是一个很通用的工具接口,在springboot中只需要引入一个maven依赖,无需任何配置就可以从容地进行开发工作,简单快捷高效。

以监控Elasticsearch集群的健康状态为例:

添加maven依赖

确保先增加过springboot依赖之后,再增加以下依赖

        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
            <version>4.5.2version>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-mailartifactId>
        dependency>

增加application.properties

需要替换为自己邮箱协议与密码,发送方必须要开启smtp。我这里使用的QQ邮箱,设置方法见QQ邮件开启smtp服务

# mail 
spring.mail.host=smtp.qq.com
spring.mail.username=1234567835@qq.com
spring.mail.password=lassssssyxvudibh
spring.mail.properties.mail.stmp.auth=true

注意:在spring.mail.password处的值是需要在邮箱设置里面生成的授权码,这个不是真实的密码。

增加监控类

其中HEALTH_CHECK_API可替换为自己的服务监控接口

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class ESMonitor {

    private static final String HEALTH_CHECK_API = "http://192.138.131.12:9200/_cluster/health";

    private static final String GREEN = "green";
    private static final String YELLOW = "yellow";
    private static final String RED = "red";

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private JavaMailSender mailSender;

    @Scheduled(fixedDelay=5000)
    public void healthCheck(){
        HttpClient httpClient = HttpClients.createDefault();

        HttpGet get = new HttpGet(HEALTH_CHECK_API);

        try {
            HttpResponse response = httpClient.execute(get);
            if(response.getStatusLine().getStatusCode()!=HttpServletResponse.SC_OK){
                System.out.println("Can not access ES Service normally! Please check the server.");
            }else {
                String body = EntityUtils.toString(response.getEntity(),"UTF-8");
                JsonNode jsonNode =  objectMapper.readTree(body);
                String status = jsonNode.get("status").asText();
                String msg = "";
                boolean isNormally = false;
                switch (status){
                    case GREEN:
                        msg ="ES server run normally.";
                        isNormally = true;
                        break;
                    case YELLOW:
                        msg ="ES server gets status yellow!";
                        break;
                    case RED:
                        msg ="ES server gets status red!";
                        break;
                    default:
                        msg ="Unknow ES server status:"+status ;
                        break;
                }
                if(!isNormally){
                    sendAlertMessage(msg);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void sendAlertMessage(String message){
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom("[email protected]");
        mailMessage.setTo("[email protected]");
        mailMessage.setSubject("【警告】ES服务监控");
        mailMessage.setText(message);

        mailSender.send(mailMessage);
    }

}

这样就可以简单的监控服务是否健康了。

尾巴

其中@Scheduled注解的参数解释:

  1. cron
    语法@Scheduled(cron=“1 * * * * * *”)
    表达式:[秒] [分] [小时] [日] [月] [周] [年]
    其中年可以省略
  2. zone
    时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区
  3. fixedDelay
    上一次执行完毕时间点之后多长时间再执行。
  4. fixedDelayString
    与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符
    @Scheduled(fixedDelayString = “${time.fixedDelay}”)
    占位符的使用(配置文件中有配置:time.fixedDelay=5000)
  5. fixedRate
    上一次开始执行时间点之后多长时间再执行。
  6. fixedRateString
    与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
  7. initialDelay
    第一次延迟多长时间后再执行。
    @Scheduled(initialDelay=1000, fixedRate=5000)
  8. initialDelayString
    与 7. initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

参考

@Scheduled注解各参数详解

在线Cron表达式网站

你可能感兴趣的:(SpringBoot知识体系(六)——监控与邮件提醒)