文章目录

  • 1.简介
  • 2.非微服务应用集成admin
  • 2.1.Spring Boot Admin Server搭建
  • 2.1.1.引入依赖
  • 2.1.2.添加启动注解
  • 2.1.3.配置文件
  • 2.2.Spring Boot Admin Client搭建
  • 2.2.1.引入依赖
  • 2.2.2.配置文件
  • 2.2.3.启动测试
  • 2.3.添加服务离线上线通知
  • 2.3.1.在admin server应用的pom文件中添加邮件客户端依赖
  • 2.3.2.添加邮件配置
  • 2.3.3.邮件发送工具类
  • 2.3.4.添加自定义通知事件
  • 2.3.5.测试邮件通知
  • 3.微服务应用集成admin
  • 3.1.添加依赖
  • 3.2.添加配置
  • 3.3.添加启动注解
  • 3.4.测试
  • 4.项目配套代码

 

1.简介

Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Nacos)。 UI是的AngularJs应用程序,展示Spring Boot Admin Client的Actuator端点上的一些监控。常见的功能或者监控如下:

  • 显示健康状况
  • 显示详细信息,如下
    JVM和内存指标
    micrometer.io指标
    数据源指标
    缓存指标
  • 显示构建信息编号
  • 关注并下载日志文件
  • 查看jvm系统和环境属性
  • 查看Spring Boot配置属性
  • 轻松的日志级管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http跟踪
  • 下载heapdump
  • 状态变更通知(通过电子邮件,…)

推荐内容

springboot 发送百万级邮件_Server

2.非微服务应用集成admin

2.1.Spring Boot Admin Server搭建

2.1.1.引入依赖

<!-- admin server 依赖 -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.2.2</version>
        </dependency>
复制

2.1.2.添加启动注解

在springboot启动类里添加@EnableAdminServer注解

@EnableAdminServer
@SpringBootApplication
public class MonitorApplication {}
复制

2.1.3.配置文件

server:
  port: 8013
spring:
  application:
    name: monitor
  boot:
    admin:
      ui:
        # ui页面的自定义内容信息
        title: 我的服务监控中心
        brand: <span>Service Monitoring Center</span>
复制

2.2.Spring Boot Admin Client搭建

2.2.1.引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
        </dependency>
复制

2.2.2.配置文件

spring:
  application:
    name: service
  boot:
    admin:
      client:
        # spring boot admin server的注册地址,多个以逗号隔开,并把localhost换成ip
        url: http://localhost:8013
        instance:
          prefer-ip: true
        register-once: false

#需要暴露监控端口给spring boot admin server访问
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS
复制

2.2.3.启动测试

先启动 admin server应用,然后再启动admin clent 应用.
访问 http://localhost:8013/

springboot 发送百万级邮件_springboot 发送百万级邮件_02


查看被监控的服务详细信息

springboot 发送百万级邮件_微服务_03


springboot 发送百万级邮件_微服务_04

2.3.添加服务离线上线通知

在admin server应用添加服务离线上线邮件通知功能

2.3.1.在admin server应用的pom文件中添加邮件客户端依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
     </dependency>
复制

2.3.2.添加邮件配置

spring:
  #配置发送邮件需要的参数
  mail:
    #邮件服务器
    host: smtp.qq.com
    #发送邮件的帐号
    username: 你的邮箱帐号
    #邮箱帐号的授权码
    password: 你的邮件授权码
    properties:
      mail:
        smtp:
          auth: true

client:
  notify:
    mail:
      #邮件内容的标题
      subject: test service notification
      #收邮件的帐号,多个用 , 隔开
      to: 你收邮件的帐号
复制

2.3.3.邮件发送工具类

@Component
public class EmailUtil {
    
    private final Logger logger= LoggerFactory.getLogger(EmailUtil.class);
    
    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String form;
    @Value("${client.notify.mail.to}")
    private String to;

    public  void sendEmail(String subject,String message){
        try {
            if(StringUtils.isEmpty(to)){
                logger.error("email to is Emtry ... send Email stop");
                return;
            }
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            //发件人
            helper.setFrom(form);
            //收件人
            String []toArray=to.split(",");
            helper.setTo(toArray);
            //标题
            helper.setSubject(subject);
            //文本
            helper.setText(message,true);
            mailSender.send(mimeMessage);
        }catch (Exception e){
            logger.info("sendEmail error,message={}",e);
        }
    }

}
复制

2.3.4.添加自定义通知事件

@Component
public class CustomNotifier extends AbstractStatusChangeNotifier {
    private static final Logger logger = LoggerFactory.getLogger(CustomNotifier.class);


    @Value("${client.notify.mail.subject}")
    private String subject;

    @Autowired
    EmailUtil emailUtil;

    //邮件模板内容信息
    private String content="<p style=\"white-space: normal;\">亲爱的运维人员:</p><p style=\"white-space: normal;\">                 您好!</p><p style=\"white-space: normal;\">                 您的运维管理的服务程序已经<strong>${服务状态}</strong>,</p><p style=\"white-space: normal;\">服务名称是:<strong>${服务名称}</strong>,服务部署的服务器ip是:<strong>${服务器ip地址}。</strong></p><p style=\"white-space: normal;\">请查看及时服务运行状态,.</p><p style=\"white-space: normal;\">如有打扰,请见谅!</p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><strong>服务监控中心!</strong></p><p><br/></p>'";

    public CustomNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            if (event instanceof InstanceStatusChangedEvent) {
                logger.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
                        ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
                //获取服务状态 status  UP上线,OFFLINE离职
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                //服务名称,
                String clientName = instance.getRegistration().getName().toLowerCase();
                //服务所在的服务器ip地址
                String clientServerUrl = instance.getRegistration().getServiceUrl();
                String statusName="OFFLINE".equals(status)?"已经宕机了":"已经重新上线!";
                if ("OFFLINE".equals(status) || "UP".equals(status)) {
                    emailUtil.sendEmail(subject + "-" + clientName + "-" + status, repelateMessage(content,statusName,clientName,clientServerUrl));
                }
            } else {
                logger.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
                        event.getType());
            }

        });
    }

    /**
     * 替换邮件模板内占位符
     */
    private String repelateMessage(String msg, String state, String appName, String serverIp) {
        msg = msg.replace("${服务状态}", state);
        msg = msg.replace( "${服务名称}", appName);
        msg =msg.replace("${服务器ip地址}", serverIp);
        return msg;
    }
}
复制

2.3.5.测试邮件通知

先重启spring boot admin server,spring boot admin clent应用.

停止clent应用

停止spring boot admin clent应用,然后就能收到服务离线的邮件通知了

springboot 发送百万级邮件_springboot 发送百万级邮件_05

启动clent应用

启动spring boot admin clent应用,然后就能收到服务上限的邮件通知了

springboot 发送百万级邮件_spring_06

3.微服务应用集成admin

需要对spring cloud有一定的了解才能完成微服务集成,如果不了解的,请等学习完spring cloud后,再来
尝试下面的服务集成。

Spring Boot Admin Server会往注册中心里拉取各个客户端的监控信息,所以微服务模块只需要
往注册中心里面注册就行,无需再往Admin Server里面注册,spring-boot-admin-starter-client依赖就不需要再添加了。

3.1.添加依赖

<!--监控-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
复制

3.2.添加配置

server:
  port: 8764
spring:
  application:
    name: monitor
#eureka注册中心配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:123456@localhost:8761/eureka/
复制

3.3.添加启动注解

@EnableAdminServer
public class MonitorApplication {
}
复制

3.4.测试

先启动eureka注册中心,然后再启动Spring boot admin server,然后再启动别的微服务模块.

springboot 发送百万级邮件_微服务_07