1. ¿Qué es la SBA?
El nombre completo de SBA es Spring Boot Admin, que es un proyecto de código abierto para administrar y monitorear aplicaciones Spring Boot. Dividido en dos componentes: admin-server y admin-client, admin-server es un microservicio separado, que recopila datos del punto final del actuador y los muestra en spring-boot-admin-ui, y el cliente es nuestra aplicación spring boot. Se recopilan casi todos los puntos finales conocidos. A través de spring-boot-admin, puede cambiar dinámicamente el nivel de registro, exportar registros, exportar heapdump, monitorear varios indicadores, etc.
Github: https://github.com/codecentric/spring-boot-admin
Documentación oficial: https://codecentric.github.io/spring-boot-admin/2.3.1/
La versión spring-boot-admin utilizada en este artículo es 2.3.1
2. Construya el servidor de administración
2.1 Cree una aplicación Spring Boot con la siguiente estructura
2.2 Modifique pom.xml e introduzca dependencias relacionadas con spring-boot-admin
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>devops</groupId>
<version>1.0.0-dev</version>
<artifactId>cherry-boot-admin</artifactId>
<properties>
<spring-boot-admin.version>2.3.1</spring-boot-admin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-dependencies</artifactId>
<version>${spring-boot-admin.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring-boot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-boot-admin server -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
<!-- spring-boot-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3, modifique la clase de inicio, agregue @EnableAdminServer
package com.cherry.boot.admin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
@EnableAdminServer
@SpringBootApplication
@ComponentScan("com.cherry.boot")
public class CherryBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(CherryBootAdminApplication.class, args);
}
}
2.4, configurar la seguridad
Configurar nombre de usuario y contraseña en application.yml
# security
spring:
security:
user:
name: admin
password: 123456
Agregar una clase de configuración de seguridad
package com.cherry.boot.admin.config;
import java.util.UUID;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
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 org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
/**
* spring security配置
*
* @author huangqinhua
* @version 1.0.0
* @date 2021/11/04 18:16
*/
@Configuration
public class BootAdminSecurityConfig extends WebSecurityConfigurerAdapter {
private final AdminServerProperties adminServer;
public BootAdminSecurityConfig(AdminServerProperties adminServer) {
this.adminServer = adminServer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http.authorizeRequests((authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**"))
.permitAll()
.antMatchers(this.adminServer.path("/login"))
.permitAll()
.anyRequest()
.authenticated())
.formLogin((formLogin) -> formLogin.loginPage(this.adminServer.path("/login"))
.successHandler(successHandler)
.and())
.logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout")))
.httpBasic(Customizer.withDefaults())
.csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers(new AntPathRequestMatcher(this.adminServer.path("/instances"), HttpMethod.POST.toString()),
new AntPathRequestMatcher(this.adminServer.path("/instances/*"), HttpMethod.DELETE.toString()),
new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))))
.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID()
.toString())
.tokenValiditySeconds(1209600));
}
}
2.5 Inicie el proyecto, ingrese http://localhost:8000
Interfaz de inicio de sesión
Interfaz principal