Skip to content

Latest commit

 

History

History
470 lines (334 loc) · 11.9 KB

boot-admin-微服务应用监控.md

File metadata and controls

470 lines (334 loc) · 11.9 KB

源码地址:https://github.com/langyastudio/langya-tech/tree/master/spring-cloud

SpringBoot 应用可以通过 Actuator 来暴露应用运行过程中的各项指标,Spring Boot Admin 通过这些指标来监控SpringBoot 应用,然后通过图形化界面呈现出来。Spring Boot Admin 不仅可以监控单体应用,还可以和 Spring Cloud的注册中心相结合来监控微服务应用。

Spring Boot Admin 可以提供应用的以下监控信息:

  • 监控应用运行过程中的概览信息
  • 度量指标信息,比如 JVM、内存、Tomcat 及进程信息
  • 环境变量信息,比如系统属性、系统环境变量以及应用配置信息
  • 查看所有创建的 Bean 信息
  • 查看应用中的所有配置信息
  • 查看应用运行日志信息
  • 查看 JVM 信息
  • 查看可以访问的 Web 端点
  • 查看 HTTP 跟踪信息
  • 查看审计事件
  • 查看计划任务
  • 支持 Spring Cloud 的 postable /env- &/refresh-endpoint

基本使用

添加 admin-server 模块

这里我们创建一个 admin-server 模块来作为监控中心演示其功能

在 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>
</dependency>

在 application.yml 中进行配置

server:
  port: 19001

spring:
  application:
    name: admin-server

management:
  endpoints:
    health:
      show-details: always
    web:
      exposure:
        include: '*'

在启动类上添加 @EnableAdminServer 来启用 admin-server 功能

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

添加 admin-client 模块

这里我们创建一个 admin-client 模块作为客户端注册到 admin-server

在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-client</artifactId>
</dependency>

在application.yml中进行配置

server:
  port: 19002


spring:
  application:
    name: admin-client
  boot:
    admin:
      client:
        #配置admin-server地址
        url: http://localhost:19001


management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

启动 admin-server 和 admin-client 服务

监控信息展示

访问如下地址打开 Spring Boot Admin 的主页:http://localhost:19001

image-20220106152827324

点击 wallboard 按钮,选择 admin-client 查看监控信息

监控信息概览

image-20220106153053898

度量指标信息,比如 JVM、Tomcat 及进程信息;

image-20220106153159021

环境变量信息,比如系统属性、系统环境变量以及应用配置信息;

image-20220106153320256

查看应用中的所有配置信息;

image-20220106153545210

查看日志信息,需要添加以下配置才能开启;

logging:
  file:
    name: admin-client.log 

image-20220106153910159

查看可以访问的 Web 端点

image-20220106154022123

结合注册中心使用

Spring Boot Admin 结合 Spring Cloud Alibaba Nacos 注册中心使用,只需将 admin-server 和注册中心整合即可,admin-server 会自动从注册中心获取服务列表,然后挨个获取监控信息。这里以 Nacos 注册中心为例来介绍下该功能

admin-server 修改

在 pom.xml 中添加相关依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在 application.yml 中进行配置,只需添加注册中心配置即可

server:
  port: 19001

spring:
  application:
    name: admin-server

  cloud:
    #Nacos
    nacos:
      username: nacos
      password: nacos
      discovery:
        server-addr: localhost:8848       

在启动类上添加 @EnableDiscoveryClient 来启用服务注册功能

@EnableDiscoveryClient
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(AdminServerApplication.class, args);
    }
}

admin-client 修改

在 pom.xml 中添加相关依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在 application.yml 中进行配置,删除原来的 admin-server 地址配置,添加注册中心配置即可

server:
  port: 19002

spring:
  application:
    name: admin-client
  #Nacos
  nacos:
    username: nacos
    password: nacos
    discovery:
      server-addr: localhost:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always


#添加开启admin的日志监控
logging:
  file:
    name: admin-client.log

在启动类上添加 @EnableDiscoveryClient 来启用服务注册功能

@EnableDiscoveryClient
@SpringBootApplication
public class AdminClientApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(AdminClientApplication.class, args);
    }
}

功能演示

  • 启动 nacos-server
  • 启动 admin-server、admin-client

查看注册中心发现服务均已注册:http://localhost:8848/

image-20220106154930427

查看 Spring Boot Admin 主页发现可以看到服务信息:http://localhost:19001

我们可以通过给 admin-server 添加 Spring Security 支持来获得登录认证功能

添加 admin-server-security 模块

在 pom.xml 中添加相关依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

在 application.yml 中进行配置,配置登录用户名和密码,忽略 admin-server-security 的监控信息

server:
  port: 19011

spring:
  application:
    name: admin-security-server

  cloud:
    #Nacos
    nacos:
      username: nacos
      password: nacos
      discovery:
        server-addr: localhost:8848

  # 配置登录用户名和密码
  security:
    user:
      name: admin
      password: 123456

对 SpringSecurity 进行配置,以便 admin-client 可以注册:

@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
    {
        SavedRequestAwareAuthenticationSuccessHandler successHandler =
                new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                //1.授予对所有静态资产和登录页面的公共访问权限
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/actuator/info").permitAll()
                .antMatchers(adminContextPath + "/actuator/health").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()

                //2.其他请求必须经过身份验证
                .anyRequest().authenticated()
                .and()

                //2.登录
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler)
                .and()

                //3.登出
                .logout().logoutUrl(adminContextPath + "/logout")
                .and()

                //4.开启http basic支持
                .httpBasic()
                .and()

                //5.开启基于cookie的csrf保护
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

                //6.忽略这些路径的csrf保护以便admin-client注册
                .ignoringRequestMatchers(
                        new AntPathRequestMatcher(adminContextPath + "/instances",
                                                  HttpMethod.POST.toString()),
                        new AntPathRequestMatcher(adminContextPath + "/instances/*",
                                                  HttpMethod.DELETE.toString()),
                        new AntPathRequestMatcher(adminContextPath + "/actuator/**")
                )
                .and()

                .rememberMe(rememberMe -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
    }
}

修改启动类,开启 AdminServer 及注册发现功能:

@EnableDiscoveryClient
@EnableAdminServer
@SpringBootApplication
public class AdminServerSecurityApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(AdminServerSecurityApplication.class, args);
    }
}

启动 nacos-server,admin-server-security,访问 Spring Boot Admin 主页发现需要登录才能访问:http://localhost:19011

image-20220106161240838

可以自定义通知、自定义Logo、标题、语言、增加跳转链接、移除页头菜单等。

例如定制登录标题、不显示 about 菜单、不显示 admin-server 的监控信息:

spring:
  application:
    name: admin-security-server

  # 配置admin
  boot:
    admin:
      ui:
        #页头左侧
        brand: <img src="assets/img/icon-spring-boot-admin.svg"><span>服务监控</span>
        #登录的标题
        title: 服务监控
        #隐藏 about 菜单
        view-settings:
          - name: about
            enabled: false
      discovery:
        #不显示admin-server的监控信息
        ignored-services: ${spring.application.name}

image-20220106172925570

参考

spring-boot-admin 官方文档

http://www.macrozheng.com/#/cloud/admin