当前位置:首页 > 科技  > 软件

面试官:Spring Boot 中的监视器是什么?不是监听器嘛

来源: 责编: 时间:2024-04-23 18:03:36 10观看
导读嗨,你好呀,我是哪吒。面试的时候,被问到 “Spring Boot 中的监视器是什么?有哪些功能和作用?”我的第一反应就是,不应该是监听器和拦截器吗?监听器是基于观察者模式的实现,其工作原理是通过注册监听器来订阅特定的事件,当这些

yNp28资讯网——每日最新资讯28at.com

嗨,你好呀,我是哪吒。yNp28资讯网——每日最新资讯28at.com

面试的时候,被问到 “Spring Boot 中的监视器是什么?有哪些功能和作用?”yNp28资讯网——每日最新资讯28at.com

我的第一反应就是,不应该是监听器和拦截器吗?yNp28资讯网——每日最新资讯28at.com

监听器是基于观察者模式的实现,其工作原理是通过注册监听器来订阅特定的事件,当这些事件发生时,Spring框架会通知所有注册了对应事件的监听器,然后监听器会执行相应的操作。yNp28资讯网——每日最新资讯28at.com

比如初始化数据、读取配置文件、记录日志等。yNp28资讯网——每日最新资讯28at.com

具体的操作步骤:yNp28资讯网——每日最新资讯28at.com

  • 定义一个事件类,它需要继承自ApplicationEvent;
  • 创建一个监听器类,实现ApplicationListener接口,并指定监听的事件类型;
  • 在监听器类中,可以重写onApplicationEvent方法来定义当事件发生时的具体行为;
  • 将监听器注册到Spring上下文中,这可以通过实现CommandLineRunner接口或者使用@EventListener注解来完成。

面试官:我说的是监视器。yNp28资讯网——每日最新资讯28at.com

很多小伙伴开发多年,确实是没注意过监视器这个概念。yNp28资讯网——每日最新资讯28at.com

Spring Boot中的监视器是Actuator,我一般用来监控响应时间、CPU使用率、内存使用情况。yNp28资讯网——每日最新资讯28at.com

还可以通过分析日志信息,快速定位问题原因,还可以提供预警机制,以便在出现故障或异常时及时采取措施进行修复。yNp28资讯网——每日最新资讯28at.com

监视器可以与自动化运维工具集成,实现自动化部署、监控、报警和恢复等功能,提高运维效率。yNp28资讯网——每日最新资讯28at.com

可以通过一些端点进行监控和管理,比如:yNp28资讯网——每日最新资讯28at.com

  • 通过/actuator/health端点可以查看应用的健康状态信息。
  • 通过/actuator/info端点获取应用的基本信息。
  • 通过/actuator/metrics端点收集应用运行时的性能指标。
  • 通过/actuator/httptrace端点追踪HTTP请求的处理过程。
  • 记录应用的使用情况,如访问次数等。
  • 查看和管理应用中Spring Bean的状态。
  • 允许通过/actuator/shutdown端点来平滑关闭应用。

小结一下:yNp28资讯网——每日最新资讯28at.com

监听器通常用于响应应用程序中的特定事件,当某个事件发生时,监听器可以执行预定义的动作。yNp28资讯网——每日最新资讯28at.com

监听器用于响应特定的应用事件,如服务启动、请求处理等,以及实现特定业务逻辑的处理。yNp28资讯网——每日最新资讯28at.com

监视器指的是能够监控和管理应用程序状态的组件或工具。在Spring Boot中,Actuator是一个内置的监控组件,它提供了多种端点来检查应用的健康状况、性能指标、日志信息等。yNp28资讯网——每日最新资讯28at.com

监视器用于监控应用程序的运行状态,提供健康检查、性能统计等信息,帮助维护和优化应用性能。yNp28资讯网——每日最新资讯28at.com

再分享几道,彻底掌握监视器的常见问题。yNp28资讯网——每日最新资讯28at.com

1.使用监视器时的有哪些需要注意?

在开始使用监视器之前,需要明确监控的目标和范围。确定需要监控的关键指标,如响应时间、错误率、资源利用率等,并设定合理的阈值。yNp28资讯网——每日最新资讯28at.com

根据监控目标,配置合适的监控策略。这可能包括监控频率、数据聚合方式、报警触发条件等。确保监控策略能够有效地捕捉到潜在问题,并及时发出警报。yNp28资讯网——每日最新资讯28at.com

监视器本身也会占用一定的系统资源,并可能对应用程序的性能产生一定影响。因此,在选择和使用监视器时,需要权衡其功能和性能开销,确保不会对应用程序造成过大的负担。yNp28资讯网——每日最新资讯28at.com

监视器可能会收集到一些敏感信息,如用户数据、系统配置等。因此,在使用监视器时,需要确保敏感信息得到妥善保护,避免泄露给未经授权的人员。yNp28资讯网——每日最新资讯28at.com

2.除了基本认证,Spring Boot Actuator还支持哪些身份验证方式?

  • OAuth2:这是一种开放标准,它允许应用程序在获得用户授权后,访问其数据而无需知道用户的凭据。Actuator可以通过配置OAuth2客户端和提供授权服务器的URL来集成OAuth2认证。
  • LDAP(轻量级目录访问协议):如果你的应用程序已经使用了LDAP进行用户管理,Actuator可以配置为使用LDAP进行身份验证,这样用户就可以使用他们在LDAP中的凭据来访问Actuator端点。
  • JWT(JSON Web令牌):这是一种自包含的令牌,用于在各方之间安全地传输信息。Actuator可以配置为接受JWT作为有效的身份验证方法。
  • JMX(Java管理扩展):虽然JMX主要用于内部监控和管理,但Actuator也提供了通过JMX端点访问信息的机制。这通常在开发和测试环境中使用,因为它需要直接连接到运行中的应用。
  • SSH(安全外壳协议):Actuator支持通过SSH进行远程访问和管理,这在需要安全的远程访问时非常有用。

3.Spring Boot中如何使用Actuator?

在pom.xml文件中添加Actuator的依赖。yNp28资讯网——每日最新资讯28at.com

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-actuator</artifactId></dependency>

在application.properties或application.yml中配置Actuator的相关属性,例如开启所有的端点:yNp28资讯网——每日最新资讯28at.com

management:  endpoints:    web:      exposure:        include: "*"

使用浏览器或者命令行工具(如curl)访问不同的端点。yNp28资讯网——每日最新资讯28at.com

# 获取应用的健康状态信息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

4.如何在Spring Boot Actuator中使用自定义的用户名和密码进行认证?

创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(AuthenticationManagerBuilder auth)方法。在该方法中,可以配置自定义的用户名和密码。yNp28资讯网——每日最新资讯28at.com

@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中配置端点的安全路径和访问权限。yNp28资讯网——每日最新资讯28at.com

management:  endpoints:    web:      base-path: /actuator # 设置Actuator端点的根路径      exposure:        include: "*" # 暴露所有端点  security:    enabled: true # 启用Actuator的安全认证

启动应用后,访问Actuator端点时,会提示输入自定义的用户名和密码进行身份验证。例如,访问/actuator/health端点时,浏览器会弹出一个登录窗口,要求输入自定义的用户名和密码。yNp28资讯网——每日最新资讯28at.com

5.如何在Spring Boot Actuator中限制特定端点的访问权限?

在Spring Boot Actuator中,可以通过配置端点的访问权限来限制特定端点的访问。yNp28资讯网——每日最新资讯28at.com

创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法。在该方法中,可以配置特定端点的访问权限。yNp28资讯网——每日最新资讯28at.com

@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中配置用户名和密码以及用户的角色:yNp28资讯网——每日最新资讯28at.com

spring:  security:    user:      name: admin # 用户名      password: secret # 密码      roles: ADMIN # 用户角色

启动应用后,访问Actuator端点时,会提示输入用户名和密码进行身份验证。例如,访问/actuator/health端点时,浏览器会弹出一个登录窗口,要求输入用户名和密码。只有具有ADMIN角色的用户才能成功访问该端点。yNp28资讯网——每日最新资讯28at.com

6.如何在Spring Boot Actuator中使用OAuth2进行认证?

添加spring-boot-starter-oauth2-client依赖到pom.xml文件中yNp28资讯网——每日最新资讯28at.com

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-oauth2-client</artifactId></dependency>

创建一个安全配置类,继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法。在该方法中,可以配置端点的访问权限和OAuth2认证。yNp28资讯网——每日最新资讯28at.com

@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等。yNp28资讯网——每日最新资讯28at.com

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认证服务器的授权页面,要求输入用户名和密码进行身份验证。成功认证后,会返回一个授权码,然后应用会使用该授权码获取访问令牌,并进行后续的认证操作。yNp28资讯网——每日最新资讯28at.com

7.如何在Spring Boot Actuator中使用JWT进行认证?代码举例说明

(1)导入依赖

首先,需要在项目的pom.xml文件中添加Spring Security和JWT相关的依赖。yNp28资讯网——每日最新资讯28at.com

<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>

(2)配置JWT工具类

创建一个JWT工具类,用于生成和解析JWT令牌。这个工具类应该包含方法来生成令牌(通常在用户登录时),以及验证和解析令牌(在需要用户身份信息的端点)。yNp28资讯网——每日最新资讯28at.com

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();    }}

(3)创建拦截器

可以创建一个拦截器来处理带有JWT的请求。拦截器会检查每个请求的HTTP头部是否包含JWT,如果存在,则解析JWT并验证其有效性。如果验证成功,请求将被允许继续;如果验证失败,将返回未经授权的响应。yNp28资讯网——每日最新资讯28at.com

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;        }    }}

(4)安全存储密钥

确保JWT的密钥安全存储,并定期更换以防止潜在的安全风险。密钥的安全性对于维护整个认证系统的安全至关重要。yNp28资讯网——每日最新资讯28at.com

(5)使用Actuator端点

Spring Boot Actuator提供了多种监控和管理生产环境的端点。在使用JWT进行认证时,可以通过配置Actuator的端点来限制访问,只有持有有效JWT的用户才能访问这些端点。yNp28资讯网——每日最新资讯28at.com

(6)测试验证

完成以上配置后,应该进行全面的测试,以确保JWT认证机制按预期工作。这包括测试令牌的生成、验证过程,以及确保未授权的请求被正确拒绝。yNp28资讯网——每日最新资讯28at.com

8.JWT是什么?有什么用?有哪些应用场景?

JWT,全称为JSON Web Token,就是我们经常提到的token,它以JSON对象的形式安全地在各个实体间传输信息。这些信息是经过数字签名的,因此可以被验证和信任。yNp28资讯网——每日最新资讯28at.com

JWT由三部分组成,它们用点(.)分隔,分别是:yNp28资讯网——每日最新资讯28at.com

  • Header(头部):包含两部分信息,令牌的类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA)。
  • Payload(负载):包含有关实体(通常是用户)和其他数据的声明。这部分也可以包含其他自定义信息。但请注意,JWT默认不加密,任何人都可以解码其内容,因此不要将敏感信息放入负载中,除非它们是加密的。
  • Signature(签名):是使用头部中指定的算法和密钥对头部和负载进行签名的结果。这使得接收方可以验证信息的发送者以及信息的完整性。

JWT的主要用途包括:yNp28资讯网——每日最新资讯28at.com

  • 授权:用户登录后,系统会返回一个JWT,之后的每个请求都会携带这个令牌,以便用户访问允许的资源和服务。这种方式在实现单点登录(SSO)时特别有用,因为JWT可以轻松跨域使用,且相比传统Cookie方式更加轻量级。
  • 防止数据篡改:JWT可以使用加密算法对数据进行签名,即使数据在传输过程中被截获,由于缺乏发送方的私钥,攻击者很难同时篡改数据和签名,从而保证了数据的完整性。
  • 鉴权:JWT可以用于验证用户是否有权访问系统。与传统的Session加Cookie的组合相比,JWT将用户数据直接下发给客户端,每次请求时客户端会附带JWT一并发送给服务器,这样服务器就无需缓存用户数据,降低了服务器的开销,并且提高了系统的可扩展性。

9.在企业应用集成中,JWT有哪些优势?

JWT可以在用户初次登录后发放,之后的每次请求都会携带这个令牌,无需再次进行身份验证,这简化了认证流程。yNp28资讯网——每日最新资讯28at.com

JWT自身包含了所有必要的身份验证信息,这意味着服务器不需要存储会话信息,这增加了系统的可用性和伸缩性,减轻了服务端的负担。yNp28资讯网——每日最新资讯28at.com

JWT基于标准JSON格式,可以轻松在不同的平台和框架之间传递和使用,这在微服务架构和分布式系统中尤为重要。yNp28资讯网——每日最新资讯28at.com

JWT通常使用HS256等加密算法进行签名,确保了令牌的完整性和真实性。yNp28资讯网——每日最新资讯28at.com

10.如何在Spring Boot Actuator中使用SSH进行认证?代码举例说明

导入依赖。
<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的认证信息。yNp28资讯网——每日最新资讯28at.com

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的接口:yNp28资讯网——每日最新资讯28at.com

@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的配置类:yNp28资讯网——每日最新资讯28at.com

@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连接、登录和注销功能等。yNp28资讯网——每日最新资讯28at.com

11.SSH是什么?有什么用?有哪些应用场景?

SSH最初设计用于替代不安全的Telnet和FTP,现在它广泛应用于安全地连接和管理远程系统。yNp28资讯网——每日最新资讯28at.com

SSH的主要用途包括:yNp28资讯网——每日最新资讯28at.com

  • 远程登录和终端访问:用户可以通过SSH客户端远程登录到服务器或其他设备,并进行命令行操作或图形界面操作。
  • 文件传输:SFTP(SSH File Transfer Protocol)是基于SSH实现的安全文件传输协议,允许用户在本地系统和远程服务器之间安全地传输文件。
  • 端口转发:SSH可以实现端口转发,从而在本地主机和远程主机之间建立安全的通信通道,用于访问远程主机上的服务。
  • 远程执行命令:SSH允许用户在远程服务器上执行命令,这对于自动化任务和远程管理非常有用。
  • 隧道:SSH可以创建安全的通信隧道,通过不受信任的网络传输数据。

12.SSH和Telnet的区别是什么?

SSH和Telnet都是远程登录协议,但它们在安全性、加密方式和端口号等方面存在显著差异。yNp28资讯网——每日最新资讯28at.com

  • SSH不仅是替代Telnet的远程控制台管理应用程序的行业标准,还可以为ftp、pop等提供一个安全的通道。相比之下,Telnet的功能相对单一,主要提供在本地计算机上完成远程主机工作的能力。
  • SSH提供了加密传输,而Telnet则使用明文传输。
  • SSH通常使用端口22,而Telnet使用端口23
  • 由于Telnet传输的数据是明文的,因此默认情况下防火墙是不信任Telnet的。而SSH由于其加密特性,通常能得到防火墙的信任。

本文链接:http://www.28at.com/showinfo-26-84908-0.html面试官:Spring Boot 中的监视器是什么?不是监听器嘛

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你真的知道吗?Python中什么变量会返回false

下一篇: 快手二面:有了Cookie和Session 为什么还要JWT ?你说一下JWT的原理?

标签:
  • 热门焦点
Top