嗨,你好呀,我是哪吒。
面試的時候,被問到 “Spring Boot 中的監視器是什么?有哪些功能和作用?”
我的第一反應就是,不應該是監聽器和攔截器嗎?
監聽器是基于觀察者模式的實現,其工作原理是通過注冊監聽器來訂閱特定的事件,當這些事件發生時,Spring框架會通知所有注冊了對應事件的監聽器,然后監聽器會執行相應的操作。
比如初始化數據、讀取配置文件、記錄日志等。
具體的操作步驟:
面試官:我說的是監視器。
很多小伙伴開發多年,確實是沒注意過監視器這個概念。
Spring Boot中的監視器是Actuator,我一般用來監控響應時間、CPU使用率、內存使用情況。
還可以通過分析日志信息,快速定位問題原因,還可以提供預警機制,以便在出現故障或異常時及時采取措施進行修復。
監視器可以與自動化運維工具集成,實現自動化部署、監控、報警和恢復等功能,提高運維效率。
可以通過一些端點進行監控和管理,比如:
小結一下:
監聽器通常用于響應應用程序中的特定事件,當某個事件發生時,監聽器可以執行預定義的動作。
監聽器用于響應特定的應用事件,如服務啟動、請求處理等,以及實現特定業務邏輯的處理。
監視器指的是能夠監控和管理應用程序狀態的組件或工具。在Spring Boot中,Actuator是一個內置的監控組件,它提供了多種端點來檢查應用的健康狀況、性能指標、日志信息等。
監視器用于監控應用程序的運行狀態,提供健康檢查、性能統計等信息,幫助維護和優化應用性能。
再分享幾道,徹底掌握監視器的常見問題。
在開始使用監視器之前,需要明確監控的目標和范圍。確定需要監控的關鍵指標,如響應時間、錯誤率、資源利用率等,并設定合理的閾值。
根據監控目標,配置合適的監控策略。這可能包括監控頻率、數據聚合方式、報警觸發條件等。確保監控策略能夠有效地捕捉到潛在問題,并及時發出警報。
監視器本身也會占用一定的系統資源,并可能對應用程序的性能產生一定影響。因此,在選擇和使用監視器時,需要權衡其功能和性能開銷,確保不會對應用程序造成過大的負擔。
監視器可能會收集到一些敏感信息,如用戶數據、系統配置等。因此,在使用監視器時,需要確保敏感信息得到妥善保護,避免泄露給未經授權的人員。
在pom.xml文件中添加Actuator的依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>
在application.properties或application.yml中配置Actuator的相關屬性,例如開啟所有的端點:
management: endpoints: web: exposure: include: "*"
使用瀏覽器或者命令行工具(如curl)訪問不同的端點。
# 獲取應用的健康狀態信息curl http://localhost:8080/actuator/health# 獲取應用的基本信息curl http://localhost:8080/actuator/info# 獲取應用的性能指標curl http://localhost:8080/actuator/metrics# 追蹤HTTP請求的處理過程curl http://localhost:8080/actuator/httptrace# 關閉應用curl -X POST http://localhost:8080/actuator/shutdown
創建一個安全配置類,繼承WebSecurityConfigurerAdapter,并重寫configure(AuthenticationManagerBuilder auth)方法。在該方法中,可以配置自定義的用戶名和密碼。
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() // 使用內存中的用戶信息進行認證 .withUser("myuser") // 自定義用戶名 .password("{noop}mypassword") // 自定義密碼(使用明文) .roles("USER"); // 設置用戶角色 }}
在application.properties或application.yml中配置端點的安全路徑和訪問權限。
management: endpoints: web: base-path: /actuator # 設置Actuator端點的根路徑 exposure: include: "*" # 暴露所有端點 security: enabled: true # 啟用Actuator的安全認證
啟動應用后,訪問Actuator端點時,會提示輸入自定義的用戶名和密碼進行身份驗證。例如,訪問/actuator/health端點時,瀏覽器會彈出一個登錄窗口,要求輸入自定義的用戶名和密碼。
在Spring Boot Actuator中,可以通過配置端點的訪問權限來限制特定端點的訪問。
創建一個安全配置類,繼承WebSecurityConfigurerAdapter,并重寫configure(HttpSecurity http)方法。在該方法中,可以配置特定端點的訪問權限。
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/actuator/health").hasRole("ADMIN") // 僅允許具有ADMIN角色的用戶訪問/actuator/health端點 .and() .httpBasic(); // 使用基本認證方式 }}
在application.properties或application.yml中配置用戶名和密碼以及用戶的角色:
spring: security: user: name: admin # 用戶名 password: secret # 密碼 roles: ADMIN # 用戶角色
啟動應用后,訪問Actuator端點時,會提示輸入用戶名和密碼進行身份驗證。例如,訪問/actuator/health端點時,瀏覽器會彈出一個登錄窗口,要求輸入用戶名和密碼。只有具有ADMIN角色的用戶才能成功訪問該端點。
添加spring-boot-starter-oauth2-client依賴到pom.xml文件中
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId></dependency>
創建一個安全配置類,繼承WebSecurityConfigurerAdapter,并重寫configure(HttpSecurity http)方法。在該方法中,可以配置端點的訪問權限和OAuth2認證。
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/actuator/**").authenticated() // 需要認證才能訪問Actuator端點 .and() .oauth2Login(); // 使用OAuth2認證方式 }}
在application.properties或application.yml中配置OAuth2相關的屬性,例如客戶端ID、客戶端密鑰和授權服務器的URL等。
spring: security: oauth2: client: registration: myprovider: # OAuth2提供商名稱 client-id: your-client-id # 客戶端ID client-secret: your-client-secret # 客戶端密鑰 authorization-grant-type: authorization_code # 授權類型 redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" # 回調URL scope: openid,profile,email # 請求的權限范圍 provider: myprovider: # OAuth2提供商名稱 authorization-uri: https://your-authorization-server.com/oauth/authorize # 授權服務器的授權URL token-uri: https://your-authorization-server.com/oauth/token # 授權服務器的令牌URL user-info-uri: https://your-authorization-server.com/userinfo # 用戶信息URL jwk-set-uri: https://your-authorization-server.com/jwks # JSON Web Key Set URL
啟動應用后,訪問Actuator端點時,會跳轉到OAuth2認證服務器的授權頁面,要求輸入用戶名和密碼進行身份驗證。成功認證后,會返回一個授權碼,然后應用會使用該授權碼獲取訪問令牌,并進行后續的認證操作。
首先,需要在項目的pom.xml文件中添加Spring Security和JWT相關的依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version></dependency>
創建一個JWT工具類,用于生成和解析JWT令牌。這個工具類應該包含方法來生成令牌(通常在用戶登錄時),以及驗證和解析令牌(在需要用戶身份信息的端點)。
public class JwtUtil { private static final String SECRET_KEY = "yourSecretKey"; // 替換為你的密鑰 public static String generateToken(String subject) { return Jwts.builder() .setSubject(subject) .setIssuedAt(new Date()) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); }}
可以創建一個攔截器來處理帶有JWT的請求。攔截器會檢查每個請求的HTTP頭部是否包含JWT,如果存在,則解析JWT并驗證其有效性。如果驗證成功,請求將被允許繼續;如果驗證失敗,將返回未經授權的響應。
public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && !token.isEmpty()) { try { JwtUtil.parseToken(token); // 驗證令牌 return true; // 令牌有效,允許請求繼續 } catch (Exception e) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 令牌無效,返回未授權響應 return false; } } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 缺少令牌,返回未授權響應 return false; } }}
確保JWT的密鑰安全存儲,并定期更換以防止潛在的安全風險。密鑰的安全性對于維護整個認證系統的安全至關重要。
Spring Boot Actuator提供了多種監控和管理生產環境的端點。在使用JWT進行認證時,可以通過配置Actuator的端點來限制訪問,只有持有有效JWT的用戶才能訪問這些端點。
完成以上配置后,應該進行全面的測試,以確保JWT認證機制按預期工作。這包括測試令牌的生成、驗證過程,以及確保未授權的請求被正確拒絕。
JWT,全稱為JSON Web Token,就是我們經常提到的token,它以JSON對象的形式安全地在各個實體間傳輸信息。這些信息是經過數字簽名的,因此可以被驗證和信任。
JWT由三部分組成,它們用點(.)分隔,分別是:
JWT的主要用途包括:
JWT可以在用戶初次登錄后發放,之后的每次請求都會攜帶這個令牌,無需再次進行身份驗證,這簡化了認證流程。
JWT自身包含了所有必要的身份驗證信息,這意味著服務器不需要存儲會話信息,這增加了系統的可用性和伸縮性,減輕了服務端的負擔。
JWT基于標準JSON格式,可以輕松在不同的平臺和框架之間傳遞和使用,這在微服務架構和分布式系統中尤為重要。
JWT通常使用HS256等加密算法進行簽名,確保了令牌的完整性和真實性。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>com.hierynomus</groupId> <artifactId>sshj</artifactId> <version>0.31.0</version></dependency>
在application.properties或application.yml配置文件中,可以設置SSH的認證信息。
management: endpoints: web: exposure: include: '*' # 暴露所有端點 endpoint: health: show-details: always # 顯示健康檢查詳細信息 security: enabled: true # 啟用安全認證 roles: admin # 設置訪問權限為admin角色ssh: username: your_username # SSH用戶名 password: your_password # SSH密碼 host: your_host # SSH主機名
在數據庫中創建一個具有管理員角色的用戶,用于訪問Actuator端點。這可以通過使用Spring Data JPA和Hibernate來實現。例如,可以創建一個名為User的實體類和一個名為UserRepository的接口:
@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 省略getter和setter方法}@Repositorypublic interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByUsername(String username);}
在Spring Security的配置類中,可以配置SSH的安全認證。例如,可以創建一個名為SecurityConfig的配置類:
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserRepository userRepository; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/actuator/**").hasRole("ADMIN") // 只允許ADMIN角色訪問Actuator端點 .and() .formLogin().permitAll() // 允許所有用戶訪問登錄頁面 .and() .logout().permitAll(); // 允許所有用戶訪問注銷頁面 } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder()); } @Bean public UserDetailsService userDetailsService() { return username -> userRepository.findByUsername(username) .map(user -> User.withUsername(user.getUsername()).password(user.getPassword()).roles("ADMIN").build()) .orElseThrow(() -> new UsernameNotFoundException("User not found")); }}
完成以上配置后,應該進行全面的測試,以確保SSH認證機制按預期工作。這包括測試SSH連接、登錄和注銷功能等。
SSH最初設計用于替代不安全的Telnet和FTP,現在它廣泛應用于安全地連接和管理遠程系統。
SSH的主要用途包括:
SSH和Telnet都是遠程登錄協議,但它們在安全性、加密方式和端口號等方面存在顯著差異。
本文鏈接:http://www.tebozhan.com/showinfo-26-84908-0.html面試官:Spring Boot 中的監視器是什么?不是監聽器嘛
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com