刚好最近疫情原因,导致不方便进业主方场地进行多系统开发,就学习了springcloud全家桶。 刚好学到springboot-admin系统监控,发现可以单独拆出来用,就顺手装到自己项目上去玩了。
一、springboot-admin用于管理和监控SpringBoot应用程序。
springboot-admin分为服务端Spring Boot Admin Server和客户端Spring Boot Admin Client,使用时,先开启服务端,然后启动客户端自动注册就可以使用啦。本身集成还是很简单的,一般常用的功能如下: 常见的功能或者监控如下:
- 显示健康状况
- 显示详细信息,例如
- JVM和内存指标
- micrometer.io指标
- 数据源指标
- 缓存指标
- 显示构建信息编号
- 关注并下载日志文件
- 查看jvm系统和环境属性
- 查看Spring Boot配置属性
- 支持Spring Cloud的postable / env-和/ refresh-endpoint
- 轻松的日志级管理
- 与JMX-beans交互
- 查看线程转储
- 等等
界面如下:
二、接入使用
服务端
1、创建一个普通的springboot项目,引入如下依赖:
<!-- springBoot admin 监控 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.0</version>
</dependency>
<!-- 开启验证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 引入Web场景 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、然后配置端口及验证账密码:
spring.application.name=xxx-admin
server.port=29000
spring.security.user.name=zc
spring.security.user.password=123456
3、接着在启动类配置注释及放行页面,放行页面具体不用管,按官网的抄就完事了
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
//配置安全校验
@Configuration
@Order(Ordered.LOWEST_PRECEDENCE)
public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf().disable();
}
}
}
客户端
1、在现有的项目里,加入如下依赖:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、配置连接参数等
spring.application.name= springboot
spring.boot.admin.client.url=http://localhost:29000
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
spring.boot.admin.client.username=zc
spring.boot.admin.client.password=123456
**3、先启动服务器端,然后启动客户端即可,接入可能会花费点时间,耐心等一会儿即可。
踩的坑
1、服务端的springboot和springboot-admin版本一定要要匹配,谁都谁低都可能炸锅,还基本排查处理不了,反正我是不想花费那么多时间去排查,累。我用的springboot2.1.1和admin的2.1.0,也可以适当高一些,这个版本好像没有中文界面,看着麻烦。 2、客户端和服务端的admin版本一定要一样,不然又会遇到神奇的bug。 3、连不上,注意检查下端口是否开放,是否一致,账号密码是否一致,客户端是否暴露了端点等。 4、很多文章列举了邮件通知,但中国人一个是不喜欢用邮件,一个是定义麻烦,可以加上自定义通知。
自定义通知类,加入可服务端代码里即可。
package com.imooc.ecommerce.notifier;
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.AbstractEventNotifier;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
/**
* @packageName:e-commerce-springcloud
* @ClassName:ZcNotifier
* @auther:zc
* @date 2022/3/30 14:01
* 通知告警信息
* 主要是依靠继承AbstractEventNotifier,实现通知方法
*/
@Component
public class ZcNotifier extends AbstractEventNotifier {
protected ZcNotifier(InstanceRepository repository) {
super(repository);
}
/**
* 实现事件通知
* @param event 哪一个事件
* @param instance 发生了什么事
* @return 这里你想发短信也好,发邮件也罢,单纯的记录也行,都随意了,自己拿到数据,干嘛都行
*/
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() ->{
if (event instanceof InstanceStatusChangedEvent) {
System.out.println(instance.getRegistration().getName()+event.getInstance()+
((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
} else {
System.out.println(instance.getRegistration().getName()+event.getInstance()+
event.getType());
}
});
}
}
|