本文是Spring Cloud專欄的第十三篇文章,了解前十二篇文章內容有助於更好的理解本文:
一、前言
Spring Boot Admin 是一個管理和監控你的 Spring Boot 應用程序的應用程序。這些應用程序通過 Spring Boot Admin Client(通過 HTTP)注冊或者使用 Spring Cloud(例如 Eureka)發現。UI只是 Spring Boot Actuator 端點上的一個 AngularJs 應用程序。
原理:Spring Boot Actuator 模塊為監控Spring Boot 應用程序暴露的大量的管理端點[ENDPOINT],在Spring Boot Actuator的基礎上提供簡潔的可視化WEB UI,是用來管理 Spring Boot 應用程序的一個簡單的界面。
二、使用Spring Boot Admin監控服務
Spring Boot Admin也分為server和client(普通應用程序)
1、搭建Admin服務端
1-1、創鍵springboot admin服務端模塊(springboot-admin-server)
1-2、添加springboot admin服務端依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.0</version> </dependency>
1-3、在主類上添加注解@EnableAdminServer
1-4、在application.yml文件中添加配置,然后啟動
server: port: 8788 spring: application: name: springboot-admin-server
2、搭建Admin客戶端
2-1、創建springboot admin客戶端模塊(springcloud-admin-client)
2-2、添加springboot admin客戶端依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.1.0</version>
</dependency>
2-3、在application.yml文件中添加配置,然后啟動
server:
port: 8080
spring:
application:
name: springcloud-admin-client
boot:
admin:
client:
#springboot admin client連接 spring boot admin server 端點地址springboot admin client連接 spring boot admin server 端點地址
url: http://localhost:8788
instance:
#默認使用的是主機名注冊,改為使用ip注冊
prefer-ip: true
management:
endpoints:
web:
exposure:
#開放所有頁面節點 默認只開啟了health、info兩個節點
include: '*'
endpoint:
health:
#顯示健康具體信息 默認不會顯示詳細信息
show-details: always
# 利用info端點,加入版本等信息
info:
versin: @project.version@
name: @project.artifactId@
group: @project.groupId@
description: @project.description@
#還可以自定義信息
author: Coding Farmer
blog: http://www.coding-farmer.cn
2-4、啟動訪問spring boot admin服務端頁面http://localhost:8788,顯示如下
3、給Sring Boot Admin添加認證
i、修改admin服務端(springboot-admin-server)模塊
3-i-1、在生產環境中,為了數據的安全,還是需要加上安全認證的,具體的可以查看官方文檔:https://codecentric.github.io/spring-boot-admin/2.1.0/#_securing_spring_boot_admin_server,相對比較簡單,簡單來說就是加入spring-boot-starter-security進行安全認證。
3-i-2、在admin服務端(springboot-admin-server)模塊添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
3-i-3、在application.yml中添加用戶名、密碼
spring:
security:
user:
name: coding-farmer
password: 123456
3-i-4、編輯SpringbootAdminServerApplication.java文件,修改為
package com.springcloudlearn; import de.codecentric.boot.admin.server.config.AdminServerProperties; import de.codecentric.boot.admin.server.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @EnableAdminServer @SpringBootApplication public class SpringbootAdminServerApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAdminServerApplication.class, args); } @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"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); 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() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringAntMatchers( adminContextPath + "/instances", adminContextPath + "/actuator/**" ); // @formatter:on } } }
3-i-5、訪問http://localhost:8788
ii、修改admin客戶端(springboot-admin-client)模塊
3-ii-1、由於服務端配置了密碼,客戶端訪問的時候需要密碼,這是基於SBA訪問模式,也就是所謂的直接連接springboot admin服務端模式,在application.yml文件中添加username,password
spring: application: name: springcloud-admin-client boot: admin: client: #springboot admin client連接 spring boot admin server 端點地址springboot admin client連接 spring boot admin server 端點地址 url: http://localhost:8788 instance: #默認使用的是主機名注冊,改為使用ip注冊 prefer-ip: true username: coding-farmer password: 123456
3-ii-2、然后啟動客戶端(springboot-admin-client)模塊,訪問http://localhost:8788,查看客戶端服務注冊到了admin服務端上
三、使用Spring Boot Admin監控Spring Cloud服務結合Eureka注冊中心
當我們監控微服務的時候,服務數量眾多,我們肯定想統一管理微服務,我可以將服務全部注冊到注冊中心上,admin會自己拉取Eureka上注冊的應用信息,主動去注冊。這也是唯一區別之前手動注冊(SBA連接方式)的地方,就是client端不需要admin-client的依賴,也不需要配置admin地址了,一切全部由admin-server自己實現。這樣的設計對環境變化很友好,不用改了admin-server后去改所有應用的配置了。
1、在上面基礎上繼續修改Admin服務端
1-1、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
1-2、在啟動類上添加Eureka的注解@EnableEurekaClient
1-3、修改后application.yml配置文件如下,然后啟動
server:
port: 8788
spring:
application:
name: springboot-admin-server
security:
user:
name: coding-farmer
password: 123456
eureka:
client:
service-url:
defaultZone: http://localhost:8700/eureka
#客戶端每隔30秒從Eureka服務上更新一次服務信息
registry-fetch-interval-seconds: 30
#需要將我的服務注冊到eureka上
register-with-eureka: true
#需要檢索服務
fetch-registry: true
#心跳檢測檢測與續約時間
instance:
#告訴服務端,如果我10s之內沒有給你發心跳,就代表我故障了,將我剔除掉,默認90s
#Eureka服務端在收到最后一次心跳之后等待的時間上限,單位為秒,超過則剔除(客戶端告訴服務端按照此規則等待自己)
lease-expiration-duration-in-seconds: 10
#每隔2s向服務端發送一次心跳,證明自已依然活着,默認30s
#Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(客戶端告訴服務端自己會按照該規則)
lease-renewal-interval-in-seconds: 2
# 啟用ip配置 這樣在注冊中心列表中看見的是以ip+端口呈現的
prefer-ip-address: true
# 實例名稱 最后呈現地址:ip:2002
instance-id: ${spring.cloud.client.ip-address}:${server.port}
health-check-url-path: /actuator/health
#Eureka 中的 metadataMap 是專門用來存放一些自定義的數據,
# 當注冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 里取。
# 實際上,每個 instance 都有各自的 metadataMap,map 中存放着需要用到的屬性。
# 例如,上面配置中的 eureka.instance.metadata-map.username,當這個服務成功注冊到 Eureka 上,
# Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 里的屬性,
# 然后放入請求頭,向此服務發送請求,訪問此服務的 Actuator 開放的端點。
#說白了,這個為了連接到自己,把密碼告訴eureka,spring boot admin server 拿着密碼去連接客戶端應用,監控信息
metadata-map:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
#使用注冊中心后,他admin也可以監控自身服務狀況
management:
endpoints:
web:
exposure:
#開放所有頁面節點 默認只開啟了health、info兩個節點
include: '*'
endpoint:
health:
#顯示健康具體信息 默認不會顯示詳細信息
show-details: always
# 利用info端點,加入版本等信息
info:
versin: @project.version@
name: @project.artifactId@
group: @project.groupId@
description: @project.description@
#還可以自定義信息
author: Coding Farmer
blog: http://www.coding-farmer.cn
1-4、訪問如下http://localhost:8788,使用注冊中心之后他也可以監控自身服務的狀況
2、在上面基礎上繼續修改Admin客戶端
2-1、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2-2、在啟動類上添加注解@EnableEurekaClient
2-3、啟動Admin客戶端,然后訪問Admin服務端http://localhost:8788,你會看到還有Admin服務端已被監控了
詳細參考案例源碼:https://gitee.com/coding-farmer/springcloud-learn