文章目录
前言
本文仅仅是针对怎么搭建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>