Spring Boot Admin【Finchley 版】
一、 Spring Boot Admin介紹
- Spring Boot Actuator提供了對單個Spring Boot的監控,資訊包含:應用狀態、記憶體、執行緒、堆疊等等,比較全面的監控了Spring Boot應用的整個生命週期。
但是Actuator的監控也有一些問題:第一,所有的監控都需要呼叫固定的介面來檢視,如果全面檢視應用狀態需要呼叫很多介面;第二,如果Spring Boot應用叢集非常大,每個應用都需要呼叫不同的介面來檢視監控資訊,操作非常繁瑣低效。為了解決上述問題,誕生了另外一個開源應用:Spring Boot Admin。 - Spring Boot Admin 是一個管理和監控Spring Boot 應用程式的開源專案,分為admin-server和admin-client兩個元件,admin-server將採集到的相關應用的actuator端點資料顯示在spring-boot-admin-ui上。另外,通過 spring-boot-admin 可以動態切換日誌級別、監控應用的各項指標等。
Spring Boot Admin可以同時監控多個Spring Boot應用,通過eureka、consul等註冊中心的方式實現多服務的監控和管理,每個Spring Boot應用都是一個admin-client。
二、 Spring Boot Admin監控Spring Boot應用
搭建Admin Server端
pom.xml中新增以下依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.0.1</version> </dependency> <dependency
配置檔案application.yml
(1) Spring Boot2.x中,Actuator預設只開放了/actuator/info、/actuator/health兩個端點,如果要訪問其他埠需要自己通過配置management.endpoints.web.exposure.include屬性來實現,下面我們暴露了所有endpoints,如果應用到生產環境,考慮到安全問題,對於Actuator的Endpoints要根據需要進行配置。
(2) Spring Boot Admin 註冊到Eureka Server 中後,可以管理所有註冊到 Eureka Server 的應用,包括 Spring Boot Admin自己,Spring Boot Admin 會自動從註冊中心抓取這些應用的相關資訊並進行監控。server: port: 5000 eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health #健康檢查的地址 instance-id: microservicecloud-adminserver #服務中心中該服務的註冊名 prefer-ip-address: true #是否顯示IP client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: http://localhost:7001/eureka #註冊中心地址 management: endpoints: web: exposure: include: "*"
啟動類
添加註解@EnableAdminServer@Configuration @EnableAutoConfiguration @EnableAdminServer public class AdminserverApplication5000 { public static void main(String[] args) { SpringApplication.run(AdminserverApplication5000.class,args); } }
上述配置完成之後,啟動Eureka Server和Admin Server,訪問http://localhost:5000,可以看到如下介面
Admin Client端
通過服務發現的方式配置客戶端。
pom.xml中新增以下依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
application.yml配置檔案
server: port: 5001 eureka: client: service-url: defaultZone: http://localhost:7001/eureka instance: instance-id: microservicecloud-adminclient prefer-ip-address: true management: endpoints: web: exposure: include: '*' // SpringBootActuator監控暴露所有介面
啟動類
@SpringBootApplication @EnableEurekaClient public class AdminclientApplication5001 { public static void main(String[] args) { SpringApplication.run(AdminclientApplication5001.class, args); } }
配置完成後,啟動Eureka Server和Admin Server、Admin Client(Admin服務端和客戶端的啟動無先後順序),再次訪問http://localhost:5000,介面如下
選中其中一個服務,進入首頁,可以檢視該服務的具體監控資訊。
三、為Admin Server新增安全訪問控制
Admin Server服務是Spring Boot的安全端點管理程式,自身的安全也是比不可少的,所以我們需要為Admin Server服務新增安全訪問控制。官方已經提供了對應的支援。
如果Admin的客戶端和服務端都註冊到同一個註冊中心,則不需要在客戶端指定服務端的地址,Admin Server會自動從註冊中心抓取這些應用進行監控,並且不需要在客戶端配置服務端的憑證資訊。
Admin Server端的pom.xml中增加安全控制的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在application.yml中設定使用者名稱和密碼
eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health instance-id: adminserver prefer-ip-address: true metadata-map: user.name: user #使用者名稱和密碼必須和security下配置的使用者名稱和密碼相同,否則啟動後服務端是DOWN的狀態 user.password: 123456 client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: http://eureka7001.com:7001/eureka spring: security: user: name: user password: 123456
Eureka 中的 metadataMap 專門用來存放一些自定義的資料,當註冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 裡取。實際上,每個 instance 都有各自的 metadataMap,map中存放著需要用到的屬性。
例如,上面配置中的 eureka.instance.metadata-map.user.name,當這個服務成功註冊到 Eureka 上,Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 裡的屬性,然後放入請求頭,向此服務傳送請求,訪問此服務的 Actuator 開放的端點。在Admin Server中配置security的攔截配置
@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"); 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(); // @formatter:on } }
重啟程式,再次訪問http://localhost:5000,提示需要輸入使用者名稱和密碼。
四、郵件告警
Spring Boot Admin將微服務中所有應用資訊在後臺進行了展示,非常方便我們對微服務整體的監控和治理。當某個服務的狀態發生改變時,為保證運維人員能及時知道,Spring Boot Admin支援郵件告警功能。實現步驟:
pom.xml中新增依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
修改application.yml
spring: boot: admin: notify: mail: to: XXXXX@163.com # 郵件接收方 from: [email protected].com # 郵件傳送方 mail: host: smtp.qq.com # qq郵箱伺服器主機host,需要在QQ郵箱設定中開啟smtp協議 163郵箱為smtp.163.com username: [email protected].com # qq郵箱賬號 password: XXXXXXXXXX # 第三方登入的授權碼 properties: mail.debug: false mail.smtp.auth: true mail.smtp.starttls.enable: true mail.smtp.ssl.enable: true
上述配置完成之後重新啟動Spring Boot Admin客戶端和服務端,當關閉客戶端服務時[email protected]郵箱中會接收到下圖中的郵件: