Docker 环境下使用 SpringBootAdmin2.x 教程

本贴最后更新于 2260 天前,其中的信息可能已经事过景迁

Spring Boot Admin 2.x 是一个用于监测管理微服务应用的程序,通过 Eureka 注册中心发现服务,然后获取服务的运行状态、日志信息、并提供一套 UI 界面供系统运维人员检查,同时结合 Spring Security 进行登录权限认证

首先上完整的 Github 项目代码: liumapp/spring-boot-admin-in-docker

然后是完整的 Wiki 文档:使用文档

所需依赖

  • spring boot 2.0.2

  • spring cloud Finchley.RELEASE

  • codecentric 的 spring-boot-admin 2.0.2

  • docker 及 docker-compose

  • maven

快速启动

更新 admin-server 和 admin-client 的 application.yml 配置文件

spring:
     profiles:
         active: docker

使用以下命令安装 docker 镜像

./build-image.sh

使用以下命令启动 docker 容器

docker-compose up -d

等待几十秒后,用浏览器访问 http://localhost:8766

登录用户名是 : admin

登录密码是 : adminadmin

你可以在 admin-server 的 application.yml 中更改账号密码

使用以下命令停止容器:

docker-compose down

使用以下命令删除 docker 镜像:

./rm-image.sh        

日志管理

首先请 clone 项目到本地

如果您只希望了解跟日志管理相关的内容,那么请使用 git 命令切换到 v1.2.0 的 tag

git checkout v1.2.0

在这个版本下,我们基于 v1.0.0 的版本,对 admin-client 进行了一些配置上的改动:

logging:
  file: /usr/local/tomcat/project/spring-boot-admin-in-docker/log/admin-client.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"
management:
  endpoints:
    web:
      exposure:
        include: "*"    

上面的改动中,我们通过 management 开放了所有的 actuator 节点信息,因为在 springboot2.x 系列下,默认只开放了三个,如果您希望在 admin-server 中查询到详细信息,您需要全部开启他们

然后 logging.file 指向日志文件的存放地址,请确保该目录具有可写权限

之后再依次运行 admin-eureka、admin-client 跟 admin-server

访问浏览器的 http://localhost:8766/ ,在点击 admin-client 进入详情页,我们可以发现所有的配置信息包括日志信息将会罗列出来

配置 Spring Security

如果您只希望了解跟 Spring Security 相关的内容首先请将项目切换到 v1.3.0 版本

git checkout v1.3.0

在之前的版本中,我们并没有引入 spring security

这意味着 admin-server 管理控制台随便是谁都可以登录,这在本地开放环境下是没有什么影响的

但是如果发布到线上呢?

所以接下来要实现的功能,就是给 admin-server 添加一个登录登出的界面跟按钮

首先我们要对 admin-server 引入 spring security

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

随后进行配置:

spring:
  security:
    user:
      name: "admin"
      password: "adminadmin"

eureka:
    metadata-map:
      user.name: "admin"
      user.password: "adminadmin"

user.name 与 user.password 便是登录的账号与密码

接下来修改启动类的代码:

@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableAdminServer
public class AdminServerMain {

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

    @Configuration
    public static 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()
                    .httpBasic().and()
                    .csrf()
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    .ignoringAntMatchers(
                            adminContextPath + "/instances",
                            adminContextPath + "/actuator/**",
                            adminContextPath + "/logout"
                    );
            // @formatter:on
        }

    }

}         

启动类代码主要是参考 spring boot admin 官方手册上的

但是他们的官方手册有一个 bug:

当你完全按照官方手册上来的做,你会发现点击"log out"按钮的时候,会报 403 异常

我附上的代码把这个 bug 解决掉了

接下来配置 admin-client 端,只需要在其注册到 eureka 的时候,附上 admin-server 配置的账号密码即可:

eureka:
  instance:
    metadata-map:
      user.name: "admin"
      user.password: "adminadmin"

Docker 环境下运行

接下来我们利用 docker-compose 将 admin-client、admin-server 以及 admin-eureka 部署到 docker 环境下面运行

如果您只希望了解跟 Docker 环境下运行的内容,请利用 git 命令,将项目代码切换到 v2.1.0 版本

git checkout v2.1.0

版本切换后,项目目录下面会多出三个文件:build-image.sh、rm-image.sh 和 docker-compose.yml

  • build-image.sh

    脚本文件,用于安装三个微服务(admin-client、admin-server 和 admin-eureka)的 docker 镜像

  • rm-image.sh

    脚本文件,用于删除三个微服务的 docker 镜像

    ps:要删除镜像,必须在镜像生成的容器处于 stop 状态下才可以执行

  • docker-compose.yml

    在执行完 build-image.sh 之后,通过 docker-compose 编排工具,启动容器的配置文件

    具体启动命令为:

      docker-compose up -d
    

    停止命令为:

      docker-compose down
    

利用 docker-compose up -d 命令启动成功后,我们可以访问浏览器的 admin-server 界面

您也可以通过 Docker 的容器工具:kitmatic 来查看容器的运行状态

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...