spring-boot-admin项目为Spring Boot应用程序提供了一个健康检测状态管理界面。
分为服务端和客户端,客户端结合 spring-boot-starter-actuator 信息收集
1. 服务端 springboot-admin
新建一个springboot 项目springboot-admin,pom.xml
<spring-boot.version>2.7.3</spring-boot.version>
<spring-boot-admin.version>2.7.5</spring-boot-admin.version>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
配置端口,设置账号密码
启动后访问 http://localhost:4001/
还没有客户端连接,这时候看不到应用
2. 客户端 web-server
新建一个springboot 项目web-server,pom.xml
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
yml配置
server:
port: 7001
spring:
mvc:
pathmatch:
matching-strategy: ant-path-matcher
main:
allow-bean-definition-overriding: true
allow-circular-references: true
boot:
admin:
client:
# Admin 服务端地址
url: http://localhost:4001
# server 用户名
username: admin
# server 密码
password: admin
# 开放端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
启动web-server服务,就可以在UI看到应用了。
3. 监控服务异常下线通知
在服务端springboot-admin,新建AdminMonitorNotifier
import de.codecentric.boot.admin.server.domain.entities.Instance;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.util.Arrays;
@Slf4j
@Component
public class AdminMonitorNotifier extends AbstractStatusChangeNotifier {
private String[] ignoreChanges = new String[]{"UNKNOWN:UP", "DOWN:UP", "OFFLINE:UP"};
public AdminMonitorNotifier(InstanceRepository repository) {
super(repository);
}
@Override
protected boolean shouldNotify(InstanceEvent event, Instance instance) {
if (!(event instanceof InstanceStatusChangedEvent)) {
return false;
} else {
InstanceStatusChangedEvent statusChange = (InstanceStatusChangedEvent) event;
String from = this.getLastStatus(event.getInstance());
String to = statusChange.getStatusInfo().getStatus();
return Arrays.binarySearch(this.ignoreChanges, from + ":" + to) < 0 && Arrays.binarySearch(this.ignoreChanges, "*:" + to) < 0 && Arrays.binarySearch(this.ignoreChanges, from + ":*") < 0;
}
}
@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent) {
String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
switch (status) {
case "DOWN":
log.info("服务健康状态不通过 {},{}", status, instance.getRegistration().getName());
break;
case "OFFLINE":
log.info("服务下线状态 {},{}", status, instance.getRegistration().getName());
break;
case "UP":
log.info("服务上线状态 {},{}", status, instance.getRegistration().getName());
break;
case "UNKNOWN":
log.info("服务未知状态异常 {}", instance.getRegistration().getName());
break;
default:
break;
}
}
});
}
}
这里就可以对服务异常做通知了,邮箱,短信告警。
可以对web-server启动,停止做下测试。
代码中使用了nacos,根目录有配置文件,导入修改nacos ip就可以启动