zoukankan      html  css  js  c++  java
  • 【Springboot】用Springboot Admin监控你的微服务应用

    1 简介

    目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落。服务多了,运行的实例多了,给运维人员的压力就更大了。如果有十几个应用,单单做Health Check就已经够费时间的了。聪明的Springboot提供了Actuator接口,可以非常好获得应用的内部信息,然而针对数量庞大的服务却无能为力。

    得益于开源社区的力量,我们有了Springboot Admin。它能对注册于服务发现的所有应用监控起来,功能包括健康检查、JVM内存、INFO信息、获得线程栈和堆栈信息、提醒(邮件、Slack、钉钉、自定义...)等。总之,它提供了非常丰富的监控功能,减轻运维人员的工作任务。

    file

    目前Springboot Admin(后面简称SBA)的最新版本为2.2.0,本文演示将使用该版本。

    2 两种监控模式

    使用SBA监控Client有两种模式,一种是在Client端引入spring-boot-admin-starter-client依赖,配置好Server的地址信息就可以了。另一种模式是将所有Client端注册到服务发现(Eureka)组件中去,同时把Server端也注册,这样Server端就可以监控所有Client端了。

    第二种模式是更方便的,不用对Client都添加依赖,后面的例子使用第二种模式。

    服务端需要添加SBA的依赖和Eureka Client的依赖,如下:

    <dependencies>
      <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
    </dependencies>
    

    配置文件配置信息如下:

    server.port=9000
    spring.application.name=admin-monitor-service
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    eureka.client.register-with-eureka=true
    eureka.client.fetch-registry=true
    

    启动后就可以监控微服务了(当然需要Eureka和其它Client也启动并注册),效果图如下:

    file

    上图显示共有四个应用受到监控:

    有一个ADMIN-MONITOR-SERVICE,即SBA本身;

    有两个DATA-SERVICE,用于数据库操作的服务;

    有一个GATEWAY,是网关服务,即Zuul。

    能看到服务的名字,还能看到其版本号。

    3 保护你的SBA

    3.1 保护Server

    现在SBA启动后直接输入地址就可以访问,不需要密码登陆,这显然是不安全的。SBA本质也是一个Springboot的Web应用,可以用Spring Security来做安全和权限控制。

    添加Spring Security依赖如下:

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

    配置用户和密码:

    spring.security.user.name=admin
    spring.security.user.password=admin
    

    重启应用后,就需要登陆密码才能访问了,如下:

    file

    实际上Spring Security远比这强大,我们可以通过配置把更敏感的信息保护起来,如HeamDump文件的获取,日志级别的修改等。

    注意:即使做了上面的措施,也无法保证Server的安全。要想更安全地使用SBA,可以通过添加SSL,使它运行在https之上。

    3.2 保护Client

    目前我们把Client的所有Endpoints都暴露出来,这也是非常危险的,我们可以有选择的暴露需要的信息。另外,我们还可以为Client设置账户密码保护,只有拥有了正确的账户密码,Server端才可以获得监控权限。

    4 监控功能

    SBA为我们提供丰富的监控功能,我们选择几项展示一下。

    4.1 健康检查与细节查看

    SBA会监控服务是否健康,包括应用及应用的组件,如数据库连接等。

    file

    • INFO信息

    图上还有info信息,这个是自定义配置的,非常方便,如配置代码的版本号等。

    info.author=Larry Deng
    info.version=1.0.3
    
    • Beans

    可以查看所有的beans信息。

    • Configuration Properties

    查看目前应用使用的配置信息。

    • Scheduled Tasks

    查看正在使用的定时调度任务。

    4.2 日志Loggers

    展示了当前的日志级别,更强大的是,它可以实时调整日志级别,而不用去改log4j2配置文件,也不用重启。在有问题需要更详细的日志的时候,非常方便。

    file

    4.3 JVM信息(线程与内存)

    可以实时地查看每个线程的状态,并且能下载Thread Dump文件,方便有故障的时候分析。同样,还能下载Heap Dump文件,在占用内存居高不下,还不能GC时,可以用来分析。

    file

    4.4 其它

    Mappings能查看Endpoints的路径和方法及返回类型等。

    Caches可以查看应用所使用的缓存,并能操作,如清空缓存。

    5 强大的提醒功能

    虽然SBA提供了强大的监控功能,但要人工一直盯着屏幕就太低效了。为此,SBA提供了强大的提醒功能,能够在发生服务状态变更的时候发出告警。支持的提醒功能有:

    • Email
    • PagerDuty
    • OpsGenie
    • Hipchat
    • Slack
    • Let's Chat
    • Telegram

    等。

    同时还支持自定义,这样可以整合更丰富的提醒,如短信、电话等。

    5.1 邮件提醒

    为了不让篇幅过大,下面只展示一下邮件提醒功能的使用,其它可参考用户手册。

    添加邮件依赖:

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

    配置参数:

    spring.mail.host=smtp.example.com
    spring.mail.username=smtp_user
    spring.mail.password=smtp_password
    spring.boot.admin.notify.mail.to=admin@example.com
    

    邮件提醒其它配置项:

    file

    5.2 自定义提醒

    自定义提醒很简单,只要实现Notifier接口就行了,建议直接继承AbstractEventNotifierAbstractStatusChangeNotifier这两个类。逻辑在方法doNotify中实现。

    public class CustomNotifier extends AbstractEventNotifier {
      private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);
    
      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());
          }
          else {
            LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
                event.getType());
          }
        });
      }
    }
    

    6 总结

    SBA非常强大,一篇文章难以完备,大家可以参考用户手册

    另外,服务发现不一定要使用Eureka,如Nacos也是支持的。只使用SBA也是不够的,对于监控日志,可以使用ELK,这是题外话了,以后有空再整理吧。


    欢迎关注公众号<南瓜慢说>,将持续为你更新...

    file

    欢迎加博主微信,做一个点赞之友,哈哈...

    file

    多读书,多分享;多写作,多整理。

  • 相关阅读:
    servlet 和filter 抛出404等异常
    cassandra 存储list数组
    cassandra 存储二进制data
    ubuntu下安装cpython 0.2x
    mongodb存储二进制数据的二种方式——binary bson或gridfs
    Python中使用Flask、MongoDB搭建简易图片服务器
    kubernetes要实现的目标——随机关掉一台机器,看你的服务能否正常;减少的应用实例能否自动迁移并恢复到其他节点;服务能否随着流量进行自动伸缩
    陈斌:探索技术领导力的最佳实践
    python berkeley DB操作——打开btree索引文件中的database
    什么是AWS Lambda?——事件驱动的函数执行环境
  • 原文地址:https://www.cnblogs.com/larrydpk/p/12044660.html
Copyright © 2011-2022 走看看