Spring Boot Admin簡介及實踐
問題
在若幹年前的單體應用時代,我們可以相對輕松地對整個業務項目進行健康檢查、名額監控、配置管理等等項目治理。如今随着微服務的發展,我們将大型單體應用按業務模型進行劃分,以此形成衆多小而自治的微服務,我們品嘗到了微服務的甜頭:異常隔離、獨立部署和釋出、服務伸縮、便于協作開發...我們的項目服務更加解耦合,高可用。但與此同時這也給我們帶來了很多挑戰,衆多服務的健康檢查、名額監控問題、配置管理、日志聚合問題、異常排查問題等等。我們急切需要一些工具或者手段來盡可能地解決這些問題,進而讓我們收獲微服務的最大化利益。
來源背景
codecentric的Spring Boot Admin是一個社群項目,用于管理和監視您的Spring Boot®應用程式。這些應用程式在我們的Spring Boot Admin Client中注冊(通過HTTP),或者是通過Spring Cloud®(例如Eureka,Consul)發現的。 UI隻是Spring Boot Actuator端點之上的Vue.js應用程式。
功能介紹
Spring Boot Admin提供了很多服務治理方面的功能,利用它能節省我們很多在治理服務方面的時間和精力Spring Boot Admin提供了如下功能(包括但不限于):
顯示健康狀态及詳細資訊,如JVM和記憶體名額、資料源名額、緩存名額
跟蹤并下載下傳日志檔案
檢視jvm系統-和環境屬性
檢視Spring啟動配置屬性
友善loglevel管理
檢視線程轉儲
視圖http-traces
檢視http端點
檢視計劃任務
檢視和删除活動會話(使用spring-session)
狀态更改通知(通過電子郵件、Slack、Hipchat…)
狀态變化的事件日志(非持久性)
……(and more !)
搭建Spring Boot Admin Server
在編寫本文的時候,Spring Boot Admin的最新版本為: 2.2.2。接下來我将會用此版本來進行示範。
基礎環境:Jdk 11、Maven、IntelliJ IDEA
引入依賴
由于Spring Boot Admin Server可以作為servlet或webflux應用程式運作,是以您需要對此進行決定并添加相應的Spring Boot Starter。在此示例中,我們使用Servlet Web Starter。
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.2</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
添加配置
通過在配置中添加@EnableAdminServer來引入Spring Boot Admin Server配置:
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class SpringBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}
此時我們通過浏覽器通路:
http://localhost:8080可以看到我們可以通路到Spring Boot Admin Server的UI界面:
注冊用戶端
Spring boot Admin提供了多種注冊用戶端服務的方式,要在SBA(Spring Boot Admin)伺服器上注冊應用程式,您可以直接注冊SBA用戶端或使用Spring Cloud Discovery(例如Eureka,Consul等)。在SBA伺服器端,還有一個使用靜态配置的簡單選項。本文将示範直接注冊、使用Zookeeper、使用Kubernetes來注冊發現用戶端服務。
直接注冊方式
使用直接注冊方式,需要在用戶端服務中引入依賴,進而做到直接與SBA服務端通信。
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.2</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
根據開頭所述Spring Boot Admin是基于Spring Boot Actuator之上的,是以我們需要引入Spring Boot Actuator相關依賴,關于Spring Boot Actuator,可以參考此篇文章。此外我們需要處理Actuator的安全性,是以引入Spring Security相關依賴。
接下來我們在項目配置檔案中添加相關配置
spring.boot.admin.client.url=
(1)
management.endpoints.web.exposure.include=* (2)
1⃣️:要注冊到其中的Spring Boot Admin Server的URL。
2⃣️:與Spring Boot 2一樣,預設情況下,大多數Actuator(端點)都不通過http公開,在這裡我們公開了所有端點。對于生産,您應該仔細選擇要公開的端點。
安全性配置
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
為了簡潔起見,我們暫時禁用安全性。檢視有關如何處理端點的安全性,我會在後續文章中示範。
此時我們同時運作SBA的服務端和用戶端服務,再次通路
,可以看到我們的用戶端服務已經注冊進去,并且可以看到用戶端服務的一些資訊。
Zookeeper服務發現方式
我們通過一些服務發現元件對用戶端服務進行注冊的時候,我們就可以忽略掉用戶端服務了,即我們不需要在用戶端服務中引入Spring Boot Admin相關依賴,因為服務端可以通過服務發現元件來自動發現用戶端服務。
我們在SBA服務端以及用戶端中引入Zookeeper相關依賴
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
在SBA服務端項目中添加Zookeeper相關配置
spring:
cloud:
zookeeper:
connect-string: 你的Zookeeper位址
boot:
admin:
discovery:
instances-metadata:
sba-register: true
因為Zookeeper中可能存在很多服務,而我們隻想發現我們關注的服務,此時我們可以通過上述配置來實作,即我們隻發現中繼資料為sba-register: true的用戶端服務。
在SBA用戶端中添加Zookeeper相關配置
spring.cloud.zookeeper.connect-string=你的Zookeeper位址
spring.cloud.zookeeper.discovery.metadata.sba-register=true
對應SBA服務端的配置,我們指定了Zookeeper的位址,并且指定了該用戶端服務的注冊中繼資料為sba-register: true
此時我們同時運作SBA的服務端和用戶端服務,再次通路SBA服務端位址,可以看到服務端已經通過Zookeeper自動發現用戶端服務,并且可以看到用戶端服務的一些資訊。
Kubernetes服務發現方式
如果你是通過基于Kubernetes的容器化部署,Spring Boot Admin也提供了支援,基于Kubernetes的服務發現方式和Zookeeper方式實作大同小異
我們在Spring Boot Admin服務端項目中引入Kubernetes相關依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-discovery</artifactId>
</dependency>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
Spring Cloud Kubernetes提供使用Kubernetes本機服務的Spring Cloud公共接口實作。此庫的主要目标是促進在Kubernetes中運作的Spring Cloud和Spring Boot應用程式的內建。
@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
@EnableDiscoveryClient注解表示啟用基于Kubernetes的服務發現,@EnableScheduling注解是必須的,表示定期調用Kubernetes API來重新整理正在運作的服務清單,并且僅在啟動時執行一次。由于我們一直希望擁有最新的Pod清單(例如,在擴充應用程式執行個體數量之後),是以我們需要啟用排程程式來負責監視服務目錄的更改并相應地更新DiscoveryClient執行個體清單。
Kubenetes權限配置
Spring Boot Admin使用Spring Cloud Kubernetes,它需要額外的特權才能通路Kubernetes API。我們僅出于開發目的,将cluster-admin設定為ServiceAccount的預設角色。
$ kubectl create clusterrolebinding admin-default --clusterrole=cluster-admin --serviceaccount=default:default
此時我們同時運作SBA的服務端和用戶端服務,再次通路SBA服務端,可以看到服務端已經通過Kubernetes自動發現用戶端服務,并且可以看到用戶端服務的一些資訊。
總結
本文主要介紹了Spring Boot Admin(SBA)的誕生背景已經其帶來的一些功能特性,在這個微服務遍地開花的時代SBA緩解了我們在微服務中遇到的許多棘手的問題。後面本文還用代碼示範了如何在項目中引入并使用SBA。本文隻涉及到了SBA的基礎實踐,我會在後續文章中詳細示範更多SBA的進階功能,看看我們能從中受益多少。
本文的示例代碼
SBA-client:
https://github.com/cg837718548/sba-client-demo.gitSBA-server:
https://github.com/cg837718548/sba-server-demo.git原文位址
https://www.cnblogs.com/dongxishaonian/p/12869770.html