Spring Boot Admin教程

18-11-23 banq
    

Spring Boot Admin是在Spring Boot Actuator端点上监控和管理具有良好UI的Spring Boot应用程序。

Actuator是一个Spring Boot模块,它为您的应用程序添加了REST / JMX端点,因此您可以在生产中轻松监控和管理它。端点提供运行状况检查,度量标准监视,日志访问,线程转储,堆转储,环境信息等。

Actuator功能强大且功能强大,使用其他应用程序使用端点非常简单方便 - 您只需进行简单的REST调用即可。当人使用它时,它并不是那么友好。对于人类而言,拥有一个可用于浏览所有监控数据和管理应用程序的良好用户界面会更方便。这实际上是Spring Boot Admin所做的。它为执行器端点提供了一个漂亮的UI层,顶部有一些额外的功能。

Spring Boot Admin不是Spring团队提供的核心模块,它是由一个名为Codecentric的公司创建的。不过,代码在Github上是公开的,而且是免费的。

客户端和服务器

与Actuator不同,Spring Boot Admin实际上分为两部分 - 客户端和服务器。

服务器部分包含管理员用户界面,并独立于受监视的应用程序运行。客户端部分位于受监视的应用程序中,该应用程序向管理服务器部分注册。

这样,即使我们的应用程序关闭或无法正常工作,监视服务器仍然正常运行。现在假设您有多个应用程序(例如Spring Boot微服务),并且每个应用程序都可以在多个实例中运行。使用传统的Actuator监控,这很难,因为您需要单独访问每个实例,并且需要跟踪有多少实例和运行的位置。

使用Spring Boot Admin,受监视应用程序(Client)的每个实例在启动后都会向Server注册。然后你有一个点(管理服务器),你可以在那里检查它们。

服务器设置

我们首先来看看如何设置Spring Boot Admin Server。让我们从一个全新的Spring Boot应用程序开始。您可以使用Spring Initializr轻松创建一个。务必包含该web模块。

创建项目后,我们首先需要添加Spring Boot Admin Server依赖项:

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.0</version>
</dependency>

请注意,即使项目不是由Pivotal创建的,您也可以在Spring Initializr中找到Spring Boot Admin的客户端和服务器模块。接下来,我们需要通过以下方式注释我们的主应用程序类来启用管理服务器@EnableAdminServer:

@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminServerApplication.class, args);
    }
}

就是这样。现在您可以运行您的应用程序,打开http://localhost:8080/,服务器已经运行,但尚未注册任何客户端

客户端安装

与服务器设置相同,第一步是为现有应用程序添加适当的依赖关系:

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.0</version>
</dependency>

然后,您需要定义运行管理服务器的URL。将此行添加到您的application.properties:

spring.boot.admin.client.url=http://localhost:8080

添加Actuator

现在您应该能够运行客户端和服务器。只需确保没有端口冲突,因为默认情况下两个应用程序都使用8080.出于测试目的,您可以application.properties中设置server.port=0,这样您的客户端将在启动时使用随机端口。这样,您可以测试启动在不同端口上运行的多个实例。

当您打开管理服务器UI时,您应该看到您的应用程序。单击应用程序名称时,应显示包含应用程序详细信息的页面。

请记住,Spring Boot Admin在引擎盖下使用了Actuator端点。幸运的是,您只需添加一个简单的依赖项,自动配置就可以完成剩下的工作。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

但是,默认情况下,Actuator不会公开大多数端点。您需要更改配置application.properties以公开它们:

management.endpoints.web.exposure.include=*

暴露Actuator端点后,您应该在Admin界面中看到更多信息

安全

现在,当一切都在运行时,我们应该确保我们的Actuator端点和管理UI不会公开给所有人。

1.客户端安全

如果还没有使用Spring Security,则需要先添加依赖项,默认情况下Actuator端点是安全的,并且您的管理服务器将无法访问它们。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

出于测试目的,您可以暂时禁用Actuator端点安全性management.security.enabled=false。但是,我们确实希望启用安全性。如果您使用的是基本身份验证,则只需在属性文件中提供用户名和密码即可。管理服务器将使用这些凭据对客户端的Actuator端点进行身份验证:

spring.boot.admin.client.instance.metadata.user.name=joe spring.boot.admin.client.instance.metadata.user.password=my-secret-password

默认情况下,如果没有另外配置,Spring Boot会在user每次启动应用程序时使用默认用户和自动生成的密码。您可以在启动期间在控制台中检查密码。如果您想明确提供应用程序所需的用户名和密码,可以在属性中定义它:

spring.security.user.name=joe

spring.security.user.password=my-secret-password

2.服务器安全

与客户端相同,我们需要添加Spring Security依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

现在,让我们配置登录管理服务器所需的用户名和密码application.properties:

spring.security.user.name=admin

spring.security.user.password=admin-password

现在在您的客户端中,您还需要添加这些凭据,否则它将无法向服务器注册:

spring.boot.admin.client.username=admin

spring.boot.admin.client.password=admin-password

现在回到服务器部分。我们需要的最后一件事是添加Spring Security配置以保护Admin用户界面:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler 
            = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");

        http.authorizeRequests()
            .antMatchers("/assets/**").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated().and()
            .formLogin().loginPage("/login")
            .successHandler(successHandler).and()
            .logout().logoutUrl("/logout").and()
            .httpBasic().and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .ignoringAntMatchers(
                "/instances",
                "/actuator/**"
             );
    }
}

它的作用是,它仅将管理UI限制为使用HTTP基本身份验证和通过表单登录的经过身份验证的用户。登录页面本身和静态UI资源(javascript,HTML,CSS)是公共的。否则,您无法登录。然后有一个基于cookie的跨站点请求伪造保护。您可以看到CSRF保护中忽略了某些路径 - 这是因为管理服务器当前缺乏适当的支持

现在重启后,您应该会看到一个很好的登录屏幕来保护您的管理服务器

云发现

Spring Boot Admin客户端不是向服务器注册应用程序的唯一方法。Admin Server还支持Spring Cloud Service Discovery。您可以在官方文档Spring Boot Discovery中使用Spring Boot Admin文章阅读更多内容。

通知

一旦您进行了监控,您希望在出现问题时收到通知。好消息是Spring Admin提供了各种各样的通知选项。

如果您是第一次访问“管理服务器”页面,它会要求您在计算机上显示推送通知的权限。每当出现问题时,您都会收到一条弹出消息。

其他通知需要简单的配置。只要在application.properties提供一些输入配置。目前支持的服务包括:

配置电子邮件通知

如果要启用电子邮件通知,则需要将Spring电子邮件依赖项添加到服务器部分:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

然后,您需要定义SMTP服务器,该服务器将用于发送电子邮件通知和凭据。更新application.properties管理邮件服务器。

spring.mail.host=smtp.foo.com

spring.mail.username=smtp-server-user

spring.mail.password=smtp-server-password

然后,您需要定义收件人和发件人。

# Sender email address
spring.boot.admin.notify.mail.from="Spring Boot Admin <noreply@foo.com>"
# Comma-delimited list of recipient email addresses
spring.boot.admin.notify.mail.to=alice@foo.com,bob@bar.com
# Comma-delimited list of carbon copy recipient email addresses
spring.boot.admin.notify.mail.cc=joe@foo.com