美文网首页
Spring Boot Admin官方文档:2.1.6

Spring Boot Admin官方文档:2.1.6

作者: 一生逍遥一生 | 来源:发表于2019-08-22 18:24 被阅读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

参考文献

Spring Boot Admin 2.1.6 文档

相关文章

网友评论

      本文标题:Spring Boot Admin官方文档:2.1.6

      本文链接:https://www.haomeiwen.com/subject/sseosctx.html