javascript
Spring Boot Admin 2.0 上手
Spring Boot Admin 在 Spring Boot Actuator 的基礎上提供簡潔的可視化 WEB UI,是用來管理 Spring Boot 應用程序的一個簡單的界面,提供如下功能:
- 顯示 name/id 和版本號
- 顯示在線狀態
- Logging 日志級別管理
- JMX beans 管理
- Threads 會話和線程管理
- Trace 應用請求跟蹤
- 應用運行參數信息,如:
- Java 系統屬性
- Java 環境變量屬性
- 內存信息
- Spring 環境屬性
在本文中,我們將介紹配置 Spring Boot Admin(以下簡稱 SBA)服務端的步驟以及如何將一個 Spring Boot 應用注冊為它的客戶端。
快速上手
首先我們需要創建一個 SBA 的服務端。
服務端
創建一個簡單的 Spring Boot Web 應用程序并添加以下依賴
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.0.1</version> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>然后我們就可以將?@EnableAdminServer?添加到我們的主類中
@EnableAdminServer @SpringBootApplication public class AdminServerApplication {public static void main(String[] args) {SpringApplication.run(AdminServerApplication.class, args);} }配置服務端口等信息
spring:application:name: admin-server server:port: 18080 eureka:client:service-url:defaultZone: ${EUREKA_SERVICE_URL:http://localhost:7000}/eureka/此時,SBA Server 已經好了,直接啟動它。
客戶端
在建立了我們的服務端之后,我們可以將一個 Spring Boot 應用程序注冊為客戶端。
注冊客戶端有兩種方式,一種就是通過引入 SBA Client,另外一種是基于 Spring Cloud Discovery。
我們這里先介紹通過引入 SBA Client 的方式。
SBA Client
首先要引入以下依賴:
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.0.1</version> </dependency>然后在配置文件 application.yml 中配置以下信息
spring:application:name: userboot:admin:client:url: http://localhost:18080 eureka:instance:leaseRenewalIntervalInSeconds: 10health-check-url-path: /actuator/healthclient:registryFetchIntervalSeconds: 5service-url:defaultZone: ${EUREKA_SERVICE_URL:http://localhost:7000}/eureka/ management:endpoints:web:exposure:include: "*"endpoint:health:show-details: ALWAYS現在客戶端也就配置好了,啟動客戶端再次訪問?http://localhost:18080?就能看到以下界面(啟動了多個客戶端)
Wallboard:
Applications:
Journal:
Instance details:
Spring Cloud Discovery
如果我們的項目中使用了 Spring Cloud,那么我們其實并不用通過 SBA Client 來向 SBA 注冊,而是讓 SBA 通過注冊中心(Eureka、Consul 等)來發現服務。
這里以 Eureka 作為注冊中心來說明。我們首先向 SBA 服務端以及客戶端中添加 Eureka Client 的依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>然后照常在 application.yml 中配置 Eureka 的注冊信息,如下
eureka:instance:leaseRenewalIntervalInSeconds: 10health-check-url-path: /actuator/healthclient:registryFetchIntervalSeconds: 5serviceUrl:defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management:endpoints:web:exposure:include: "*" endpoint:health:show-details: ALWAYS這個配置就不多做解釋了,不懂的可以看之前關于 Eureka 的文章。
然后分別啟動 SBA 服務端和客戶端,就能看的和使用 SBA Client 一樣的效果了。
安全配置
SBA 服務端可以訪問客戶端的敏感端點,因此手冊上?建議我們應該為服務端和客戶端添加一些安全配置。
首先我們先為服務端增加安全配置。
服務端的安全配置
向服務端添加 Spring 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();}@Overrideprotected void configure(HttpSecurity http) throws Exception {// @formatter:offSavedRequestAwareAuthenticationSuccessHandler 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}}然后通過配置文件設置賬號密碼
spring:security:user:name: "admin"password: "admin"這樣,一個簡單的安全配置就生效了。這時我們再訪問?http://localhost:18080?就會發現需要認證了。
如果這時你的客戶端是使用的 SBA Client 的方式,你會注意到客戶端這時已無法再注冊到服務端了(Spring Cloud Discovery 的話不受影響)。為了能將客戶端注冊到服務端,我們還必須在客戶端的配置文件中添加以下內容:
spring.boot.admin.client:username: "admin"password: "admin"下面我們來為客戶端增加安全配置。
客戶端的安全配置
可能你也想到了,因為 SBA 客戶端的注冊方式有兩種,所以在客戶端的安全配置上也是分為了兩種。
SBA Client
首先在客戶端的配置文件中新增以下內容
spring:application:name: usersecurity:user:name: "client"password: "client"boot:admin:client:url: http://localhost:18080username: "admin"password: "admin"instance:metadata:user.name: ${spring.security.user.name}user.password: ${spring.security.user.password}然后再在服務端的配置中增加以下內容
eureka:instance:metadata-map:user.name: "client"user.password: "client"OK,重啟 SBA Server 和 Clients 再試試看吧。
Spring Cloud Discovery
這種方式和使用 SBA Client 的配置文件有些類似,以免產生混淆,我這里直接貼完整的配置了。
(重點關注?eureka.instance.metadata-map)
SBA 客戶端:
spring:application:name: usersecurity:user:name: "client"password: "client" eureka:instance:leaseRenewalIntervalInSeconds: 10health-check-url-path: /actuator/healthmetadata-map:user.name: ${spring.security.user.name}user.password: ${spring.security.user.password}client:registryFetchIntervalSeconds: 5service-url:defaultZone: ${EUREKA_SERVICE_URL:http://localhost:7000}/eureka/ management:endpoints:web:exposure:include: "*"endpoint:health:show-details: ALWAYSSBA 服務端:
spring:application:name: admin-serversecurity:user:name: "admin"password: "admin" server:port: 18080 eureka:client:registryFetchIntervalSeconds: 5service-url:defaultZone: ${EUREKA_SERVICE_URL:http://localhost:7000}/eureka/instance:leaseRenewalIntervalInSeconds: 10health-check-url-path: /actuator/healthmetadata-map:user.name: ${spring.security.user.name}user.password: ${spring.security.user.password}management:endpoints:web:exposure:include: "*"endpoint:health:show-details: ALWAYSEureka 的 metadataMap
在進行安全配置的時候,我們會頻繁接觸 metadataMap,這里就簡單介紹一下吧。
Eureka 中的 metadataMap 是專門用來存放一些自定義的數據,當注冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 里取。實際上,每個 instance 都有各自的 metadataMap,map 中存放著需要用到的屬性。例如,上面配置中的?eureka.instance.metadata-map.user.name,當這個服務成功注冊到 Eureka 上,Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 里的屬性,然后放入請求頭,向此服務發送請求,訪問此服務的 Actuator 開放的端點。
關于 SBA 的更多認證方式可以參見?joshiste/spring-boot-admin-samples
通知
當客戶端(已注冊到服務端)發生某些事件的時候,我們可以接收到通知。目前有以下通知方式可供使用:
- PagerDuty
- OpsGenie
- Hipchat
- Slack
- Let’s Chat
- Microsoft Teams
- Telegram
這里我們主要來關注一下郵件通知。郵件通知會發送一個由?Thymeleaf?模板渲染的 HTML 文檔,就像下邊這樣
要使用郵件通知,我們首先需要添加?spring-boot-starter-mail?依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>然后配置 JavaMailSender
spring:mail:host: smtp.example.comusername: smtp_userpassword: smtp_passwordboot:admin:notify:mail:to: admin@example.com做完以上配置后,只要我們已注冊的客戶端的狀態從 UP 變為 OFFLINE 或其他狀態,服務端就會自動將電子郵件發送到上面配置的地址。其他的通知配置也類似。
示例代碼:https://github.com/zhaoyibo/spring-cloud-study/tree/master/admin
參考
Spring Boot Admin Reference Guide
A Guide to Spring Boot Admin
- 本文作者:?Yibo
- 本文鏈接:?https://windmt.com/2018/05/22/spring-boot-admin-guide/
- 版權聲明:?本博客所有文章除特別聲明外,均采用?CC BY-NC-SA 4.0?許可協議。轉載請注明出處!
總結
以上是生活随笔為你收集整理的Spring Boot Admin 2.0 上手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intellij IDEA神器居然还有这
- 下一篇: Nomad技术手册:整体架构(Archi