問題
在若干年前的單體應用時代,我們可以相對輕鬆地對整個業務專案進行健康檢查、指標監控、配置管理等等專案治理。如今隨著微服務的發展,我們將大型單體應用按業務模型進行劃分,以此形成眾多小而自治的微服務,我們品嚐到了微服務的甜頭:異常隔離、獨立部署和釋出、服務伸縮、便於協作開發...我們的專案服務更加解耦合,高可用。但與此同時這也給我們帶來了很多挑戰,眾多服務的健康檢查、指標監控問題、配置管理、日誌聚合問題、異常排查問題等等。我們急切需要一些工具或者手段來儘可能地解決這些問題,從而讓我們收穫微服務的最大化利益。
來源背景
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。
<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>
新增配置
通過在配置中新增@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服務端通訊。
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
根據開頭所述Spring Boot Admin是基於Spring Boot Actuator之上的,所以我們需要引入Spring Boot Actuator相關依賴,關於Spring Boot Actuator,可以參考此篇文章。此外我們需要處理Actuator的安全性,所以引入Spring Security相關依賴。
新增配置
接下來我們在專案配置檔案中新增相關配置
spring.boot.admin.client.url=http://localhost:8080 (1)
management.endpoints.web.exposure.include=* (2)
1⃣️:要註冊到其中的Spring Boot Admin Server的URL。
2⃣️:與Spring Boot 2一樣,預設情況下,大多數Actuator(端點)都不通過http公開,在這裡我們公開了所有端點。對於生產,您應該仔細選擇要公開的端點。
安全性配置
@Configuration
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}
為了簡潔起見,我們暫時禁用安全性。檢視有關如何處理端點的安全性,我會在後續文章中演示。
此時我們同時執行SBA的服務端和客戶端服務,再次訪問http://localhost:8080,可以看到我們的客戶端服務已經註冊進去,並且可以看到客戶端服務的一些資訊。
Zookeeper服務發現方式
我們通過一些服務發現元件對客戶端服務進行註冊的時候,我們就可以忽略掉客戶端服務了,即我們不需要在客戶端服務中引入Spring Boot Admin相關依賴,因為服務端可以通過服務發現元件來自動發現客戶端服務。
引入依賴
我們在SBA服務端以及客戶端中引入Zookeeper相關依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
新增配置
在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相關依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Cloud Kubernetes提供使用Kubernetes本機服務的Spring Cloud公共介面實現。此庫的主要目標是促進在Kubernetes中執行的Spring Cloud和Spring Boot應用程式的整合。
新增配置
@SpringBootApplication
@EnableAdminServer
@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.git
SBA-server:https://github.com/cg837718548/sba-server-demo.git
關注筆者公眾號,推送各類原創/優質技術文章 ⬇️