目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落。服务多了,运行的实例多了,给运维人员的压力就更大了。若是有十几个应用,单单作Health Check就已经够费时间的了。聪明的Springboot提供了Actuator接口,能够很是好得到应用的内部信息,然而针对数量庞大的服务却无能为力。java
得益于开源社区的力量,咱们有了Springboot Admin。它能对注册于服务发现的全部应用监控起来,功能包括健康检查、JVM内存、INFO信息、得到线程栈和堆栈信息、提醒(邮件、Slack、钉钉、自定义...)等。总之,它提供了很是丰富的监控功能,减轻运维人员的工做任务。git
目前Springboot Admin(后面简称SBA)的最新版本为2.2.0,本文演示将使用该版本。github
使用SBA监控Client有两种模式,一种是在Client端引入spring-boot-admin-starter-client
依赖,配置好Server的地址信息就能够了。另外一种模式是将全部Client端注册到服务发现(Eureka)组件中去,同时把Server端也注册,这样Server端就能够监控全部Client端了。spring
第二种模式是更方便的,不用对Client都添加依赖,后面的例子使用第二种模式。数据库
服务端须要添加SBA的依赖和Eureka Client的依赖,以下:segmentfault
<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也启动并注册),效果图以下:安全
上图显示共有四个应用受到监控:微信
有一个ADMIN-MONITOR-SERVICE,即SBA自己;app
有两个DATA-SERVICE,用于数据库操做的服务;
有一个GATEWAY,是网关服务,即Zuul。
能看到服务的名字,还能看到其版本号。
如今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
重启应用后,就须要登录密码才能访问了,以下:
实际上Spring Security远比这强大,咱们能够经过配置把更敏感的信息保护起来,如HeamDump文件的获取,日志级别的修改等。
注意:即便作了上面的措施,也没法保证Server的安全。要想更安全地使用SBA,能够经过添加SSL,使它运行在https之上。
目前咱们把Client的全部Endpoints都暴露出来,这也是很是危险的,咱们能够有选择的暴露须要的信息。另外,咱们还能够为Client设置帐户密码保护,只有拥有了正确的帐户密码,Server端才能够得到监控权限。
SBA为咱们提供丰富的监控功能,咱们选择几项展现一下。
SBA会监控服务是否健康,包括应用及应用的组件,如数据库链接等。
图上还有info信息,这个是自定义配置的,很是方便,如配置代码的版本号等。
info.author=Larry Deng info.version=1.0.3
能够查看全部的beans信息。
查看目前应用使用的配置信息。
查看正在使用的定时调度任务。
展现了当前的日志级别,更强大的是,它能够实时调整日志级别,而不用去改log4j2配置文件,也不用重启。在有问题须要更详细的日志的时候,很是方便。
能够实时地查看每一个线程的状态,而且能下载Thread Dump文件,方便有故障的时候分析。一样,还能下载Heap Dump文件,在占用内存居高不下,还不能GC时,能够用来分析。
Mappings能查看Endpoints的路径和方法及返回类型等。
Caches能够查看应用所使用的缓存,并能操做,如清空缓存。
虽然SBA提供了强大的监控功能,但要人工一直盯着屏幕就过低效了。为此,SBA提供了强大的提醒功能,可以在发生服务状态变动的时候发出告警。支持的提醒功能有:
等。
同时还支持自定义,这样能够整合更丰富的提醒,如短信、电话等。
为了避免让篇幅过大,下面只展现一下邮件提醒功能的使用,其它可参考用户手册。
添加邮件依赖:
<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
邮件提醒其它配置项:
自定义提醒很简单,只要实现Notifier接口就好了,建议直接继承AbstractEventNotifier
或AbstractStatusChangeNotifier
这两个类。逻辑在方法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()); } }); } }
SBA很是强大,一篇文章难以完备,你们能够参考用户手册。
另外,服务发现不必定要使用Eureka,如Nacos也是支持的。只使用SBA也是不够的,对于监控日志,可使用ELK,这是题外话了,之后有空再整理吧。
欢迎关注公众号<南瓜慢说>,将持续为你更新...
欢迎加博主微信,作一个点赞之友,哈哈...
多读书,多分享;多写做,多整理。