這篇文章主要介紹SpringBoot Admin怎么樣,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
公司有個SpringBoot項目需要加個監控,網上找了下發現大家都在推薦SpringBootAdmin。SpringBoot Admin是開源社區孵化的項目,用于對SpringBoot應用的管理和監控。SpringBoot Admin 分為服務端(spring-boot-admin-server)和客戶端(spring-boot-admin-client),服務端和客戶端之間采用http通訊方式實現數據交互;單體項目中需要整合spring-boot-admin-client才能讓應用被監控。在SpringCloud項目中,spring-boot-admin-server 是直接從注冊中心抓取應用信息,不需要每個微服務應用整合spring-boot-admin-client就可以實現應用的管理和監控。
官網參考鏈接:https://codecentric.github.io/spring-boot-admin/2.2.4/
本文只敘述SpringBoot Admin 管理和監控單體應用 ,不涉及SpringCloud相關的內容 。
(1) Maven依賴說明 SpringBoot版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
添加SpringBootAdmin server依賴及SpringBoot web 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--這里由于我的springboot版本是2.2.10.RELEASE,所以 springboot admin 也要用2.2.x版--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.2.4</version> </dependency>
(2)application.yml中配置端口
# 指定端口 server: port: 23333
(3)編寫啟動類并開啟SpringBootAdminServer
package com.zcode.monitor.server; import de.codecentric.boot.admin.server.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * AdminServerApplication * @author ZENG.XIAO.YAN * @version 1.0 * @Date 2020-11-12 */ @EnableAdminServer // 開啟 springboot admin 服務端 @SpringBootApplication public class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class,args); } }
(4)瀏覽器訪問測試 瀏覽器訪問 http://localhost:23333/ 出現以下頁面說明SpringBoot Admin服務端搭建成功
備注:所謂的 client端就是指我們需要被監控的應用端。這里我們寫一個簡單點的SpringBoot web應用做演示
(1)Maven依賴說明
SpringBoot版本如下
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
添加SpringBootAdmin client 依賴及SpringBoot web 依賴。這里不需要添加SpringBoot actuator 依賴,因為SpringBootAdmin client里面已經包含了actuator相關依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--這里由于我的springboot版本是2.2.10.RELEASE,所以 springboot admin 也要用2.2.x版--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.2.4</version> </dependency>
(2) application.yml配置
在yml中需要 配置如下信息:
應用端口
開放端點用于SpringBootAdmin 監控
配置應用名稱(該名稱會在SpringBoot Admin的管理頁面顯示)
配置Admin Server的地址
配置下日志文件的文件名和存放位置 (如果不配置則會看不到日志)
# 端口 server: port: 9088 #開放端點用于SpringBoot Admin的監控 management: endpoints: web: exposure: include: '*' spring: application: name: admin-client # 給client應用取個名字 boot: admin: client: url: http://localhost:23333 #這里配置admin server 的地址 logging: file: name: admin-client.log #配置生成日志文件名稱
(3)寫一個Controller模擬一個普通的接口
通過瀏覽器訪問這個接口就會打印日志,具體代碼如下
/** * HelloController * * @author ZENG.XIAO.YAN * @version 1.0 * @Date 2020-11-16 */ @Slf4j @RestController @RequestMapping("api") public class HelloController { private AtomicInteger count = new AtomicInteger(0); @GetMapping("hi") private String sayHi() { // 每次進來如打印下日志 log.info("{} 啪...我第{}次進來了.", LocalDateTime.now(), count.addAndGet(1)); // 每次進來new 個大對象,便于監控觀察堆內存變化 byte[] bytes = new byte[100*1024*1024]; log.info("new了 100MB"); return "hi springboot addmin " + LocalDateTime.now(); } }
(4)寫個啟動類
啟動類代碼就很簡單了,就是一個普通的SpringBoot項目的啟動類,上面沒加其他注解。具體如下
@SpringBootApplication public class AdminClientApplication { public static void main(String[] args) { SpringApplication.run(AdminClientApplication.class, args); } }
(1)已管理的應用會在應用墻上展示
當我們的admin-client項目啟動后,在 admin-server的管理頁面的應用墻上就能看到admin-client這個應用了,具體可參考下圖
(2)可查看應用的具體信息
在應用墻點擊這個應用,我們可以看到這個應用的具體信息,如堆內存變化及線程數等。具體可參考下圖
(3)日志查看及堆內存變化觀察
請求我們在admin-client中寫的模擬接口 http://localhost:9088/api/hi ,該接口請求一次則會輸出日志,同時開辟100MB的堆內存空間。
請求多次后在網頁上可以實時的看到日志如下圖
由于我們直接new了100MB的大對象,此時可以查看細節中的堆內存變化;具體如下圖
這個SpringBoot Admin的管理后臺如果沒密碼就能訪問,那實在太不安全了,因此我們要給它加上登錄的功能。
參考SpringBoot Admin的官方文檔,我們可以在Admin-Server端添加Spring Security 相關依賴及就可以實現需要登錄后才能訪問網頁管理面板。
官網參考鏈接為:https://codecentric.github.io/spring-boot-admin/2.2.4/#_securing_client_actuator_endpoints
下面開始具體的改造
(1)admin-server添加Spring Security 相關依賴
<!--springboot admin 安全相關--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
(2)admin-server 設置賬號和密碼
在application.yml配置賬號和密碼
# 配置一個賬號和密碼 spring: security: user: name: admin password: root123456
(3)admin-server 添加一個Spring Security 配置類
@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 { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); http.authorizeRequests() //1.配置所有靜態資源和登錄頁可以公開訪問 .antMatchers(adminContextPath + "/assets/**").permitAll() .antMatchers(adminContextPath + "/login").permitAll() .anyRequest().authenticated() .and() //2.配置登錄和登出路徑 .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and() .logout().logoutUrl(adminContextPath + "/logout").and() //3.開啟http basic支持,admin-client注冊時需要使用 .httpBasic().and() .csrf() //4.開啟基于cookie的csrf保護 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) //5.忽略這些路徑的csrf保護以便admin-client注冊 .ignoringAntMatchers( adminContextPath + "/instances", adminContextPath + "/actuator/**" ); } }
(4)admin-server 安全加固后訪問測試
再次訪問http://localhost:23333/ ,發現需要登錄
當我們輸入正確的賬號密碼登錄后,情況如下圖
這個時候的應用數居然變成了0了,在我們沒進行安全加固時是有一個admin-client應用的,為什么就不見了? 原因是添加了賬號密碼認證后,admin-client端也需要配置下 admin-server的賬號和密碼。
(5)admin-client 端設置 admin-server的賬號密碼
admin-client 注冊到 admin-server時,admin-server端有個http Basic認證,通過了認證后 admin-client才能注冊到 admin-server上。 admin-client的application.yml中配置訪問密碼配置可參考下面代碼
spring: application: name: admin-client # 給client應用取個名字 boot: admin: client: url: http://localhost:23333 #這里配置admin server 的地址 # 配置 admin-server的賬號和密碼 username: admin password: root123456
(6) 再次訪問 admin-server 管理后臺 當我們登錄后,終于再次看到了我們的admin-client這個應用
admin-client端如果把actuator端點都暴露出來,是非常不安全的。因此我們可以添加Spring Security對admin-client 也進行安全加固。
下面所有操作均在admin-client中進行
(1)添加Spring Security依賴
<!--spring security--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
(2)yml配置
yml中需要設置client的賬號和密碼,官網相關配置如下圖所示
本次演示的admin-client的相關yml配置參考下面代碼
spring: application: name: admin-client # 給client應用取個名字 boot: admin: client: url: http://localhost:23333 #這里配置admin server 的地址 # 配置 admin-server的賬號和密碼 username: admin password: root123456 instance: metadata: # 這里配置admin-client的賬號和密碼 user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} # admin-client 的用戶名和密碼 security: user: name: clientAdmin password: 123456
(3)添加Spring Security 配置類
為何要到配置?因為Spring Security不配置時會把所有請求都攔截的,而我們這里只需要攔截監控端點/actuator/**即可。同時,官網中提到admin-server訪問admin-client時,也是采用http Basic認證方式的;因此需要配置Spring Security支持Http Basic認證方式。
@Configuration @Slf4j public class SpringSecurityActuatorConfig extends WebSecurityConfigurerAdapter { public SpringSecurityActuatorConfig() { log.info("SpringSecurityActuatorConfig... start"); } @Override protected void configure(HttpSecurity http) throws Exception { // 這個配置只針對 /actuator/** 的請求生效 http.antMatcher("/actuator/**") // /actuator/下所有請求都要認證 .authorizeRequests().anyRequest().authenticated() // 啟用httpBasic認證模式,當springboot admin-client 配置了密碼時, // admin-server走httpbasic的認證方式來拉取client的信息 .and().httpBasic() // 禁用csrf .and().csrf().disable(); } }
(4)效果展示
admin-server端依舊能看到admin-client的信息,說明我們添加SpringSecurity 后 admin-server的監控管理功能正常,具體見下圖
當我們去訪問admin-client的監控端點http://localhost:9088/actuator/health 時,發現需要進行http Basic認證;這也證明了我們的認證攔截只攔截了監控端點。效果如下圖
(5)存在的問題
通過上面的一通配置,admin-client 添加 Spring Security 對actuator的端點進行安全認證的功能是實現了,但也存在著問題。 當我們項目本來就是使用SpringSecurity 安全框架進行認證和授權時。上述的配置就要做修改了。因為我們一般都不用HttpBasic認證,而是用的表單登錄認證。也就出現了配置多個Spring Security的問題。雖然有這個問題,但是網上還是有解決方案的。
(6)多個Spring Security共存方案
這個方案是在Spring Security官方文檔里面找到的 鏈接為: https://docs.spring.io/spring-security/site/docs/5.3.5.RELEASE/reference/html5/ 官網關鍵信息截圖如下:
里面的重點就是通過添加Order注解來指定多個Spring Security的優先級
下面直接貼上我的代碼;為了直觀,我就在同一個類里面建了2個靜態的Spring Security配置類
/** * SpringSecurity 表單和HttpBasic 共存配置參考,寫在一個類里面方便對比 * @author ZENG.XIAO.YAN * @Date 2020-11-11 * @version 1.0 */ @Slf4j public class SpringSecurityConfig2 { /* * 這個表單和HttpBasic 共存配置玩法,參考url如下: * 官方url:https://docs.spring.io/spring-security/site/docs/4.2.3.BUILD-SNAPSHOT/reference/htmlsingle/#multiple-httpsecurity * 項目啟動日志如下,可以看到創建了2條過濾鏈 * 2020-11-11 22:57:56.340 INFO 12692 --- [main] o.s.s.web.DefaultSecurityFilterChain: Creating filter chain: Ant [pattern='/actuator/**'], * 2020-11-11 22:57:56.344 INFO 12692 --- [main] o.s.s.web.DefaultSecurityFilterChain: Creating filter chain: any request, */ /** * HttpBasic 認證方式,只對/actuator/** 生效,由于設置了Order,優先級會高于FormLoginWebSecurityConfigurerAdapter * @author ZENG.XIAO.YAN * @Date 2020-11-11 * @version 1.0 */ @Configuration @Order(1) public static class HttpBasicSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { public HttpBasicSecurityConfigurationAdapter() { log.info("HttpBasicSecurityConfigurationAdapter... start"); } protected void configure(HttpSecurity http) throws Exception { // 這個配置只針對 /actuator/** 的請求生效 http.antMatcher("/actuator/**") // /actuator/下所有請求都要認證 .authorizeRequests().anyRequest().authenticated() // 啟用httpBasic認證模式,當springboot admin-client 配置了密碼時, // admin-server走httpbasic的認證方式來拉取client的信息 .and().httpBasic() // 禁用csrf .and().csrf().disable(); } } /** * 表單登錄認證方式配置,由于沒有指定Order,所以默認是最大2147483647,數值越大,優先級越低 * @author ZENG.XIAO.YAN * @Date 2020-11-11 * @version 1.0 */ @Configuration public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { public FormLoginWebSecurityConfigurerAdapter() { log.info("FormLoginWebSecurityConfigurerAdapter... start"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin(); } } }
添加完這個配置類后,記得把我們上面配置的SpringSecurityActuatorConfig 這個類刪除了,然后重啟項目。效果如下:
訪問http://localhost:9088/actuator/health ,則出現的是httpBasic認證的頁面
訪問 http://localhost:9088/api/hi,則出現的是Spring Security 自帶的表單登錄頁面
訪問admin-server 的管理頁面,發現admin-client應用信息正常,說明本次修改的Spring Security配置沒有問題
以上是“SpringBoot Admin怎么樣”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。