Spring Boot Admin 用於管理和監控一個或多個Spring Boot程序,在 Spring Boot Actuator 的基礎上提供簡潔的可視化 WEB UI,提供如下功能:
- 顯示 name/id 和版本號
- 顯示在線狀態
- Logging 日志級別管理
- JMX beans 管理
- Threads 會話和線程管理
- Trace 應用請求跟蹤
- 應用運行參數信息,如:
- Java 系統屬性
- Java 環境變量屬性
- 內存信息
- Spring 環境屬性
使用Spring Boot Admin監控Spring Cloud微服務
首先需要一個服務注冊中心Eureka Server,讓Spring Boot Admin(以下簡稱 SBA)服務端向它注冊服務。
服務端
在主Maven工程下新建Moeule工程admin-server,pom文件引入依賴。其中SBA的依賴必需在dependency中指定version版本號(包括server和client),用spring boot initializer自動建工程,引入依賴時,版本號會寫在properties中,<spring-boot-admin.version>2.0.1</spring-boot-admin.version>,而在我的測試中,這樣並不能起作用,不能引入依賴。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cralor</groupId> <artifactId>admin-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>admin-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.cralor</groupId> <artifactId>chap12-admin</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
啟動類加上注解@EnableAdminServer
@EnableAdminServer @SpringBootApplication public class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class, args); } }
配置文件配置端口號、程序名、服務注冊中心地址。
server: port: 5000 spring: application: name: admin-server eureka: client: service-url: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
客戶端
在建立了我們的服務端之后,我們可以將一個 Spring Boot 應用程序注冊為客戶端。注冊客戶端有兩種方式,一種就是通過引入 SBA Client,另外一種是基於 Spring Cloud Discovery。我們這里先介紹通過引入 SBA Client 的方式。
SBA Client
新建工程admin-client。pom文件引入依賴,客戶端需要引入actuator依賴,服務端不需要。
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
配置文件:SBA服務端http://localhost:5000,actuator監控暴露全部端口,顯示所有信息。
server: port: 8762 spring: application: name: admin-client boot: admin: client: url: http://localhost:5000 eureka: instance: leaseRenewalIntervalInSeconds: 10 #表示eureka client發送心跳給server端的頻率,默認為30秒 health-check-url-path: /actuator/health #健康檢查的地址(依賴spring-boot-starter-actuator) client: registryFetchIntervalSeconds: 5 #表示eureka client間隔多久去拉取服務注冊信息,默認為30秒 service-url: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management: endpoints: web: exposure: include: '*' endpoint: health: show-details: ALWAYS
依次啟動eureka-server、admin-server和admin-client(兩個客戶端8762、8763)。訪問SBA服務端http://localhost:5000
Wallboard:

Applications:

Journal:

Instance details:

Spring Cloud Discovery
如果我們的項目中使用了 Spring Cloud,那么我們其實並不用通過 SBA Client 來向 SBA 注冊,而是讓 SBA 通過注冊中心(Eureka、Consul 等)來發現服務。這里以 Eureka 作為注冊中心來說明。
在admin-client中只需要改變引入的依賴,其他不需要改變。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--<dependency>--> <!--<groupId>de.codecentric</groupId>--> <!--<artifactId>spring-boot-admin-starter-client</artifactId>--> <!--<version>2.0.1</version>--> <!--</dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
重啟 SBA 服務端和客戶端,就能看的和使用 SBA Client 一樣的效果了。
在Spring Boot Admin中集成Turbine
因為SBA最新版本為2.0.1,而spring-boot-admin-server-ui-turbine的版本為1.5.7,整合會出現問題,暫時不做測試。。。
安全配置,在Spring Boot Admin中添加安全登陸界面
SBA 服務端可以訪問客戶端的敏感端點,因此手冊上 建議我們應該為服務端和客戶端添加一些安全配置。
服務端的安全配置
向服務端添加 Spring Security 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency
配置文件設置賬號密碼,並添加一些配置
server: port: 5000 spring: application: name: admin-server security: user: name: 'admin' password: 'admin' eureka: client: registryFetchIntervalSeconds: 5 service-url: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
新增一個安全配置類。
@Configuration public 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 就會發現需要認證了。

如果這時你的客戶端是使用的 SBA Client 的方式,你會注意到客戶端這時已無法再注冊到服務端了(Spring Cloud Discovery 的話不受影響)。為了能將客戶端注冊到服務端,我們還必須在客戶端的配置文件中添加以下內容:
spring.boot.admin.client: username: "admin" password: "admin"
因為 SBA 客戶端的注冊方式有兩種,所以在客戶端的安全配置上也是分為了兩種。下面我們來為客戶端增加安全配置。
客戶端的安全配置
SBA Client
客戶端的配置文件
server: port: 8762 spring: application: name: admin-client security: user: name: "client" password: "client" boot: admin: client: url: http://localhost:5000 username: "admin" password: "admin" instance: metadata: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} eureka: instance: leaseRenewalIntervalInSeconds: 10 #表示eureka client發送心跳給server端的頻率,默認為30秒 health-check-url-path: /actuator/health #健康檢查的地址(依賴spring-boot-starter-actuator) client: registryFetchIntervalSeconds: 5 #表示eureka client間隔多久去拉取服務注冊信息,默認為30秒 service-url: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management: endpoints: web: exposure: include: '*' endpoint: health: show-details: ALWAYS
重啟 SBA Server 和 Clients 可看到效果。
Spring Cloud Discovery
配置文件
server: port: 8762 spring: application: name: admin-client security: user: name: "client" password: "client" eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} client: registryFetchIntervalSeconds: 5 service-url: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
重啟 SBA Server 和 Clients 。
(ps:在我的測試中,SBA client和Spring Cloud Discovery,不管用這兩個配置文件的哪一個都可以...)
Eureka 的 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
案例代碼地址:https://github.com/cralor7/springcloud

