微服務(wù)的核心思想就是拆分業(yè)務(wù),將單個系統(tǒng)按業(yè)務(wù)邊界切分為多個可獨(dú)立部署的微服務(wù)子系統(tǒng)经柴。這樣可以讓系統(tǒng)更容易擴(kuò)展猴娩,更快速的迭代,但必然會導(dǎo)致系統(tǒng)內(nèi)服務(wù)實(shí)例數(shù)量的大量增加饿肺,再加上服務(wù)實(shí)例可能部署到不同的操作系統(tǒng)和網(wǎng)段蒋困,對整個系統(tǒng)進(jìn)行管理和監(jiān)控的難度比單系統(tǒng)環(huán)境要高出不少。幸運(yùn)的是敬辣,針對Spring Boot技術(shù)體系我們有一個開箱即用的系統(tǒng)監(jiān)控解決方案——Spring Boot Admin雪标,對于中小規(guī)模的微服務(wù)系統(tǒng),它幾乎可以提供一切必要的監(jiān)控需求溉跃,而且更重要的是它對于業(yè)務(wù)系統(tǒng)是非侵入性的村刨,只需要幾行配置就可以將一個基于Spring Boot技術(shù)開發(fā)的應(yīng)用納入到監(jiān)控之中。
Spring Boot Admin分為兩部分:client和server撰茎。client為被監(jiān)控端嵌牺,通過集成Spring Boot Actuator組件暴露出各種監(jiān)控指標(biāo)和信息,并注冊到一個server端乾吻;server端接受client的注冊髓梅,并定時查詢client端提供的監(jiān)控信息,管理員可以通過server端內(nèi)置的一個web應(yīng)用查看client的各項(xiàng)指標(biāo)和信息绎签。
現(xiàn)在我們就來利用Spring Boot Admin來為Spring Cloud Demo項(xiàng)目加入服務(wù)指標(biāo)監(jiān)控的功能枯饿。首先來創(chuàng)建一個monitor模塊,作為Spring Boot Admin的server端诡必,在pom.xml中加入如下配置:
<!--spring-boot-admin-starter-server必須和spring-boot的版本匹配奢方,2.1.X的版本無法在spring boot 2.2.0以上的版本運(yùn)行-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
項(xiàng)目啟動類中需要加入一個@EnableAdminServer的注解:
@SpringBootApplication
@EnableAdminServer
public class MonitorApplication {
public static void main(String[] args) {
SpringApplication.run(MonitorApplication.class, args);
}
}
application.yml配置文件只需要加入consul的相關(guān)配置即可搔扁,用于尋找其它被監(jiān)控的client。Spring Boot Admin的客戶端有兩種注冊方式蟋字,第一種是在被監(jiān)控的服務(wù)客戶端直接引入spring-boot-admin-starter-client稿蹲,并配置server端的監(jiān)控地址,主動向server端進(jìn)行注冊鹊奖,這種一般用于監(jiān)控獨(dú)立的應(yīng)用苛聘;第二種就是和Spring Cloud體系相匹配的,通過服務(wù)注冊中心直接尋找需要被監(jiān)控的客戶端信息忠聚,在我們的demo里面就是consul设哗,在consul中注冊了的服務(wù)會直接成為Spring Boot Admin的client。
這樣的話两蟀,我們demo里面的服務(wù)提供方只需要做很小的改造即可接入Spring Boot Admin的監(jiān)控體系网梢。主要就是加入Spring Boot Actuator支持,通過該框架來暴露出各種監(jiān)控指標(biāo)的赂毯,這樣server端才能夠?qū)ΡO(jiān)控指標(biāo)進(jìn)行匯總和圖形化展示战虏。demo的parent項(xiàng)目之前已經(jīng)添加了Spring Boot Actuator的依賴,但是默認(rèn)只會暴露出一個/actuator/heath的接口党涕,這對我們的監(jiān)控來說是遠(yuǎn)遠(yuǎn)不夠的烦感,所以還需要在每個服務(wù)提供方暴露出更多的監(jiān)控指標(biāo)。具體來說遣鼓,就是在配置文件中加入以下Actuator的配置:
#輸出監(jiān)控指標(biāo)用于服務(wù)監(jiān)控啸盏,暴露的監(jiān)控指標(biāo)可根據(jù)實(shí)際情況調(diào)整
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
#如果要在Spring boot admin中查看日志重贺,需要指定存儲的文件
logging:
file: ./logs/order-service.log
現(xiàn)在將服務(wù)全部啟動骑祟,訪問monitor的地址http://localhost:9010,就可以看到Spring boot admin的監(jiān)控頁面了:
需要注意的是气笙,Spring Boot Admin完全依賴Actuator暴露的接口進(jìn)行監(jiān)控次企,如果沒有實(shí)現(xiàn)這些接口,默認(rèn)就會顯示離線(比如consul實(shí)例實(shí)際上是在線的)潜圃。進(jìn)入到具體的某個服務(wù)缸棵,可以看到更多的監(jiān)控指標(biāo),還能夠在線查看日志和修改logger的日志級別:
Spring Boot Admin還支持對標(biāo)題和UI進(jìn)行部分的定制谭期,具體的配置項(xiàng)堵第,可參考官方文檔
monitor模塊可以收集到應(yīng)用的一些敏感信息,如果需要暴露到外網(wǎng)進(jìn)行查看隧出,就必須添加相關(guān)的安全措施踏志。我們可以通過spring security框架,快速為server端添加相應(yīng)的用戶登錄驗(yàn)證功能胀瞪。首先在monitor中加入spring security的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后編寫一個Spring Security的配置類针余,驗(yàn)證規(guī)則可根據(jù)實(shí)際情況進(jìn)行修改:
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.antMatchers(adminContextPath + "/actuator/health").permitAll()
.anyRequest().authenticated()
.and()
//login登錄頁是spring boot admin ui里面已經(jīng)集成了的
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}
重新啟動后,再次訪問monitor模塊,就需要進(jìn)行登錄驗(yàn)證了:
登錄的用戶名和密碼可以在application.yml中配置:
spring:
#允許登錄監(jiān)控系統(tǒng)的用戶名和密碼
security:
user:
name: admin
password: 123456
需要注意的是圆雁,如果沒有使用注冊中心忍级,而是通過spring-boot-admin-starter-client的方式直接向server端注冊的client,還需要加入server端的驗(yàn)證信息才能成功注冊伪朽,類似像這樣:
spring
boot:
admin:
client:
#server端的注冊地址
url: http://localhost:9010
username: admin
password: 123456
instance:
#client的訪問地址前綴轴咱,server通過該地址獲取監(jiān)控信息
service-base-url: http://192.168.1.252:8090
本文的相關(guān)代碼可以查看這里 spring-cloud-demo