important

本文深入探讨了Spring框架的核心概念,包括AOP、SpringMVC的工作流程、DispatcherServlet的作用、拦截器与过滤器的区别等。此外还介绍了Dubbo架构、Zookeeper在分布式系统中的应用、Nginx的负载均衡策略等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、框架

1、看你在项目中使用过Spring,你对AOP了解多吗?(问spring必问aop

      AOP,即面向切面编程,动态的为核心功能添加扩展功能,多用于事务和日志,在spring中配置。

2、Spring MVC的执行流程

      客户端发起请求,前端控制器dispatcherservlet处理请求,拦截器Interceptors去判断是否放行,映射处理器      HandlerMapping根据url匹配对应的controller,然后执行controller->service->dao的操作,再次经过dispatcherservlet,将返回的数据交给映射器ViewResolver处理,返回给客户端。

3、DispatcherServlet你知道吧?它用来干嘛的

      前端控制器DispatcherServlet是springmvc处理请求的入口,是springmvc的核心,这个控制器一般需要在服务器启动时即初始化,即设置<load-on-startup>。

4、拦截器和过滤器的区别?

     拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略

    Filter是基于函数回调的,而Interceptor则是基于Java反射的。

    Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。

    Filter对几乎所有的请求起作用,而Interceptor只能对controller请求起作用。

    Interceptor可以访问controller的上下文,值栈里的对象,而Filter不能。

   在controller的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

4、画一画dubbo的架构图,dubbo节点之间的长链接有哪些,dubbo协议了解吗?

5、当zookeeper宕机后(不考虑集群)消费者系统还能运行吗?

      可以,每台服务器都会缓存一份服务调用列表的,zk起到的是同步服务的作用。问题在于如果生产者有节点宕机,消费者是不知道的,所以还会一直给这台宕机的服务器发送请求,知道请求超时。

6、Nginx的负载均衡策略中hash策略有哪些优缺点?

      优点:能够保存用户信息,保证访问服务器一直是同一台;

      缺点:如果客户端发起大量请求,则这些请求会在同一时刻访问同一台服务器,导致该台服务器宕机,跟着再访问第二台服务器,结果同理。最终导致所有服务器宕机。

6、Mybatis中#{}和${}传参的区别

在获取DAO接口中的参数信息时,${ }创建的不是预编译的SQL,而是字符串的拼接,有可能会导致SQL注入问题

#{ }底层会创建预编译的SQL,性能会相对较好

7、Mybatis的作用域(Scope)

     SqlSessionFactoryBuildeSqlSessionFactoryBuilder、SqlSessionFactory、SqlSession

8、zookeeper的选主过程了解吗

     构建 Zookeeper 集群的时候,使用的服务器最好是奇数台。在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任务数据写成功。

①如果有3个Server,则最多允许1个Server 挂掉。

②如果有4个Server,则同样最多允许1个Server挂掉。

既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可,这里选择3个Server。

9、是否动手实现过分布式锁?

      redis实现,命令为set(key,value,NX,EX,expiretime);

10、redis和memcache的区别;

1、性能对比:由于redis只使用单核,而memcached可以使用多核,所以平均每一个核上redis在存储小数据时比memcached性能更高。而在100k以上的数据中,memcached性能要高于redis,虽然redis最近也在存储大数据的性能上进行优化,但是比起memcached,还是稍有逊色。

2、内存使用效率对比:使用简单的key-value存储的话,memcached的内存利用率更高,而如果redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memcached。另外,memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 redis更适合作为存储而不是cache。

3、redis支持服务器端的数据操作:redis相比memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么redis会是不错的选择。

 

Redis优势:

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

(4)Redis支持数据的备份,即master-slave模式的数据备份。

(5)、使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

(6)value大小:redis最大可以达到1GB,而memcache只有1MB

9、redis是如何持久化的:rdb和aof。它们各有什么特点?(京东)

      rdb可丢失数据,但效率高;Redis默认持久化方式

      aof不丢失数据

10、redis有哪些数据类型?

       五种

       string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

11、redis为什么设计成单线程模型?

        官方回答:因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

       1、编程简单。相比较与多线程的实现方式,单线程实现较为简单;

       2、并发帮助。采用并发操作实现类似多线程的效果;

       3、计算量小。Redis主要用于存储数据,CPU不是瓶颈,网络通常是瓶颈。如果应用程序设计正确,能够避免IO阻塞,线程将是最后需要担心的问题。

       4、部署简单。由于Redis是单线程,故能部署在低端单核单CPU机器上

       redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

       单线程的好处:

       1、代码更清晰,处理逻辑更简单

       2、不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

       3、不存在多进程或者多线程导致的切换而消耗CPU

       因为是单一线程,所以同一时刻只有一个操作在进行,所以,耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。而单一线程也只能用到一个CPU核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成master-master或者master-slave的形式,耗时的读命令可以完全在slave进行。

12、Redis快的原因?

        1. 完全基于内存

            Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。

             连接数为10000时,QPS(每秒内查询次数可达90000)

        2. 数据结构简单,对数据操作也简单

        3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而

            消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性

            能消耗;

        4. 使用多路 I/O 复用模型,非阻塞IO。(避免了使用锁)

            多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时

            候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会

            轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的

            流,这种做法就避免了大量的无用操作。

            这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单

            个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的

            速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈。

主要由以上几点造就了Redis 具有很高的吞吐量。

13、mybatis是如何管理session和cache的?

14、maven的jar版本冲突如何解决

        在配置文件pom.xml中添加dependencyManagement标签,声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。

<properties>

        <spring.version>4.2.4.RELEASE</spring.version>

        <hibernate.version>5.0.7.Final</hibernate.version>

        <struts.version>2.3.24</struts.version>

    </properties>

    <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework</groupId>

                <artifactId>spring-context</artifactId>

                <version>${spring.version}</version>

            </dependency>

</dependencies>

</dependencyManagement>

15、 消费者访问生产者需要经过zk吗?

不需要,消费者只需要向注册中心请求配置信息和服务地址即可,再根据这些信息去访问对应的服务器(生产者)

16、zk可以被哪些替换?

Zookeeper是基于CP设计的,为了保证一致性,类似的还有Consul,Redis也可以作为注册中心;

基于AP设计的有Eureka,Eureka不会有类似于ZooKeeper的选举leader的过程,客户端请求会自动切换到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;

Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口;

CAP理论中可以理解为在发生分区容忍性(P)时,应用对一致性(C)和可用性(A)之间的一种抉择;

Zookpper需要实现集群,防止只有一台直接宕掉;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值