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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章