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