監控單體應用
<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可以看到以下界面
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);
}
}
配置額外信息展示
info.app.name="@project.name@"
info.app.description="@project.description@"
info.app.version="@project.version@"
info.app.spring-boot-version="@project.parent.version@"
參考鏈接:
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的界面
我們繼續配置,使用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();
}
}
但是此時,我們看項目啟動(server,client一體時)的控制台會發現,我們的client不能注冊到server,是因為我們開啟了security,所以需要額外的配置
在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
完整的配置如下圖
補充
在上方的配置中,我們是將server和client放在同一個應用中的,這樣對於單個應用來說只需要部署一個jar包,方便管理。
但是有時我們需要用一個server去監控多個client,此時建議使用注冊中心,server自動去注冊中心拉取client。當然你也可以將上方的項目拆分成server和client,相信不難實現,此處不再贅述。
監控微服務
后續更新,關注本帖
參考鏈接:
異常
在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>