Spring boot整合Spring boot Admin 监控应用

前言

本文仅仅是针对怎么搭建Spring Boot Admin的client端和server端。怎么配置实现服务client服务向server注册。使用security认证的server,由于暂时对security的不了解,所以使用的是百度的security配置,仅供参考。

我再这里将server端和client端独立部署,若想部署在同一个项目,也是可以的。如果你将单独部署弄懂后,合并成一个项目也是很简单的啦。


一、Spring Boot Admin 的作用是什么?

利用spring-boot-admin对SpringBoot应用程序信息进行可视化管理和监控。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册服务(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul)发现服务。

Spring Boot Admin提供了如下功能:

  • 显示健康状态及详细信息,如JVM和内存指标、数据源指标、缓存指标
  • 跟踪并下载日志文件
  • 查看jvm系统-和环境属性
  • 查看Spring启动配置属性
  • 方便loglevel管理
  • 查看线程转储
  • 视图http-traces
  • 查看http端点
  • 查看计划任务
  • 查看和删除活动会话(使用spring-session)
  • 状态更改通知(通过电子邮件、Slack、Hipchat…)
  • 状态变化的事件日志(非持久性)

下面的项目都使用2.2.1版本,因为Spring Boot Admin 2.2.1版本支持中文。为了版本统一,我这里spring boot也是使用2.2.1版本

二、搭建client端

client是指我们需要监控的任务,所以这部分配置比较简单,不会对我们原有的业务代码有改变。我们只需要添加依赖和配置就好。
spring-boot-admin 的监控实际上还是使用的是actuator。所以我们还是需要配置actuator。

1.引入依赖

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

2.添加配置

#端口号
server.port=8888
#项目名,如果不设定,默认是 / ,在访问的时候需要拼接
server.servlet.context-path=/study

#actuator配置
#这里用*代表暴露所有端点只是为了观察效果,实际中按照需进行端点暴露
management.endpoints.web.exposure.include=*
#详细信息显示给所有用户。
management.endpoint.health.show-details=always
#额外信息配置
info.app.name="@project.name@"
info.app.description="@project.description@"
info.app.version="@project.version@"
info.app.spring-boot-version="@project.parent.version@"


#客户端工程的名字,这个名字会注册到服务端展示
spring.application.name=Spring Boot Client My Name
#是否启用springbootAdmin客户端,默认为true
spring.boot.admin.client.enabled=true
# 要注册的server端的url地址。如果要同时在多个server端口注册,则用逗号分隔各个server端的url地址;
spring.boot.admin.client.url=http://127.0.0.1:8889/study/server/
# 注册到service的url值,当server端与client端不在同一台服务器上的时候,要配置该属性的值。如果不配置的话,server端就会根据默认的命名规则来配置该值
spring.boot.admin.client.instance.service-url=http://127.0.0.1:8888/study/
# 如果server端需要进行认证时,该属性用于配置用户名。如果使用security认证的客户端,这个用户名称和密码必须要和server端security的一致,否则服务不能被server认证发现
spring.boot.admin.client.username=admin
# 如果server端需要进行认证时,该属性用于配置密码。如果使用security认证的客户端,这个用户名称和密码必须要和server端security的一致,否则服务不能被server认证发现
spring.boot.admin.client.password= 123456


三、搭建server端

1.引入依赖

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

<!-- Admin Server 端, 2.2.0以后支持中文界面-->
<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-server</artifactId>
	<version>2.2.1</version>
</dependency>

2.添加配置

需要注意的点:
1、若配置了spring.boot.admin.context-path=server,那么访问的时候就需要在url后面带上。
2、在启动client和server端后。client端会根据配置的spring.boot.admin.client.url=http://127.0.0.1:8889/study/server/向服务端自动注册。如果你的client和server不在一台服务器上,就必须要在client端正确配置这地址。

# 端口号
server.port=8889
# 项目名,如果不设定,默认是 / ,在访问的时候需要拼接
server.servlet.context-path=/study

# server端的访问路径,默认是/。配置之后访问就需要变成:http://127.0.0.1:8889/study/server/
spring.boot.admin.context-path=server
# 更新client端状态的时间间隔,单位是毫秒,默认值是10秒钟
spring.boot.admin.monitor.period=10
# client端状态的生命周期,该生命周期内不会更新client状态。单位是毫秒,默认值是10秒钟
spring.boot.admin.monitor.status-lifetime=10
# 查询client状态信息时的连接超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为连接已经断开)。
spring.boot.admin.monitor.connect-timeout=2
# 查询client状态信息时的读取超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为读取失败)。
spring.boot.admin.monitor.read-timeout=2
# 在导航栏中显示的brand值,默认是"<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>";
#spring.boot.admin.ui.brand=
# 显示的页面标题,默认是"Spring Boot Admin"
spring.boot.admin.ui.title=Spring Boot Admin

3.启动类中添加@EnableAdminServer注解

@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminServerApplication
{
	 /**
    @SpringBootApplication 等同于@EnableAutoConfiguration+@ComponentScan
    @ComponentScan 默认会扫描该类所在的包下所有的配置类
    */
    public static void main(String[] args) {
       //启动整个springboot项目
       SpringApplication.run(SpringBootAdminServerApplication.class, args);
   }
}

四、搭建security认证的server端

搭建security认证的server端,是在普通server端的基础上搭建。所以请先搭建第三步中的server端后在进行以下步骤

1.引入security依赖



2.添加security配置

这里我给出的配置是在第三步的基础上增加的配置:
spring.security.user.name=admin
spring.security.user.password=123456

#端口号
server.port=8889
#项目名,如果不设定,默认是 / ,在访问的时候需要拼接
server.servlet.context-path=/study


# server端的访问路径,默认是/。配置之后访问就需要变成:http://127.0.0.1:8889/study/server/
spring.boot.admin.context-path=server
# 更新client端状态的时间间隔,单位是毫秒,默认值是10秒钟
spring.boot.admin.monitor.period=10
# client端状态的生命周期,该生命周期内不会更新client状态。单位是毫秒,默认值是10秒钟
spring.boot.admin.monitor.status-lifetime=10
# 查询client状态信息时的连接超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为连接已经断开)。
spring.boot.admin.monitor.connect-timeout=2
# 查询client状态信息时的读取超时时间,单位是毫秒,默认是2秒(如果2秒内没有获取到client的状态信息,则认为读取失败)。
spring.boot.admin.monitor.read-timeout=2
# 在导航栏中显示的brand值,默认是"<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>";
#spring.boot.admin.ui.brand=
# 显示的页面标题,默认是"Spring Boot Admin"
spring.boot.admin.ui.title=Spring Boot Admin

#security配置
spring.security.user.name=admin
spring.security.user.password=123456

3.创建security配置类

这个地方由于对security不太懂,所以两种配置都是百度的,大概功能就是,未登录的时候,跳转到登录页面。

package com.study.config;

import lombok.extern.log4j.Log4j;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;

/*import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
*/
import de.codecentric.boot.admin.server.config.AdminServerProperties;

@Log4j
@EnableWebSecurity
public class DimplesSecurityConfigure extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

    public DimplesSecurityConfigure(AdminServerProperties adminServerProperties) {
    	//adminContextPath的值就是spring.boot.admin.context-path配置的值
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	
    	//暂时不了解security,下面两种是百度的方法。
    	//方式1
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        http.authorizeRequests()
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()
                .antMatchers(adminContextPath + "/actuator/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf().disable();
        
        log.error("adminContextPath的值:"+this.adminContextPath);
        
        //方式2
        // 跨域设置,SpringBootAdmin客户端通过instances注册,见InstancesController
        /*http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(adminContextPath + "/instances");

        http.authorizeRequests().antMatchers(adminContextPath + "/assets/**").permitAll(); // 静态资源
        http.authorizeRequests().anyRequest().authenticated(); // 所有请求必须通过认证

        // 整合spring-boot-admin-server-ui
        http.formLogin().loginPage(adminContextPath+"/login").permitAll();
        http.logout().logoutUrl(adminContextPath+"/logout").logoutSuccessUrl("/login");

        // 启用basic认证,SpringBootAdmin客户端使用的是basic认证
        http.httpBasic();
        */
    }

}

五、演示

1.演示client和普通server端

启动服务。client端运行在8888端口,server端运行在8889端口。

我们访问http://127.0.0.1:8889/study/server/会自动重定向到http://127.0.0.1:8889/study/server/applications

在这里插入图片描述
点击客户端,可以进入到下面的页面:
在这里插入图片描述


2.演示client和security认证的server端

启动服务。client端运行在8888端口,server端运行在8889端口。

我们访问http://127.0.0.1:8889/study/server/会自动重定向到http://127.0.0.1:8889/study/server/login

注意:这个地方的密码是配置的security认证的密码。
在这里插入图片描述
登录后自动跳转到http://127.0.0.1:8889/study/server/applications

在这里插入图片描述
若这个地方没有client出现端,那么需要核对下面的配置:
在这里插入图片描述


六、Spring boot Admin 常用配置:

基本常用配置我已经在上面demo的配置中给出。其他配置请参考下面大佬的连接。
https://blog.csdn.net/feidie436/article/details/81381841
https://www.liangzl.com/get-article-detail-145490.html


七、异常处理

在srver端控制台中,经常会抛出如下异常:

java.lang.IllegalStateException: Calling [asyncError()] is not valid for a request with Async state [MUST_DISPATCH]
	at org.apache.coyote.AsyncStateMachine.asyncError(AsyncStateMachine.java:440) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:512) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.Request.action(Request.java:430) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:401) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_211]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_211]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]

该异常不影响程序正常运行,如果要解决这个异常,可以将Tomcat容器替换为Jetty,修改server端的pom:

dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 替换为 jetty-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

八、完整的项目地址

项目的git地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值