Spring Boot Admin官方文档:2.1.6
2019-08-22 本文已影响0人
一生逍遥一生
SpringBootAdmin是一个用于监控Spring Boot应用程序的社区项目,本文的版本为2.1.6。
这些应用程序使用Spring Boot Client通过Http或者被Spring Cloud发现来进行注册。
页面是一个Vue的程序。
Spring Boot Admin 入门
创建Spring Boot Admin Server
1.添加相关依赖
<!--添加父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<!--设置相关属性-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--添加spring boot admin 依赖-->
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependencies>
2.应用程序添加代码
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminServerApplication {
public static void main(String[] args){
SpringApplication.run(SpringBootAdminServerApplication.class,args);
}
}
Registering Client Applications
1.Spring Boot Admin Client
添加Spring Boot Admin Client依赖:
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
配置文件如下:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
spring:
application:
name: springbootadminclient
boot:
admin:
client:
url: http://localhost:9090
安全相关配置文件:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}
启动程序:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootAdminClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminClientApplication.class, args);
}
}
Client Applications
Show Version in Application List
添加build-info.properties文件,需要添加相关依赖:
<!--build info-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
JMX-Bean Management
由于依赖spring-boot-admin-starter-client,就不需要添加下面的依赖:
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
在配置文件中添加:
spring.jmx.enabled=true #如果不添加,会出现Unregister endpoint with ObjectName 'org.springframework.boot:type=Endpoint,name=Auditevents' from the JMX domain异常
Logfile Viewer
配置文件:
logging:
file: "/var/log/sample-boot-application.log"
pattern:
file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"
Show Tags per Instance
#using the metadata
spring:
boot:
admin:
client:
instance:
metadata:
tags:
environment: test
#using the info endpoint
info:
tags:
environment: test
Spring Boot Admin Client属性配合
相关属性配置可见官网。
Spring Boot Admin Server
Notifications
Reminder Notifications
用来记录实例关闭/离线:
@Primary
@Bean(initMethod = "start", destroyMethod = "stop")
public RemindingNotifier remindingNotifier() {
RemindingNotifier notifier = new RemindingNotifier(filteringNotifier(), repository);
notifier.setReminderPeriod(Duration.ofMinutes(1));
notifier.setCheckReminderInverval(Duration.ofSeconds(10));
return notifier;
}
Filtering Notifications
对一些事件进行过滤:
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.notify.CompositeNotifier;
import de.codecentric.boot.admin.server.notify.Notifier;
import de.codecentric.boot.admin.server.notify.RemindingNotifier;
import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
@Configuration
public class NotifierConfig {
private final InstanceRepository repository;
private final ObjectProvider<List<Notifier>> otherNotifiers;
public NotifierConfig(InstanceRepository repository, ObjectProvider<List<Notifier>> otherNotifiers) {
this.repository = repository;
this.otherNotifiers = otherNotifiers;
}
@Bean
public FilteringNotifier filteringNotifier() {
CompositeNotifier delegate = new CompositeNotifier(otherNotifiers.getIfAvailable(Collections::emptyList));
return new FilteringNotifier(delegate, repository);
}
@Primary
@Bean(initMethod = "start", destroyMethod = "stop")
public RemindingNotifier remindingNotifier() {
RemindingNotifier notifier = new RemindingNotifier(filteringNotifier(), repository);
notifier.setReminderPeriod(Duration.ofMinutes(1));
notifier.setCheckReminderInverval(Duration.ofSeconds(10));
return notifier;
}
}
Mail Notifications
maven添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置JavaMailSender
spring.mail.host=smtp.example.com
spring.boot.admin.notify.mail.to=admin@example.com
配置项:
Property Name | Description | Default Value |
---|---|---|
spring.boot.admin.notify.mail.enabled | 开启邮箱通知 | true |
spring.boot.admin.notify.mail.ignore-changes | 需要忽略的事件 | "UNKNOWN:UP" |
spring.boot.admin.notify.mail.template | 指定模版路径 | "classpath:/META-INF/spring-boot-admin-server/mail/status-changed.html" |
spring.boot.admin.notify.mail.to | 邮件接受者 | "root@localhost" |
spring.boot.admin.notify.mail.cc | 抄送接受者 | |
spring.boot.admin.notify.mail.from | 从哪儿发出来 | |
spring.boot.admin.notify.mail.additional-properties | 添加其他属性 |
也可参考https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/integration.html#mail
Security
Securing Spring Boot Admin Server
在Spring Boot Admin Server添加相应的依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
</dependency>
</dependencies>
代码如下:
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import java.util.UUID;
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecurityConfiguration(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
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().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(adminContextPath + "/instances", adminContextPath + "/actuator/**")
.and()
.rememberMe().key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600);
}
}
配置文件:
spring:
security:
user:
name: admin
password: test
然后在Spring Boot Admin Client中添加新的配置:
spring:
boot:
admin:
client:
username: admin
password: test
instance:
metadata:
tags:
environment: test
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
jmx:
enabled: true
security:
user:
name: admin
password: test
Customizing
Custom Notifiers
需要继承AbstractEventNotifier类
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 reactor.core.publisher.Mono;
public class CustomNotifier extends AbstractEventNotifier {
public CustomNotifier(InstanceRepository repository) {
super(repository);
}
@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent) {
String.format("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
} else {
String.format("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
event.getType());
}
});
}
}
Injecting Custom HTTP Headers
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return instance -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}
Intercepting Requests And Responses
@Bean
public InstanceExchangeFilterFunction auditLog() {
return (instance, request, next) -> {
if (HttpMethod.DELETE.equals(request.method()) || HttpMethod.POST.equals(request.method())) {
String.format("{} for {} on {}", request.method(), instance.getId(), request.url());
}
return next.exchange(request);
};
}
Customizing Header Logo and Title
- spring.boot.admin.ui.brand:自定义Logo
- spring.boot.admin.ui.title:自定义标题
Customizing Favicon
- 将favicon放在通过http提供的资源位置(/META-INF/spring-boot-admin-server-ui/assets/img/)。
- spring.boot.admin.ui.favicon:用作默认图标。
- spring.boot.admin.ui.favicon-danger:在一个或多个服务关闭时使用。
代码位置为:https://github.com/yishengxiaoyao/spring-boot-admin-demo