SpringBoot Admin的简单使用的方法步骤

目录
  • 一、快速入门
    • 1.1 SpringBoot Admin服务端的搭建
    • 1.2 SpringBootAdmin client端搭建
    • 1.3 效果展示
  • 二、安全性
    • 2.1 admin-server端安全加固
    • 2.2 admin-client端的安全
  • 三、小结

公司有个SpringBoot项目需要加个监控,网上找了下发现大家都在推荐SpringBootAdmin。SpringBoot Admin是开源社区孵化的项目,用于对SpringBoot应用的管理和监控。SpringBoot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用http通讯方式实现数据交互;单体项目中需要整合spring-boot-admin-client才能让应用被监控。在SpringCloud项目中,spring-boot-admin-server 是直接从注册中心抓取应用信息,不需要每个微服务应用整合spring-boot-admin-client就可以实现应用的管理和监控。

官网参考链接:https://codecentric.github.io/spring-boot-admin/2.2.4/

本文只叙述SpringBoot Admin 管理和监控单体应用 ,不涉及SpringCloud相关的内容 。

一、快速入门

1.1 SpringBoot Admin服务端的搭建

(1) Maven依赖说明 SpringBoot版本

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

添加SpringBootAdmin server依赖及SpringBoot web 依赖

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

    <!--这里由于我的springboot版本是2.2.10.RELEASE,所以 springboot admin 也要用2.2.x版-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>2.2.4</version>
    </dependency>

(2)application.yml中配置端口

# 指定端口
server:
	port: 23333

(3)编写启动类并开启SpringBootAdminServer

 package com.zcode.monitor.server;
    import de.codecentric.boot.admin.server.config.EnableAdminServer;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    /**
     * AdminServerApplication
     * @author ZENG.XIAO.YAN
     * @version 1.0
     * @Date 2020-11-12
     */
    @EnableAdminServer // 开启 springboot admin 服务端
    @SpringBootApplication
    public class AdminServerApplication {

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

(4)浏览器访问测试 浏览器访问 http://localhost:23333/ 出现以下页面说明SpringBoot Admin服务端搭建成功

1.2 SpringBootAdmin client端搭建

备注:所谓的 client端就是指我们需要被监控的应用端。这里我们写一个简单点的SpringBoot web应用做演示

(1)Maven依赖说明

SpringBoot版本如下

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

添加SpringBootAdmin client 依赖及SpringBoot web 依赖。这里不需要添加SpringBoot actuator 依赖,因为SpringBootAdmin client里面已经包含了actuator相关依赖

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

        <!--这里由于我的springboot版本是2.2.10.RELEASE,所以 springboot admin 也要用2.2.x版-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.2.4</version>
        </dependency>

(2) application.yml配置

在yml中需要 配置如下信息:

应用端口

开放端点用于SpringBootAdmin 监控

配置应用名称(该名称会在SpringBoot Admin的管理页面显示)

配置Admin Server的地址

配置下日志文件的文件名和存放位置 (如果不配置则会看不到日志)

# 端口
server:
  port: 9088

#开放端点用于SpringBoot Admin的监控
management:
  endpoints:
    web:
      exposure:
        include: '*'

spring:
  application:
    name: admin-client # 给client应用取个名字

  boot:
    admin:
      client:
        url:  http://localhost:23333   #这里配置admin server 的地址

logging:
  file:
    name: admin-client.log  #配置生成日志文件名称

(3)写一个Controller模拟一个普通的接口

通过浏览器访问这个接口就会打印日志,具体代码如下

  /**
     * HelloController
     *
     * @author ZENG.XIAO.YAN
     * @version 1.0
     * @Date 2020-11-16
     */
    @Slf4j
    @RestController
    @RequestMapping("api")
    public class HelloController {
        private AtomicInteger count = new AtomicInteger(0);

        @GetMapping("hi")
        private String sayHi() {
            // 每次进来如打印下日志
            log.info("{} 啪...我第{}次进来了.", LocalDateTime.now(),  count.addAndGet(1));
            // 每次进来new 个大对象,便于监控观察堆内存变化
            byte[] bytes = new byte[100*1024*1024];
            log.info("new了 100MB");
            return "hi springboot addmin " + LocalDateTime.now();
        }
    }

(4)写个启动类

启动类代码就很简单了,就是一个普通的SpringBoot项目的启动类,上面没加其他注解。具体如下

@SpringBootApplication
public class AdminClientApplication {

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

1.3 效果展示

(1)已管理的应用会在应用墙上展示

当我们的admin-client项目启动后,在 admin-server的管理页面的应用墙上就能看到admin-client这个应用了,具体可参考下图

(2)可查看应用的具体信息

在应用墙点击这个应用,我们可以看到这个应用的具体信息,如堆内存变化及线程数等。具体可参考下图

(3)日志查看及堆内存变化观察

请求我们在admin-client中写的模拟接口 http://localhost:9088/api/hi ,该接口请求一次则会输出日志,同时开辟100MB的堆内存空间。
请求多次后在网页上可以实时的看到日志如下图

由于我们直接new了100MB的大对象,此时可以查看细节中的堆内存变化;具体如下图

二、安全性

2.1 admin-server端安全加固

这个SpringBoot Admin的管理后台如果没密码就能访问,那实在太不安全了,因此我们要给它加上登录的功能。

参考SpringBoot Admin的官方文档,我们可以在Admin-Server端添加Spring Security 相关依赖及就可以实现需要登录后才能访问网页管理面板。

官网参考链接为:https://codecentric.github.io/spring-boot-admin/2.2.4/#_securing_client_actuator_endpoints

下面开始具体的改造

(1)admin-server添加Spring Security 相关依赖

  <!--springboot admin 安全相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

(2)admin-server 设置账号和密码

在application.yml配置账号和密码

# 配置一个账号和密码
spring:
  security:
    user:
      name: admin
      password: root123456

(3)admin-server 添加一个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 {
            SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
            successHandler.setTargetUrlParameter("redirectTo");
            successHandler.setDefaultTargetUrl(adminContextPath + "/");
            http.authorizeRequests()
                    //1.配置所有静态资源和登录页可以公开访问
                    .antMatchers(adminContextPath + "/assets/**").permitAll()
                    .antMatchers(adminContextPath + "/login").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    //2.配置登录和登出路径
                    .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                    .logout().logoutUrl(adminContextPath + "/logout").and()
                    //3.开启http basic支持,admin-client注册时需要使用
                    .httpBasic().and()
                    .csrf()
                    //4.开启基于cookie的csrf保护
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    //5.忽略这些路径的csrf保护以便admin-client注册
                    .ignoringAntMatchers(
                            adminContextPath + "/instances",
                            adminContextPath + "/actuator/**"
                    );
        }
    }

(4)admin-server 安全加固后访问测试

再次访问http://localhost:23333/ ,发现需要登录

当我们输入正确的账号密码登录后,情况如下图

这个时候的应用数居然变成了0了,在我们没进行安全加固时是有一个admin-client应用的,为什么就不见了? 原因是添加了账号密码认证后,admin-client端也需要配置下 admin-server的账号和密码。

(5)admin-client 端设置 admin-server的账号密码

admin-client 注册到 admin-server时,admin-server端有个http Basic认证,通过了认证后 admin-client才能注册到 admin-server上。 admin-client的application.yml中配置访问密码配置可参考下面代码

spring:
  application:
    name: admin-client # 给client应用取个名字

  boot:
    admin:
      client:
        url:  http://localhost:23333 #这里配置admin server 的地址
        # 配置 admin-server的账号和密码
        username: admin
        password: root123456

(6) 再次访问 admin-server 管理后台 当我们登录后,终于再次看到了我们的admin-client这个应用

2.2 admin-client端的安全

admin-client端如果把actuator端点都暴露出来,是非常不安全的。因此我们可以添加Spring Security对admin-client 也进行安全加固。

下面所有操作均在admin-client中进行

(1)添加Spring Security依赖

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

(2)yml配置

yml中需要设置client的账号和密码,官网相关配置如下图所示

本次演示的admin-client的相关yml配置参考下面代码

spring:
  application:
    name: admin-client # 给client应用取个名字

  boot:
    admin:
      client:
        url:  http://localhost:23333 #这里配置admin server 的地址
        # 配置 admin-server的账号和密码
        username: admin
        password: root123456
        instance:
          metadata:
            # 这里配置admin-client的账号和密码
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}

  # admin-client 的用户名和密码
  security:
    user:
      name: clientAdmin
      password: 123456

(3)添加Spring Security 配置类

为何要到配置?因为Spring Security不配置时会把所有请求都拦截的,而我们这里只需要拦截监控端点/actuator/**即可。同时,官网中提到admin-server访问admin-client时,也是采用http Basic认证方式的;因此需要配置Spring Security支持Http Basic认证方式。

  @Configuration
    @Slf4j
    public class SpringSecurityActuatorConfig extends WebSecurityConfigurerAdapter {

        public SpringSecurityActuatorConfig() {
            log.info("SpringSecurityActuatorConfig... start");
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //  这个配置只针对  /actuator/** 的请求生效
            http.antMatcher("/actuator/**")
                    // /actuator/下所有请求都要认证
                    .authorizeRequests().anyRequest().authenticated()
                    // 启用httpBasic认证模式,当springboot admin-client 配置了密码时,
                    // admin-server走httpbasic的认证方式来拉取client的信息
                    .and().httpBasic()
                    // 禁用csrf
                    .and().csrf().disable();

        }
    }

(4)效果展示

admin-server端依旧能看到admin-client的信息,说明我们添加SpringSecurity 后 admin-server的监控管理功能正常,具体见下图

当我们去访问admin-client的监控端点http://localhost:9088/actuator/health 时,发现需要进行http Basic认证;这也证明了我们的认证拦截只拦截了监控端点。效果如下图

(5)存在的问题

通过上面的一通配置,admin-client 添加 Spring Security 对actuator的端点进行安全认证的功能是实现了,但也存在着问题。 当我们项目本来就是使用SpringSecurity 安全框架进行认证和授权时。上述的配置就要做修改了。因为我们一般都不用HttpBasic认证,而是用的表单登录认证。也就出现了配置多个Spring Security的问题。虽然有这个问题,但是网上还是有解决方案的。

(6)多个Spring Security共存方案

这个方案是在Spring Security官方文档里面找到的 链接为: https://docs.spring.io/spring-security/site/docs/5.3.5.RELEASE/reference/html5/ 官网关键信息截图如下:

里面的重点就是通过添加Order注解来指定多个Spring Security的优先级

下面直接贴上我的代码;为了直观,我就在同一个类里面建了2个静态的Spring Security配置类

/**
 * SpringSecurity 表单和HttpBasic 共存配置参考,写在一个类里面方便对比
 * @author ZENG.XIAO.YAN
 * @Date 2020-11-11
 * @version 1.0
 */
@Slf4j
public class SpringSecurityConfig2 {

    /*
     * 这个表单和HttpBasic 共存配置玩法,参考url如下:
     *  官方url:https://docs.spring.io/spring-security/site/docs/4.2.3.BUILD-SNAPSHOT/reference/htmlsingle/#multiple-httpsecurity
     *  项目启动日志如下,可以看到创建了2条过滤链
	 * 2020-11-11 22:57:56.340  INFO 12692 --- [main] o.s.s.web.DefaultSecurityFilterChain: Creating filter chain: Ant [pattern='/actuator/**'],
	 * 2020-11-11 22:57:56.344  INFO 12692 --- [main] o.s.s.web.DefaultSecurityFilterChain: Creating filter chain: any request,
     */

    /**
     * HttpBasic 认证方式,只对/actuator/** 生效,由于设置了Order,优先级会高于FormLoginWebSecurityConfigurerAdapter
     * @author ZENG.XIAO.YAN
     * @Date 2020-11-11
     * @version 1.0
     */
    @Configuration
    @Order(1)
    public static class HttpBasicSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        public HttpBasicSecurityConfigurationAdapter() {
            log.info("HttpBasicSecurityConfigurationAdapter... start");
        }

        protected void configure(HttpSecurity http) throws Exception {
            //  这个配置只针对  /actuator/** 的请求生效
            http.antMatcher("/actuator/**")
                    // /actuator/下所有请求都要认证
                    .authorizeRequests().anyRequest().authenticated()
                    // 启用httpBasic认证模式,当springboot admin-client 配置了密码时,
                    // admin-server走httpbasic的认证方式来拉取client的信息
                    .and().httpBasic()
                    // 禁用csrf
                    .and().csrf().disable();
        }
    }

    /**
     * 表单登录认证方式配置,由于没有指定Order,所以默认是最大2147483647,数值越大,优先级越低
     * @author ZENG.XIAO.YAN
     * @Date 2020-11-11
     * @version 1.0
     */
    @Configuration
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        public FormLoginWebSecurityConfigurerAdapter() {
            log.info("FormLoginWebSecurityConfigurerAdapter... start");
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin();
        }
    }

}

添加完这个配置类后,记得把我们上面配置的SpringSecurityActuatorConfig 这个类删除了,然后重启项目。效果如下:

访问http://localhost:9088/actuator/health ,则出现的是httpBasic认证的页面

访问 http://localhost:9088/api/hi,则出现的是Spring Security 自带的表单登录页面

访问admin-server 的管理页面,发现admin-client应用信息正常,说明本次修改的Spring Security配置没有问题

三、小结

(1)本文介绍了SpringBoot Admin的简单使用,同时介绍了admin-server端的安全配置和admin-client端的安全配置

(2)在介绍admin-client端的安全配置时,引申出了 如何实现多个SpringSecurity 配置 共存

作者:zeng1994
出处:http://www.cnblogs.com/zeng1994/
本文版权归作者和博客园共有,欢迎转载!但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!

到此这篇关于SpringBoot Admin的简单使用的方法步骤的文章就介绍到这了,更多相关SpringBoot Admin使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot Admin使用及心跳检测原理分析

    目录 介绍 使用 Server端 Client端 心跳检测/健康检测原理 原理 调试准备 客户端发起POST请求 服务端定时轮询 介绍 Spring Boot Admin是一个Github上的一个开源项目,它在Spring Boot Actuator的基础上提供简洁的可视化WEB UI,是用来管理 Spring Boot 应用程序的一个简单的界面,提供如下功能: 显示 name/id 和版本号 显示在线状态 Logging日志级别管理 JMX beans管理 Threads会话和线程管理 Tra

  • SpringBoot Admin 使用指南(推荐)

    Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序. 这些应用程序通过 Spring Boot Admin Client(通过 HTTP)注册或者使用 Spring Cloud(例如 Eureka)发现. UI只是 Spring Boot Actuator 端点上的一个 AngularJs 应用程序. 快速开始 首先在 IDEA 创建一个 SpringBoot 项目,把它当作 server 端,工程如下: 然后在 pom.xml 中引入依赖: <

  • SpringBoot Admin的简单使用的方法步骤

    目录 一.快速入门 1.1 SpringBoot Admin服务端的搭建 1.2 SpringBootAdmin client端搭建 1.3 效果展示 二.安全性 2.1 admin-server端安全加固 2.2 admin-client端的安全 三.小结 公司有个SpringBoot项目需要加个监控,网上找了下发现大家都在推荐SpringBootAdmin.SpringBoot Admin是开源社区孵化的项目,用于对SpringBoot应用的管理和监控.SpringBoot Admin 分为

  • springboot配置mongodb连接池的方法步骤

    application.yml 配置 mongodb: address: localhost:27017 database: soms username: admin password: 123456 # 连接池配置 clientName: soms-task # 客户端的标识,用于定位请求来源等 connectionTimeoutMs: 10000 # TCP连接超时,毫秒 readTimeoutMs: 15000 # TCP读取超时,毫秒 poolMaxWaitTimeMs: 3000 #当

  • SpringBoot配置MongoDB多数据源的方法步骤

    1.项目构建 添加 pom 文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.在 application.properties 中添加配置 ##start mongodb for basic #-------------

  • SpringBoot快速迁移至Quarkus的方法步骤

    Quarkus 是一个目前非常火的 Java 应用开发框架,定位是轻量级的微服务框架.,Quarkus 提供了优秀的容器化整合能力,相较于传统开发框架(Spring Boot)有着更快的启动速度.更小的内存消耗.更短的服务响应. 本文将演示将 SpringBoot 迁移至 Quarkus Spring Boot 示例程序 使用 JPA 完成 数据库的增删改查操作,基础代码如下 maven 依赖 <dependency> <groupId>org.springframework.bo

  • Springboot Redis设置key前缀的方法步骤

    properties中配置 #redis redis.masterClusterNodes=10.40.57.197:7000;10.40.57.198:7002;10.40.57.199:7004 redis.slaveClusterNodes=10.40.57.197:7001;10.40.57.198:7003;10.40.57.199:7005 redis.maxTotal=50 redis.maxIdle=10 redis.minIdle=1 redis.maxWaitMillis=1

  • SpringBoot使用Redis缓存MySql的方法步骤

    目录 1项目组成 2运行springboot 2.1官网download最基本的restful应用 2.2运行应用 3访问mysql 4设置redis缓存 1 项目组成 应用:springboot rest api 数据库:mysql jdbc框架:jpa 缓存中间件:redis 2 运行springboot 2.1 官网download最基本的restful应用 教程地址:https://spring.io/guides/gs/rest-service/ 直接download成品,找到git命

  • Springboot 配置RabbitMQ文档的方法步骤

    简介 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗 概念: 生产者 消息的产生方,负责将消息推送到消息队列 消费者 消息的最终接受方,负责监听队列中的对应消息,消费消息 队列 消息的寄存器,负责存放生产者发送的消息 交换机 负责根据一定规则分发生产者产生的消息 绑定 完成交换机和队列之间的绑定 模式: direct:直连模式,用于实例间的任务分发 topic:话题模式,通过可配置的规则分发给绑定在该

  • SpringBoot+Redis执行lua脚本的方法步骤

    1.背景 有时候,我们需要一次性操作多个 Redis 命令,但是 这样的多个操作不具备原子性,而且 Redis 的事务也不够强大,不支持事务的回滚,还无法实现命令之间的逻辑关系计算.所以,一般在开发中,我们会利用 lua 脚本来实现 Redis 的事务. 2.lua 脚本 Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行. 使用 lua 脚本的好处: 原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入. 减少网络开销:可

  • JWT整合Springboot的方法步骤

    目录 1.基于JWT认证 1.1 认证流程 1.2 JWT优势 1.3 JWT的结构是什么 2.使用JWT 3.整合Springboot 1.基于JWT认证 1.1 认证流程 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口.这一过程一般是一个HTTP POST请求.建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探. 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个J

  • SpringBoot构建ORM框架的方法步骤

    目录 1.增加依赖 2.数据库实体模型 3.增加Mapper 4.@Mapper或者@MapperScan 5.配置连接 目前常用的ORM框架有 Mybatis(batis).MybatisPlus,Hibernate.Jpa等几个框架,今天就简单介绍一下搭建Mybatisplus框架的流程. 1.增加依赖 <dependencies>         <!--        第一步:选择ORM框架,使用springboot整合mybatis-plus依赖包-->        

随机推荐