SpringBoot Admin 实现服务监控
SpringBoot Admin能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 Spring Boot 应用的健康状况,提供实时警报功能。
1.依赖文件
添加pom依赖
<!-- SpringBoot Admin -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${spring-boot-admin.version}</version>
</dependency>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.7.2</version>
</dependency>
2.修改yml文件
监控服务yml文件
# Tomcat
server:
port: 9100
# Spring
spring:
security:
user:
name: admin
password: admin
boot:
admin:
ui:
title: xx平台监控系统
mail:
host: smtp.qq.com #整合mail,实现监控服务上下线时,发送邮件通知
username: xxxx@qq.com
password: 16位授权码
properties:
mail:
smpt:
auth: true
starttls:
enable: true
required: true
application:
# 应用名称
name: xx-monitor
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
logging:
file:
name: logs/${spring.application.name}/info.log #根据文件地址可在监控平台实时查看日志
共享配置yml修改
# 将服务全部信息注册到springboot admin中
management:
endpoints:
web:
exposure:
include: '*'
3.权限监控配置及通知发送设置
权限监控配置
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
/**
* 监控权限配置
*
*/
@EnableWebSecurity
public class WebSecurityConfigurer
{
private final String adminContextPath;
public WebSecurityConfigurer(AdminServerProperties adminServerProperties)
{
this.adminContextPath = adminServerProperties.getContextPath();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception
{
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
return httpSecurity
.headers().frameOptions().disable()
.and().authorizeRequests()
.antMatchers(adminContextPath + "/assets/**"
, adminContextPath + "/login"
, adminContextPath + "/actuator/**"
, adminContextPath + "/instances/**"
).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login")
.successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout")
.and()
.httpBasic().and()
.csrf()
.disable()
.build();
}
}
通知发送设置
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
/**
* 通知发送配置
*
*/
@Component
public class NotifierConfig extends AbstractStatusChangeNotifier
{
public NotifierConfig(InstanceRepository repository)
{
super(repository);
}
@Value("${spring.mail.username}")
private String mailSender;
@Autowired
private JavaMailSender javaMailSender;
@Override
protected Mono<Void> doNotify(InstanceEvent event,
de.codecentric.boot.admin.server.domain.entities.Instance instance)
{
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent)
{
String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
sdendMail(instance, status);
}
});
}
private void sdendMail(de.codecentric.boot.admin.server.domain.entities.Instance instance, String status){
String name = instance.getRegistration().getName();
String serviceUrl = instance.getRegistration().getServiceUrl();
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(mailSender);
mailMessage.setTo("1351731902@qq.com");
mailMessage.setSubject("服务状态改变");
String format = String.format("应用服务:%s, 服务IP:%s, 状态改变为:%s", name, serviceUrl, status);
mailMessage.setText(format);
javaMailSender.send(mailMessage);
}
}
3.启动监控服务
启动监控服务,启动成功后,访问http://localhost:9100/login,输入账号密码(根据自己的配置,我们配置的是admin,admin)登录监控系统,即可进行服务的监控及查看
并且服务状态发生改变时还会进行邮件提示