北京小厂 三三云软 面经

0 408

北京小厂 三三云软 面经

北京小厂 三三云软 面经

1.SpringCloud分布式系统中用户登录这一块的设计?(6min)

在Spring Cloud分布式系统中,用户登录的设计可以按照以下步骤进行:

  1. 用户提交登录请求:用户在前端页面输入用户名和密码后,点击登录按钮,将登录请求发送给后端。
  2. 鉴权中心:可以使用OAuth2或者JWT等鉴权机制来进行用户身份验证和授权。一种常见的方式是使用单独的认证服务作为鉴权中心,其他微服务通过调用认证服务来验证用户身份。
  3. 认证服务:认证服务负责验证用户的用户名和密码是否正确,并生成一个令牌(Token)作为用户的凭证。可以使用Spring Security等框架来实现认证服务。
  4. 令牌的生成和管理:令牌可以使用JWT(JSON Web Token)来生成,其中包含了用户的身份信息和权限等。认证服务在验证通过后,将生成的令牌返回给用户。
  5. 令牌的校验和刷新:其他微服务在接收到用户请求时,需要对令牌进行校验,确保令牌的有效性和合法性。可以编写一个全局过滤器或者拦截器,在请求到达微服务之前对令牌进行校验。如果令牌过期,可以使用刷新令牌的方式来获取新的令牌。
  6. 用户信息的存储和管理:可以使用数据库或者其他缓存技术来存储用户的基本信息,如用户名、密码、权限等。认证服务在验证用户身份时,可以通过查询数据库或者缓存来获取用户信息。
  7. 安全性考虑:在用户登录设计中,需要注意对用户密码的安全存储,可以使用加密算法对密码进行加密存储。同时,为了防止恶意攻击,可以采用一些安全策略,如登录失败次数限制、验证码等。

以上是一个基本的用户登录设计思路,具体的实现可以根据项目需求和技术选型进行调整和扩展。

2.计网七层模型介绍?(4min)


计算机网络七层模型,也称为OSI模型(Open Systems Interconnection),是一种将计算机网络协议划分为不同层次的体系结构。每一层都有特定的功能,各层之间通过接口进行通信和协作。以下是对每一层的简要介绍:

  1. 物理层(Physical Layer):负责传输比特流,即将数据从一个节点物理上传输到另一个节点。它定义了电气、物理和功能规范,如传输介质、连接器类型、数据传输率等。
  2. 数据链路层(Data Link Layer):提供可靠的点到点数据传输,将比特流划分为帧,实现帧的传输和错误检测。该层通常包括物理寻址、数据帧同步、流控制和差错纠正等功能。
  3. 网络层(Network Layer):负责将数据分组(或称为数据包)从源节点传送到目的节点。该层主要处理路由选择、拥塞控制和逻辑寻址等问题,如IP协议就是在网络层工作。
  4. 传输层(Transport Layer):提供端到端的可靠数据传输服务,主要负责数据的分段和重组,以及错误检测和纠正。常见的传输层协议有TCP(传输控制协议)和UDP(用户数据报协议)。
  5. 会话层(Session Layer):为应用程序之间建立和维护通信会话,处理会话控制和同步问题,如会话的建立、终止和管理。
  6. 表示层(Presentation Layer):负责数据的格式化和编码,以确保不同设备之间的数据能够正确解释和理解。该层还负责数据的加密和解密等安全机制。
  7. 应用层(Application Layer):提供网络服务给最终用户,包括各种应用协议,如HTTP、FTP、SMTP等。应用层是用户直接接触的网络层次,用于实现特定的网络应用和功能。

七层模型的设计使得不同层之间的功能和责任得以清晰划分,以便于不同厂商和组织开发和实施网络协议。同时,它也为网络故障排查和协议分析提供了方便和指导。

3.Spring中的常用注解?(5min)


Spring框架中有很多常用的注解,以下是其中一些常见的注解:

  1. @Component: 用于标记一个类为Spring容器的组件,让Spring进行管理。
  2. @Controller: 用于标记一个类为Spring MVC的控制器,处理用户请求。
  3. @Service: 用于标记一个类为服务层组件,通常用于定义业务逻辑。
  4. @Repository: 用于标记一个类为数据访问层组件,通常用于对数据库进行操作。
  5. @Autowired: 用于进行依赖注入,通过类型进行自动装配。
  6. @Qualifier: 用于指定具体的bean名称进行装配,配合@Autowired使用。
  7. @Value: 用于注入属性值,可以从配置文件中读取。
  8. @RequestMapping: 用于映射URL和方法的关系,定义请求的路径和HTTP方法。
  9. @PathVariable: 用于获取URL路径中的参数值。
  10. @RequestParam: 用于获取请求参数的值。
  11. @ResponseBody: 用于将方法返回的对象转化为JSON格式返回给客户端。
  12. @Validated: 用于实现数据校验,配合JSR 303/349规范的校验注解使用。
  13. @Transactional: 用于事务管理,在方法或类上添加该注解可以开启事务。
  14. @Aspect: 用于定义切面,结合其他注解实现面向切面编程。
  15. @Configuration: 用于标记一个类为配置类,替代XML配置文件。

这些注解是Spring框架中被广泛应用的一部分,通过合理使用这些注解可以简化开发工作,提高代码的可读性和可维护性。需要根据具体的需求选择合适的注解进行使用。

4.缓存击穿?(2min)


缓存击穿是指在使用缓存的系统中,当某个缓存的数据过期或者被删除时,恰好有大量的并发请求访问该数据,导致这些请求都绕过缓存,直接访问数据库或其他存储介质,从而导致数据库压力激增,系统性能下降的一种情况。

通常情况下,缓存是通过设置一定的过期时间来自动刷新的,当数据过期时,会触发缓存的更新操作,重新从数据库中获取最新数据并更新缓存。然而,如果在缓存更新之前,大量的请求同时到达,就会导致这些请求都无法命中缓存,而直接访问数据库,从而造成数据库压力激增,甚至可能导致数据库宕机。

为了避免缓存击穿问题,可以采取以下几种策略:

  1. 延迟缓存失效时间:在缓存失效之后,不立即更新缓存,而是先设置一个较短的过期时间,然后再异步更新缓存。这样可以防止大量并发请求直接访问数据库。
  2. 使用互斥锁:在缓存失效的情况下,通过互斥锁来控制只有一个请求能够访问数据库,并将更新后的数据存入缓存。其他请求在获取锁之后,直接从缓存中获取数据。
  3. 热点数据预加载:将热点数据在系统启动时或者低峰期预先加载到缓存中,避免在缓存失效时才去查询数据库。
  4. 增加缓存容量:增加缓存服务器的数量和容量,以应对更多的请求访问。

综上所述,为了避免缓存击穿问题,需要根据具体的场景和需求选择适当的策略,并结合监控和调优来维护系统的性能和稳定性。

5,Redis 嵌套(面试官读音是“死肉”)还是啥来着忘记了,尬住了....(下次记得不会说不会)

没问题,Redis是一个开源的内存数据库,是Remote Dictionary Server的缩写。

Redis是一个高性能的键值存储系统,支持丰富的数据结构,如字符串、哈希表、列表、集合和有序集合等。它以内存作为数据存储介质,可以快速地读取和写入数据,因此具有非常高的读写性能。

除了内存存储,Redis还支持持久化功能,可以将数据定期或实时保存到磁盘上,以实现数据的持久化。这样即使在Redis重启时,数据也不会丢失。

Redis还提供了一些高级功能,如发布-订阅模式、事务支持和分布式锁等,使其更适用于复杂的应用场景。

在分布式系统中,Redis可以作为缓存、消息队列和计数器等使用,可以提高系统的性能和可扩展性。

关于Redis的嵌套,可能是指Redis的数据结构之间的嵌套使用,如在哈希表中存储列表或集合。这样可以更灵活地组织和管理数据,以满足不同的业务需求。

希望这个回答对你有所帮助,如果还有其他问题,请随时提问。

6,介绍动态代理,你会如何实现?(jdk)(2min)


动态代理是指在运行时动态生成代理对象的技术,通过代理对象来间接访问目标对象,实现对目标对象的增强或控制。

在JDK中,动态代理主要通过java.lang.reflect.Proxy类来实现。以下是一种简单实现动态代理的方式:

  1. 通过实现InvocationHandler接口创建代理类,该接口中有一个invoke方法,用于在代理对象方法被调用时进行增强处理。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler {
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置增强
        // ...

        Object result = method.invoke(target, args);

        // 后置增强
        // ...

        return result;
    }
}
  1. 在需要生成代理对象的地方,使用Proxy的newProxyInstance方法来创建代理对象。
public class Main {
    public static void main(String[] args) {
        RealObject realObject = new RealObject();
        DynamicProxy dynamicProxy = new DynamicProxy(realObject);
        // 通过Proxy的newProxyInstance方法创建代理对象
        Object proxyObject = Proxy.newProxyInstance(
                realObject.getClass().getClassLoader(),
                realObject.getClass().getInterfaces(),
                dynamicProxy);

        // 通过代理对象调用方法
        ((SomeInterface) proxyObject).someMethod();
    }
}

在上述代码中,当代理对象的方法被调用时,实际执行的是DynamicProxy中的invoke方法,在invoke方法中可以进行前后置增强的操作,如日志记录、权限验证等。

需要注意的是,动态代理只能代理接口,如果要代理具体的类,可以使用第三方库,如CGLib。

以上是基于JDK实现动态代理的简单介绍,实际使用时还需根据具体业务需求进行扩展和优化。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章资源,如无特殊说明或标注,均为本站网友和创作者贡献分享。如若本站内容侵犯了原著者的合法权益,可联系网站客服QQ2743319061删除。

云炬星球 云炬随笔 北京小厂 三三云软 面经 https://src.yunjunet.cn/1627207.html

常见问题
  • 放心亲,我们不会为了几十块钱的东西坏了名声!
查看详情
  • 方法一:点击“立即下载.”按钮,付款后在下载弹窗的虚线框的隐藏信息里获取 方法二:在正文底部使用VIP查看隐藏的解压密码 方法三:联系【云炬网络】公众号客服获取
查看详情
  • 付款后会出现“立即下载”按钮(点击即可下载),如果下载失败也可以联系客服发订单截图补发。
查看详情
  • 登录购买会多端同步购买记录,永久可以查看反复下载;非登录购买仅将购买记录保存到本地浏览器中,浏览器cookie清除后无法再次下载。先右上角点登录,然后点击微信图标可以快速授权注册登录^_^
查看详情
  • 可以试看。点击”查看演示“或“试看预览”按钮可以试读从资料目录中节选的部分内容,也可以自己指定想试看的内容。
查看详情
  • 原因一:本站所有资源已开启有效性检测(服务器24h全自动监测),当监测到下载链接无法访问时会提示“该资源已失效,请勿购买”,遇到这种情况可以联系客服修复失效的下载链接,或直接联系客服在淘宝下单购买即可。(检测原理:购买前服务器程序会预访问下载链接,响应值为200说明资源有效允许购买,响应值为404或502等报错说明资源失效禁止购买)。原因二:上传者未启用“下载”选项。
查看详情
官方客服团队

为您解决烦忧 - 24小时在线 专业服务