十3、springboot 优雅集成spring-boot-admin 实现程序监控

前言

咱们知道项目的监控是尤其重要的,可是咱们若是用jdk 自带的jconsole 和jvisualvm 的话会很是繁琐,且界面不是很友好。以前咱们使用了spring boot 项目,可是都没有对项目有一个很好的监控。在spring 家族中有 spring-boot-admin 能够很好的帮咱们起到监控微服务项目的做用。java

spring-boot-admin 是一个针对 Spring Boot 的 Actuator 接口进行 UI 美化封装的监控工具,它能够在列表中浏览全部被监控 spring-boot 项目的基本信息、详细的 Health 信息、内存信息、JVM 信息、垃圾回收信息、各类配置信息(好比数据源、缓存列表和命中率)等,还能够直接修改 logger 的 level。linux

spring-boot-admin 分为服务端和客户端。服务端是一个单独的微服务,用来查看监控的项目的运行状况,客户端是咱们一个个的微服务项目。因此要想让咱们的项目被服务端监控到,就须要将咱们的服务注册到服务端去。git

好了,咱们来动手试试吧。程序员

admin-server

咱们先来搭建spring-boot-admin 的服务端,上面说了服务端是一个单独的项目。因此咱们建立一个新的springboot 项目。建立好后,咱们作一下修改。github

pom.xml

在pom 文件中,咱们引入 以下依赖web

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.quellanan</groupId>
    <artifactId>springbootadmin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootadmin</name>
    <description>springbootadmin project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
    </properties>

    <dependencies>

        <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>

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

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-dependencies</artifactId>
                <version>${spring-boot-admin.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

上面是我整个的pom 文件,能够看到我引入了web 、admin-starter-server、security。
若是考虑其余的,能够只引用admin-starter-server 就能够实现效果。spring

启动类

在咱们的启动类上加入@EnableAdminServer 注解,若是不加的话,项目能够正常启动,可是看不到任何东西。@EnableAdminServer 注解的做用就是启动监控。apache

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

配置 security

这样配置好以后,就能够启动项目啦,可是咱们这里先不启动,由于上一节咱们学习了,spring-boot-security .这里咱们将它用起来。
咱们前面已经引入了 security ,接下来,咱们在application中增长配置缓存

spring.security.user.name=admin
spring.security.user.password=123456

表示这个用户才能访问。另外咱们建立一个 SecurityConfig 类 继承 WebSecurityConfigurerAdapter 重写 configure(HttpSecurity http) 方法。代码以下:安全

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler
                = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");
        http.authorizeRequests()
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated().and()
                .formLogin().loginPage("/login")
                .successHandler(successHandler).and()
                .logout().logoutUrl("/logout").and()
                .httpBasic().and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(
                        "/instances",
                        "/actuator/**"
                );
    }
}

如今咱们启动一下项目看看。启动项目后输入

http://localhost:8080

会跳转到 登陆界面,进入主页如今是什么都没有的。
在这里插入图片描述

admin-client

到此咱们服务端的配置就已经能够了,如今咱们来配置一下客户端,咱们随便找一个Springboot 项目,或者本身建立一个新的项目均可以。

pom.xml

咱们先在pom 文件中加入admin-client 依赖,注意这里的版本须要和server 的版本一致。

<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.2.1</version>
        </dependency>

application.properties

而后咱们在 application.properties 文件中加入以下配置。

spring.boot.admin.client.url=http://localhost:8080
management.endpoints.web.exposure.include=*
spring.application.name=sdwlzlapp-file
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=123456

spring.boot.admin.client.url 指向咱们服务端的项目接口路径。
management.endpoints.web.exposure.include 表示将全部端口都暴露出来,能够被监控到。
spring.application.name 表示改项目在spring-boot-admin 上的的显示名称。
spring.boot.admin.client.username 和password 就是设置的用户名和密码了,这里须要注意的是,若是admin-server 中没有集成 security 的话,不用配置用户名和密码也能够注册进去,在服务端能够监控到,但若是admin-server 集成了security,就须要保证client 中配置的用户名和server 中配置的用户名密码保持一致。

测试

配置了上面这些,就就能够将项目注册到admin-server 中啦,咱们启动一下项目。
在这里插入图片描述

如今还有一个问题,若是咱们项目自己就集成的安全框架,好比security ,没有登陆的话不能访问接口,那这样的项目怎么被admin-server 监控到呢?好比就咱们上节将的security 的demo ,咱们注册进来,虽然监控到了,可是是一个失败的状态。
在这里插入图片描述
能够看到,不难发现问题,那就是监控的接口也被项目自己拦截了,因此才致使是失败的状态,那要怎么修改了呢,其实也好处理,将这几个接口放开就能够了。咱们在项目的SecurityConfig 类中configure(HttpSecurity http)加上
在这里插入图片描述
代码以下:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/", "/hello").permitAll()
            .antMatchers( "/actuator/**").permitAll()
            .antMatchers( "/instances").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            //.loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

这样咱们重启项目,就发现能够监控成功了。
在这里插入图片描述

番外

到此为止,咱们也算是将spring-boot-admin的大体功能演示了下。

代码上传到github:
https://github.com/QuellanAn/springbootadmin

后续加油♡

欢迎你们关注我的公众号 "程序员爱酸奶"

分享各类学习资料,包含java,linux,大数据等。资料包含视频文档以及源码,同时分享本人及投递的优质技术博文。

若是你们喜欢记得关注和分享哟❤

file

相关文章
相关标签/搜索