Spring Cloud第十三篇 | Spring Boot Admin服務監控
本文是Spring Cloud專欄的第十三篇文章,瞭解前十二篇文章內容有助於更好的理解本文:
-
Spring Cloud第一篇 | Spring Cloud前言及其常用元件介紹概覽
-
Spring Cloud第二篇 | 使用並認識Eureka註冊中心
-
Spring Cloud第三篇 | 搭建高可用Eureka註冊中心
-
Spring Cloud第四篇 | 客戶端負載均衡Ribbon
-
Spring Cloud第五篇 | 服務熔斷Hystrix
-
Spring Cloud第六篇 | Hystrix儀表盤監控Hystrix Dashboard
-
Spring Cloud第七篇 | 宣告式服務呼叫Feign
-
Spring Cloud第八篇 | Hystrix叢集監控Turbin
-
Spring Cloud第九篇 | 分散式服務跟蹤Sleuth
-
Spring Cloud第十篇 | 分散式配置中心Config
-
Spring Cloud第十一篇 | 分散式配置中心高可用
-
Spring Cloud第十二篇 | 訊息匯流排Bus
一、前言
Spring Boot Admin 是一個管理和監控你的 Spring Boot 應用程式的應用程式。這些應用程式通過 Spring Boot Admin Client(通過 HTTP)註冊或者使用 Spring Cloud(例如 Eureka)發現。UI只是 Spring Boot Actuator 端點上的一個 AngularJs 應用程式。
原理:Spring Boot Actuator 模組為監控Spring Boot 應用程式暴露的大量的管理端點[ENDPOINT],在Spring Boot Actuator的基礎上提供簡潔的視覺化WEB UI,是用來管理 Spring Boot 應用程式的一個簡單的介面。
二、使用Spring Boot Admin監控服務
Spring Boot Admin也分為server和client(普通應用程式)
1、搭建Admin服務端
1-1、創鍵springboot admin服務端模組(springboot-admin-server)
1-2、新增springboot admin服務端依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.0</version> </dependency>
1-3、在主類上添加註解@EnableAdminServer
1-4、在application.yml檔案中新增配置,然後啟動
server: port: 8788 spring: application: name: springboot-admin-server
2、搭建Admin客戶端
2-1、建立springboot admin客戶端模組(springcloud-admin-client)
2-2、新增springboot admin客戶端依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.1.0</version>
</dependency>
2-3、在application.yml檔案中新增配置,然後啟動
server: port: 8080 spring: application: name: springcloud-admin-client boot: admin: client: #springboot admin client連線 spring boot admin server 端點地址springboot admin client連線 spring boot admin server 端點地址 url: http://localhost:8788 instance: #預設使用的是主機名註冊,改為使用ip註冊 prefer-ip: true management: endpoints: web: exposure: #開放所有頁面節點 預設只開啟了health、info兩個節點 include: '*' endpoint: health: #顯示健康具體資訊 預設不會顯示詳細資訊 show-details: always # 利用info端點,加入版本等資訊 info: versin: @project.version@ name: @project.artifactId@ group: @project.groupId@ description: @project.description@ #還可以自定義資訊 author: Coding Farmer blog: http://www.coding-farmer.cn
2-4、啟動訪問spring boot admin服務端頁面http://localhost:8788,顯示如下
3、給Sring Boot Admin新增認證
i、修改admin服務端(springboot-admin-server)模組
3-i-1、在生產環境中,為了資料的安全,還是需要加上安全認證的,具體的可以檢視官方文件:https://codecentric.github.io/spring-boot-admin/2.1.0/#_securing_spring_boot_admin_server,相對比較簡單,簡單來說就是加入spring-boot-starter-security進行安全認證。
3-i-2、在admin服務端(springboot-admin-server)模組新增依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
3-i-3、在application.yml中新增使用者名稱、密碼
spring: security: user: name: coding-farmer password: 123456
3-i-4、編輯SpringbootAdminServerApplication.java檔案,修改為
package com.springcloudlearn; import de.codecentric.boot.admin.server.config.AdminServerProperties; import de.codecentric.boot.admin.server.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @EnableAdminServer @SpringBootApplication public class SpringbootAdminServerApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAdminServerApplication.class, args); } @Configuration public static 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/**" ); // @formatter:on } } }
3-i-5、訪問http://localhost:8788
ii、修改admin客戶端(springboot-admin-client)模組
3-ii-1、由於服務端配置了密碼,客戶端訪問的時候需要密碼,這是基於SBA訪問模式,也就是所謂的直接連線springboot admin服務端模式,在application.yml檔案中新增username,password
spring: application: name: springcloud-admin-client boot: admin: client: #springboot admin client連線 spring boot admin server 端點地址springboot admin client連線 spring boot admin server 端點地址 url: http://localhost:8788 instance: #預設使用的是主機名註冊,改為使用ip註冊 prefer-ip: true username: coding-farmer password: 123456
3-ii-2、然後啟動客戶端(springboot-admin-client)模組,訪問http://localhost:8788,檢視客戶端服務註冊到了admin服務端上
三、使用Spring Boot Admin監控Spring Cloud服務結合Eureka註冊中心
當我們監控微服務的時候,服務數量眾多,我們肯定想統一管理微服務,我可以將服務全部註冊到註冊中心上,admin會自己拉取Eureka上註冊的應用資訊,主動去註冊。這也是唯一區別之前手動註冊(SBA連線方式)的地方,就是client端不需要admin-client的依賴,也不需要配置admin地址了,一切全部由admin-server自己實現。這樣的設計對環境變化很友好,不用改了admin-server後去改所有應用的配置了。
1、在上面基礎上繼續修改Admin服務端
1-1、新增依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
1-2、在啟動類上新增Eureka的註解@EnableEurekaClient
1-3、修改後application.yml配置檔案如下,然後啟動
server: port: 8788 spring: application: name: springboot-admin-server security: user: name: coding-farmer password: 123456 eureka: client: service-url: defaultZone: http://localhost:8700/eureka #客戶端每隔30秒從Eureka服務上更新一次服務資訊 registry-fetch-interval-seconds: 30 #需要將我的服務註冊到eureka上 register-with-eureka: true #需要檢索服務 fetch-registry: true #心跳檢測檢測與續約時間 instance: #告訴服務端,如果我10s之內沒有給你發心跳,就代表我故障了,將我剔除掉,預設90s #Eureka服務端在收到最後一次心跳之後等待的時間上限,單位為秒,超過則剔除(客戶端告訴服務端按照此規則等待自己) lease-expiration-duration-in-seconds: 10 #每隔2s向服務端傳送一次心跳,證明自已依然活著,預設30s #Eureka客戶端向服務端傳送心跳的時間間隔,單位為秒(客戶端告訴服務端自己會按照該規則) lease-renewal-interval-in-seconds: 2 # 啟用ip配置 這樣在註冊中心列表中看見的是以ip+埠呈現的 prefer-ip-address: true # 例項名稱 最後呈現地址:ip:2002 instance-id: ${spring.cloud.client.ip-address}:${server.port} health-check-url-path: /actuator/health #Eureka 中的 metadataMap 是專門用來存放一些自定義的資料, # 當註冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 裡取。 # 實際上,每個 instance 都有各自的 metadataMap,map 中存放著需要用到的屬性。 # 例如,上面配置中的 eureka.instance.metadata-map.username,當這個服務成功註冊到 Eureka 上, # Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 裡的屬性, # 然後放入請求頭,向此服務傳送請求,訪問此服務的 Actuator 開放的端點。 #說白了,這個為了連線到自己,把密碼告訴eureka,spring boot admin server 拿著密碼去連線客戶端應用,監控資訊 metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} #使用註冊中心後,他admin也可以監控自身服務狀況 management: endpoints: web: exposure: #開放所有頁面節點 預設只開啟了health、info兩個節點 include: '*' endpoint: health: #顯示健康具體資訊 預設不會顯示詳細資訊 show-details: always # 利用info端點,加入版本等資訊 info: versin: @project.version@ name: @project.artifactId@ group: @project.groupId@ description: @project.description@ #還可以自定義資訊 author: Coding Farmer blog: http://www.coding-farmer.cn
1-4、訪問如下http://localhost:8788,使用註冊中心之後他也可以監控自身服務的狀況
2、在上面基礎上繼續修改Admin客戶端
2-1、新增依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2-2、在啟動類上添加註解@EnableEurekaClient
2-3、啟動Admin客戶端,然後訪問Admin服務端http://localhost:8788,你會看到還有Admin服務端已被監控了
詳細參考案例原始碼:https://gitee.com/coding-farmer/spirngcloud-learn