spring-boot-admin 監控


監控單體應用

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

Admin Server 端

<dependencies>
  <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.2.1</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

2.2.0以后支持中文界面

配置文件

server.port=8000
server.servlet.context-path=/monitor
spring.application.name=Dimples-Monitor-Admin

啟動類

@Slf4j
@SpringBootApplication
@EnableAdminServer
public class ActuatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActuatorApplication.class, args);
        log.info("監控中心啟動");
    }

}

訪問

啟動服務端,瀏覽器訪問http://localhost:8000/monitor可以看到以下界面

image

Admin Client 端

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

配置文件

server.port=8000
spring.application.name=Admin Client
spring.boot.admin.client.url=http://localhost:8000/monitor
management.endpoints.web.exposure.include=*
  • spring.boot.admin.client.url 配置 Admin Server 的地址
  • management.endpoints.web.exposure.include=* 打開客戶端 Actuator 的監控

啟動

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

image

image

配置額外信息展示

info.app.name="@project.name@"
info.app.description="@project.description@"
info.app.version="@project.version@"
info.app.spring-boot-version="@project.parent.version@"

參考鏈接:

https://mrbird.cc/Spring-Boot-Admin.html

Security安全控制

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

配置用戶名密碼

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

此時訪問 http://localhost:8000/monitor會先跳到security的登陸驗證界面,然后登陸成功后再跳到Admin的界面

image

image

我們繼續配置,使用Admin的登陸界面,新建配置類,配置免認證路徑,比如/assets/**靜態資源和/login登錄頁面;配置了登錄頁面為/login,登出頁面為/logout

@EnableWebSecurity
public class DimplesSecurityConfigure extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

    public DimplesSecurityConfigure(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");

        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().disable();
    }

}

http://localhost:8000/monitor

image

但是此時,我們看項目啟動(server,client一體時)的控制台會發現,我們的client不能注冊到server,是因為我們開啟了security,所以需要額外的配置

image

在Admin中是通過spring-boot-starter-actuator提供的/actuator/監控接口來實現的,所以我們需要將/actuator/資源納入到免認證路徑中,同時配置client的用戶名密碼

在上方的DimplesSecurityConfigure 類中新增一行配置,開啟免認證路徑

http.authorizeRequests().antMatchers("/actuator/**").permitAll()

配置用戶名密碼

# 指定服務端的用戶名
spring.boot.admin.client.username=dimples
# 制定服務端的地址
spring.boot.admin.client.password= 123456

完整的配置如下圖

image

image

補充

在上方的配置中,我們是將server和client放在同一個應用中的,這樣對於單個應用來說只需要部署一個jar包,方便管理。

但是有時我們需要用一個server去監控多個client,此時建議使用注冊中心,server自動去注冊中心拉取client。當然你也可以將上方的項目拆分成server和client,相信不難實現,此處不再贅述。

監控微服務

后續更新,關注本帖

參考鏈接:

https://www.kancloud.cn/mrbird/spring-cloud/1263712

異常

在monitor-admin控制台中,經常會拋出如下異常:

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,修改monitor-admim的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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM