Spring Boot Actuator 提供了對單個 Spring Boot 應用的監控,信息包含應用狀態、內存、線程、堆棧等,比較全面的監控了 Spring Boot 應用的整個生命週期。前端
可是這樣監控也有一些問題:第一,全部的監控都須要調用固定的接口來查看,若是全面查看應用狀態須要調用不少接口,而且接口返回的 JSON 信息不方便運營人員理解;第二,若是 Spring Boot 應用集羣很是大,每一個應用都須要調用不一樣的接口來查看監控信息,操做很是繁瑣低效。在這樣的背景下,就誕生了另一個開源軟件:Spring Boot Admin。web
Spring Boot Admin 是一個管理和監控 Spring Boot 應用程序的開源軟件,每一個應用都認爲是一個客戶端,經過 HTTP 或者使用 Eureka 註冊到 admin server 中進行展現,Spring Boot Admin UI 部分使用 Vue.js 將數據展現在前端。spring
Spring Boot Admin 是一個針對 Spring Boot 的 Actuator 接口進行 UI 美化封裝的監控工具,它能夠在列表中瀏覽全部被監控 spring-boot 項目的基本信息、詳細的 Health 信息、內存信息、JVM 信息、垃圾回收信息、各類配置信息(好比數據源、緩存列表和命中率)等,還能夠直接修改 logger 的 level。緩存
值得注意的是 Spring Boot Admin 並非 Spring Boot 官方出品的開源軟件,可是其軟件質量和使用普遍度都很是的高,而且 Spring Boot Admin 會及時隨着 Spring Boot 的更新而更新,當 Spring Boot 推出 2.X 版本時 Spring Boot Admin 也及時進行了更新。安全
Spring Boot Admin 2.x 不只是跟着支持了 Spring Boot 2.x,還在 1.x 的基礎上進行了大量的更新和優化:app
Spring Boot Admin 分爲服務端和客戶端,服務端其實就是一個監控後臺用來彙總展現全部的監控信息,客戶端就是咱們的應用,使用時須要先啓動服務端,在啓動客戶端的時候打開 Actuator 的接口,並指向服務端的地址,這樣服務端會定時讀取相關信息以達到監控的目的。dom
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.x 下只須要添加此一個包便可,其餘組件會自動依賴添加。ide
(2)配置文件spring-boot
//服務端設置端口爲:8000。 server.port=8000
@EnableAdminServer @SpringBootApplication public class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class, args); } }
完成上面三步以後,啓動服務端,訪問網址 http://localhost:8000
能夠看到如下界面:微服務
由於剛啓動沒有應用,所以顯示:No applications registered.,同時根據上圖也能夠看出 applications 頁面會展現項目的應用數、實例數和狀態三個信息。
接下來咱們構建一個客戶端,並註冊到服務端。
<dependencies> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
添加 spring-boot-starter-web 是爲了使應用處於啓動狀態,spring-boot-admin-starter-client 會自動添加 Actuator 相關依賴。
(2)配置文件
server.port=8001 spring.application.name=Admin Client spring.boot.admin.client.url=http://localhost:8000 management.endpoints.web.exposure.include=*
@SpringBootApplication public class AdminClientApplication { public static void main(String[] args) { SpringApplication.run(AdminClientApplication.class, args); } }
配置完成以後,啓動 Client 端,Admin 服務端會自動檢查到客戶端的變化,並展現其應用:
頁面會展現被監控的服務列表,點擊項目名稱會進入此應用的詳細監控信息:
經過上圖能夠看出,Spring Boot Admin 以圖形化的形式展現了應用的各項信息,這些信息大多都來自於 Spring Boot Actuator 提供的接口。利用圖形化的形式很容易看到應用的各項參數變化,甚至有些頁面還能夠進行一些操做,好比改變打印日誌的級別等。
點擊 journal 頁面能夠看到應用狀態變化的歷史過程:
點擊第一個菜單 wallboard 能夠以更形象的方式查看應用數量啓動的時間等。
若是咱們使用的是單個 Spring Boot 應用,就須要在每個被監控的應用中配置 Admin Server 的地址信息;若是應用都註冊在 Eureka 中就不須要再對每一個應用進行配置,Spring Boot Admin 會自動從註冊中心抓取應用的相關信息。
若是使用了 Spring Cloud 的服務發現功能,就不須要再單獨添加 Admin Client 客戶端,僅僅須要 Spring Boot Server,其餘內容會自動進行配置。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
@Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableAdminServer public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } @Configuration public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().permitAll() .and().csrf().disable(); } } }
使用類 SecurityPermitAllConfig 關閉了安全驗證。
(3)在客戶端中配置服務發現的地址
eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: startup: ${random.int} #needed to trigger info and endpoint update after restart client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
Spring Boot Admin 後臺有不少的敏感信息和操做,若是公司不作權限控制可能會影響到公司系統的安全性。Spring Boot Admin 也考慮到了這個因素,能夠利用前面的 Spring Security 作安全訪問控制,在 spring-boot-admin-server 上進行改造。
(1)添加 Spring Boot Security 依賴包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
@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 { // @formatter:off SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); 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() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringAntMatchers( adminContextPath + "/instances", adminContextPath + "/actuator/**" ); } }
spring.security.user.name=admin spring.security.user.password=admin
配置完成以後重啓 Admin Server 端,訪問網址 http://localhost:8000
就會發現須要一個登陸的用戶名和密碼了。
(3)其餘方式
若是 Actuator 的端口被使用 HTTP 認證保護,那麼 Spring Boot Admin Server 訪問的時候須要憑證信息,這時候可使用 metadata 的方式對帳戶和密碼進行配置。
直接使用客戶端註冊的方式:
spring.boot.admin.client: url: http://localhost:8080 instance: metadata: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}
eureka: instance: metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}
Spring Boot Admin 將微服務中全部應用信息在後臺進行了展現,很是方便咱們對微服務總體的監控和治理。可是咱們的運營人員也不可能一天 24 小時盯着監控後臺,所以若是服務有異常的時候,有對應的郵件告警就太好了,其實 Spring Boot Admin 也給出了支持。
咱們對上面的示例項目 spring-boot-admin-server 進行改造。
(1)添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
spring.mail.host=smtp.qq.com spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.boot.admin.notify.mail.from=yyyy@qq.com spring.boot.admin.notify.mail.to=zzz@qq.com
在配置文件中添加郵件發送相關信息:郵件的發送者、接受者、協議、移動受權碼等。
配置完成後,從新啓動項目 spring-boot-admin-server,這樣 Admin Server 就具有了郵件告警的功能,默認狀況下 Admin Server 對 Eureka 中的服務上下線都進行了監控,當服務上下線的時候咱們就會收到以下郵件:
固然這只是最基本的郵件監控,在實際的使用過程當中,須要根據狀況對郵件告警內容進行自定義,好比監控堆內存的使用狀況,當到達必定比例的時候進行告警等。
Spring Boot Admin 解決了咱們對大規模 Spring Boot 應用監控的需求,Spring Boot Admin 充分利用了 Actuator 開放的相關接口,採用優秀的圖形界面將這些信息進行了展現,方便咱們更加直觀的查看集羣中應用的狀態。Spring Boot Admin 不只能夠監控單個 Spring Boot 應用,也能夠結合 Spring Cloud 監控註冊到服務中心的全部應用狀態,再結合報警系統的使用就能夠隨時感知到應用的狀態變化。在實際工做中 Spring Boot Admin 是咱們在後期運營中頻繁用到的一個組件,應該做爲重點關注。