美文网首页springboot
SpringBoot | 第二十八章:监控管理之Spring B

SpringBoot | 第二十八章:监控管理之Spring B

作者: oKong | 来源:发表于2018-09-14 20:28 被阅读367次
    第二十八章:监控管理之Spring Boot Admin使用

    前言

    上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息。但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很直观,而当需要监控的应用越来越多时,依次去访问对应的应用也过于繁琐和低效了。所以,本章节来介绍下Spring Boot Admin这个UI监控工具。

    Spring-Boot-Admin是什么

    先看看,官网给其定义:

    image

    简单来说,Spring Boot Admin是一个管理和监控Spring Boot应用程序的开源软件。每个应用都认为是一个客户端,通过HTTP或者服务注册发现Spring Cloud(Eureka、Consul等等)注册到admin server中进行展示,Spring Boot Admin UI部分使用AngularJs将数据展示在前端。

    Spring Boot Admin是一个针对spring-bootactuator接口进行UI美化封装的监控工具。它可以:在列表中浏览所有被监控spring-boot项目的基本信息,详细的Health信息、内存信息、JVM信息、垃圾回收信息、各种配置信息(比如数据源、缓存列表和命中率)等,还可以直接修改loggerlevel

    监控实例

    Spring Boot Admin包含admin-serveradmin-client两个组件,admin-server通过采集actuator端点数据,显示在spring-boot-admin-ui上。

    **提醒:为了演示服务端和客户端,本实例创建了一个maven多模块项目。
    **

    admin-server端

    admin-server端主要是数据展现功能,包含了一个ui页面。

    创建一个spring-boot-admin-server工程。

    0.引入pom依赖

            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
            </dependency>
              <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>de.codecentric</groupId>
                  <artifactId>spring-boot-admin-dependencies</artifactId>
                  <version>1.5.7</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
    

    注意:由于使用的SprinBoot1.5.15版本,所以选用的Spring Boot Admin版本为1.5.7版本。同时为了版本依赖,使用dependencyManagement加入了spring-boot-admin-dependencies进行版本管理。

    1.启动类,加入注解@EnableAdminServer

    @SpringBootApplication
    @EnableAdminServer
    @Slf4j
    public class Chapter28AdminServerApplication {
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Chapter28AdminServerApplication.class, args);
            log.info("Chapter28AdminServer启动!");
        }
    }
    

    一个服务端就基本配置结束了,启动应用,访问:http://127.0.0.1:8080 ,即可看见监控页面了:

    image

    由于现在还没有加入客户端,所以应用列表都是空的。

    admin-client端

    被监控的应用只需要加入相关依赖和服务端配置即可。

    创建一个spring-boot-admin-client项目

    0.引入pom依赖

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

    1.配置文件加入服务端地址等信息。

    application.properties

    # 应用名称 便于识别
    spring.application.name=spring-boot-admin-client
    server.port=8081
    #服务端地址
    spring.boot.admin.url=http://127.0.0.1:8080
    # 关闭安全认证
    management.security.enabled=false
    # 利用info端点,加入版本等信息  
    info.version=@project.version@
    info.name=@project.artifactId@
    # 可自定义信息
    info.author=oKong
    info.blog=http://blog.lqdev.cn/
    

    注意:为了能获取maven的配置内容,需要在pom文件中加入以下配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    只需要这两部,客户端就配置完了,启动下,访问http://127.0.0.1:8080 ,即可看见监控页面已经包含了此应用数据了:

    image

    此时,我们点击详情,即可看见各类监控数据了。

    image

    环境变量:

    image

    线程信息:

    image

    日志相关:

    logger

    若需要动态的修改日志级别,按官网的提示,需要加入logback-spring.xml文件,具体的可查看官网文档吧,写的很详细了。

    loglevel-management

    其他监控指标,大家可以自行查看下。


    注意:在生产环境中,为了数据的安全,还是需要加上安全认证的,具体的可以查看官方文档:securing-spring-boot-admin,相对比较简单,简单来说就是加入spring-boot-starter-security进行安全认证,这里可以直接引入spring-boot-admin-server-ui-login进行登录安全认证。本文就不阐述了。

    securing_spring_boot_admin_server

    监控通知

    虽然我们可以通过界面进行可视化监控,但不可能实时去盯着屏幕的,我们希望在服务有问题,比如下线、CPU异常等情况时,能通过邮件等形式及时通知对应责任人,这样就能做到预警效果了。

    SpingBootAdmin中,提供了多种通知机制,来实现监控告警功能。

    image

    可以看见,其集成了国外的一些通讯软件,而对于我们而言,还是使用邮件通知比较靠谱。当然也能自定义通知,进行个性化消息通知功能,比如钉钉机器人通知等。

    发送邮件通知

    这里简单以邮件通知为例。具体邮件发送相关知识点,可查看:第二十六章:邮件发送,这里不在阐述了。

    以下配置都是在服务端spring-boot-admin-server进行添加。

    0.引入pom依赖

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

    1.配置邮箱信息。

    # 邮件相关
    # SMTP服务器地址
    spring.mail.host=smtp.qq.com
    # SMTP服务器端口号 默认-1
    # spring.mail.port=-1
    # 发送方帐号
    spring.mail.username=邮箱
    # 发送方密码(授权码)
    spring.mail.password=邮箱密码
    #javaMailProperties 配置
    # 开启用户身份验证
    spring.mail.properties.mail.smtp.auth=true
    # 发送给谁
    spring.boot.admin.notify.mail.to=499452441@qq.com
    # 谁发的
    spring.boot.admin.notify.mail.from=499452441@qq.com
    

    再次启动服务端应用和客户端,之后停止客户端,就可以收到下线通知邮件了。

    image

    同时,我们还能自定义发送邮件的主题和内容,配置文件加入

    # 主题格式
    # 使用中文会乱码,可使用yml文件格式解决
    # 之类直接unicode编码了
    # 应用#{application.name}(#{application.id}) 状态为:#{to.status}
    spring.boot.admin.notify.mail.subject=\u5e94\u7528#{application.name}(#{application.id}) \u72b6\u6001\u4e3a\uff1a#{to.status}
    # 邮件内容
    #应用#{application.name} (#{application.id})\n状态从 #{from.status} 变为 #{to.status}\n\n 应用健康地址:#{application.healthUrl}
    spring.boot.admin.notify.mail.text=\u5e94\u7528#{application.name} (#{application.id})\n\u72b6\u6001\u4ece #{from.status} \u53d8\u4e3a #{to.status}\n\n \u5e94\u7528\u5065\u5eb7\u5730\u5740\uff1a#{application.healthUrl}
    

    多说几句:这里的subjecttext都支持SpEL(Spring Expression Language)表达式的,关于SpEL表达式,有兴趣的同学可以自行搜索下,是一个支持运行时查询和操作对象图的强大的表达式语言,类似于EL表达式,定界符为#{},一种简化开发的表达式,通过使用表达式来简化开发,减少一些逻辑、配置的编写。

    而此次,发送邮件的参数,通过跟踪源码获悉,入口的参数为ClientApplicationEvent,对应路径为:de.codecentric.boot.admin.event.ClientApplicationEvent,即应用信息。其继承的类如下:

    ClientApplicationEvent继承类

    当应用发送状态变更时,就会触发ClientApplicationStatusChangedEvent事件了,对应的参数如下所示:

    ClientApplicationStatusChangedEvent

    所以,需要额外一些参数时,可以根据de.codecentric.boot.admin.model.Application的属性获取更加详细的信息,如metadatainfo等等。

    Application

    之后,发送的邮件内如如下:

    自定义邮件内容

    自定义通知

    除了使用自带的一些通知机制外,我们还能通过自定义,来进行个性化通知的创建,比如在一些场景下,我们会把消息推送到MQ服务器上或者手机上等等。实现通知比较简单,就是实现Notifier接口,而官方提供给了一个抽象类AbstractStatusChangeNotifier,我们直接继承此类就好了。

    0.创建一个自定义通知类

    CustomNotifier.java

    /**
     * 自定义通知
     * @author oKong
     *
     */
    @Component
    @ConfigurationProperties("okong.custom.notify")
    @Setter
    @Getter
    @Slf4j
    public class CustomNotifier extends AbstractStatusChangeNotifier{
        String name;
        @Override
        protected void doNotify(ClientApplicationEvent event) throws Exception {
            //这里只是为了示例 ,直接输出到控制台了。
            log.info("{}-自定义通知:应用-{}", name,event.getApplication().getName());
        }
    }
    

    1.配置文件配置属性name的值

    # 自定义通知类型
    okong.custom.notify.name=oKong
    

    再次,启动应用,当监控的应用状态发生变动时,可以看见邮件和自定义通知都生效了,控制台可以看见自定义输出内容了。

    自定义通知

    大家可以结合实际的业务需求,编写不同的自定义通知类的,比如利用小程序或者微信公众号,发送微信信息;或者发送短信;或者其他的通讯工具都可以的,自由发挥~

    参考资料

    1. http://codecentric.github.io/spring-boot-admin/1.5.7/

    总结

    本章节主要讲解了利用Spring Boot Admin这个web监控工具进行可视化的监控应用各指标信息。关于使用Spring Cloud注册中心来进行客户端自动注册与发现的,本系列就不阐述了,因为涉及到一些Eureka的相关知识点,后期会在白话SpringCloud的实施监控里面进行详细阐述,而且基于Spring Boot2的界面风格也有大变动,使用Vue.js来进行构建了,同时很会集成Hystrixturbine的集成监控,会更加方便。

    最后

    目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

    老生常谈

    • 个人QQ:499452441
    • 微信公众号:lqdevOps
    公众号

    个人博客:http://blog.lqdev.cn

    完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-28

    原文地址:http://blog.lqdev.cn/2018/09/14/springboot/chapter-twenty-eight/

    相关文章

      网友评论

        本文标题:SpringBoot | 第二十八章:监控管理之Spring B

        本文链接:https://www.haomeiwen.com/subject/jhjagftx.html