原创

微服务应用(三):Spring Boot Admin Web 管理和监控微服务

在 Spring Cloud 微服务架构中,使用 Spring Boot Admin 对微服务进行监控和管理。

关于 Spring Boot Admin 的基本应用,可参考 Spring Boot 2实践系列(十六):Spring Boot Admin - Actuator 监控管理 Web 框架 ,Spring Boot Actuator 可参考 Spring Boot 2实践系列(六):应用监控模块 Actuator 详解和集成Spring Boot Admin 2.14 官方文档

服务端

创建一个 Spring Boot Web 应用,此示例台 Spring Boot 2.1.5.RELEASE 和 Spring Cloud Greenwich.SR1 版本为例。

添加依赖

spring-boot-starter-web 依赖包含了 spring-boot-admin-server、spring-boot-admin-server-ui、spring-boot-admin-server-cloud 依赖

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

开启Server

在 Spring Boot 入口类上添加 @EnableAdminServer 注解来开启 Spring Boot Admin Server。

@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class SpringBootAdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminApplication.class, args);
    }
}

注册到微服务注册中心

添加注册中心客户端依赖,配置注册到注册中心URL。见 客户端 > 服务发现注册客户端 小节内容。

服务发现静态配置

Spring Cloud 提供了一个 SimpleDiscoveryClient,允许通过静态配置指定客户端应用。

pom.xml

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

application.yml

spring:
  cloud:
    discovery:
      client:
        simple:
          instances:
            test:
              - uri: http://instance1.intern:8080
                metadata:
                  management.context-path: /actuator
              - uri: http://instance2.intern:8080
                metadata:
                  management.context-path: /actuator

客户端

要注册到服务端的应用需要添加 Spring Boot Admin Client ,为了确保端点的安全,还需要添加 spring-boot-starter-security 依赖。

添加依赖

pom.xml

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.4</version>
</dependency>
<!-- 若要增加安全认证,取消下面注释
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>-->

静态注册客户端

# 设置通过 HTTP 暴露的端点
management.endpoints.web.exposure.include=*
# 开启显示详细信息
management.endpoint.health.show-details=always
# Spring Boot Admin Server URL
spring.boot.admin.client.url=http://localhost:8080
# IP 地址优先
spring.boot.admin.client.instance.prefer-ip=true

注意:如果 Spring Boot Admin Server 配置了 spring.boot.admin.context-path ,则在客户端配置的服务URL需要加上此值。

服务发现注册客户端

Spring Boot Admin Server 默认开启了服务发现来获取服务实例,在微服务集群架构,自动监控获取到的服务实例。

Sprign Boot 客户端应用和服务端应用都添加 Spring Cloud 依赖,添加 Eureka Client 依赖。更多关于 Eureka 配置可参考 Spring Cloud系列(二):服务发现之Eureka注册中心(1)-服务、客户端、安全认证。服务发现还可使用 Spring Cloud 自身提供的 DiscoveryClient 实现来完成。

pom.xml

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

客户端和服务端都添加注册到 Eureka Server 配置,示例如下:

application.properties

# eureka server 开启了安全认证,url 增加了身份认证信息
eureka.client.service-url.defaultZone=http://admin:123456@eureka.master.com:8761/eureka,http://admin:123456@eureka.slave.com:8762/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.health-check-url-path=/actuator/health
eureka.instance.metadata-map.startup=${random.int}
eureka.client.registry-fetch-interval-seconds=5

服务注册表中的信息同上 ServiceInstanceConverter 转换,Spring Boot Admin 附带一个默认和 Eureka 转换器实现,自动配置(AutoConfiguration)会选择一个正确的来使用。或提供自己的 ServiceInstanceConverter。

使用 Eureka 时,可通过设置 eureka.instance.healthCheckUrl 设置健康检测的端点。

查看客户端日志

客户端应用需输出日志到文件,使用 logging.file 属性配置,更多配置可参考台 logging 为前缀的属性,示例如下:

logging.file=${spring.application.name}.log

配置后,在管理 Web 页面的 Logging 导航栏可以看到输出到日志文件的内容。如果日志使用 logback 或 log4j2,则输出的日志路径必须与 logging.file 一致。

标记客户端实例

默认情况下,不会为客户端实例添加任何标记,由客户端通过向元数据信息或端点添加信息来指定所需的标记。可为实例自定义标记。

application.properties

#using the metadata
spring.boot.admin.client.instance.metadata.tags.environment=test

#using the info endpoint
info.tags.environment=test

安全认证

服务端开启安全认证

  1. 服务端添加 Spring Security 依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
  2. 服务端创建 Security Java 配置

    /**
     * @name: SecuritySecureConfig
     * @desc: Spring Security 配置
     **/
    @Configuration
    public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    
        private final String adminContextPath;
    
        public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
            this.adminContextPath = adminServerProperties.getContextPath();
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            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()
                    //启用HTTP-Basic支持。Spring Boot Admin Client注册必需的。
                    .httpBasic().and()
                    .csrf()
                    //使用Cookie启用CSRF保护
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    .ignoringAntMatchers(
                            //禁用CRSF-Protection Spring Boot Admin Client用于注册的端点。
                            adminContextPath + "/instances",
                            //禁用执行器端点的CRSF保护。
                            adminContextPath + "/actuator/**"
                    );
            // @formatter:on
        }
    }
    
  3. 服务端配置安全认证的账号和密码

    spring.security.user.name=user
    spring.security.user.password=123456
    
  4. 账号密码登录

    执行了上面安全认证的设置后,访问服务端的 Web 会先进入登录页面,需要输入用户名和密码才能成功登录。

  5. 客户端注册到服务端,需添加认证信息

    Spring Boot Admin Server 开启了安全认证后,在 Admin Client 应用的属性文件需要加上用户的认证信息。

    spring.boot.admin.client.username=user
    spring.boot.admin.client.password=123456
    

客户端开启安全认证

客户也可以通过添加 spring-boot-starter-security 依赖来开启安全认证保护客户端暴露的端点。

  1. 客户端同样添加 Spring Security 依赖

  2. 客户端配置安全认证的账号和密码

    spring.security.user.name=admin
    spring.security.user.password=123456
    
  3. 配置客户端元数据,在注册到 Admin Server 时将客户端的安全认证信息通过元数据传递给服务端

    服务端会从元数据中取出认证信息用于向客户端端点发送请求

    spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
    spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}
    
  4. 配置 Eureka Client 元数据,在注册到 Eureka Server 时将客户端的安全认证信息通过元数据传递给注册中心

    eureka.instance.metadata-map.user.name=${spring.security.user.name}
    eureka.instance.metadata-map.user.password=${spring.security.user.password}
    
  5. 配置忽略端点路径的跨域请求

    有些通过 HTTP 暴露的端点只支持 POST 请求,当使用 Spring Security 时,需要忽略对端点的 CSRF(跨域请求伪造)

    @Configuration
    public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().ignoringAntMatchers("/actuator/**");
        }
    }
    

安全认证注意事项

通过元数据提交认证凭据,应为 Spring Boot Admin 或 服务注册表URL 配置 HTTPS 。

在使用 Spring Cloud Discover 时,需要知道的是,任何可以查询服务注册表的用户都可以获取凭据。

安全认证还可以使用更复杂的 OAuth2 方案,可参考 joshiste/spring-boot-admin-samples 示例。

如果通过元数据传递配置信息,元数据优先于服务器配置。

服务端集群

Spring Boot Admin Server 可通过 Hazelcast 支持集群复制。 当存在 HazelcastConfigHazelcastInstance-Bean 时,它会自动启用。

还可以将 Hazelcast 实例配置为持久化,以使状态保持重新启动状态。 另请参阅 Spring Boot support for Hazelcast

  1. 添加 Hazelcast 依赖

    pom.xml

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
    </dependency>
    
  2. 实例化 HazelcastConfig

    @Configuration
    public class HazelcastConfig {
    
        @Bean
        public Config hazelcastConfig() {
            MapConfig mapConfig = new MapConfig("spring-boot-admin-event-store").setInMemoryFormat(InMemoryFormat.OBJECT)
                    .setBackupCount(1)
                    .setEvictionPolicy(EvictionPolicy.NONE)
                    .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));
            return new Config().setProperty("hazelcast.jmx", "true").addMapConfig(mapConfig);
        }
    }
    

通知信息

提醒通知过滤通知邮件通知页面即时通知 等等。

其它参考

GitHub > Spring Boot Admin ,提供了 consul、eureka、hazelcast、reactive、servlet、zookeeper 示例。

注意: Spring Boot Admin 2.0 已不包含对 Hystrix 和 Turbine 的支持。

正文到此结束
本文目录