开源框架知识-面试题

开源框架知识

  1. 简单讲讲tomcat结构,以及其类加载器流程,线程模型等。
  • Tomcat结构

    • tomcat的conf目录下的server.xml 配置文件可体现Tomcat结构。Tomcat中只有一个server,一个server可以有多个service,一个service可以有多个Connector和一个Container

    • service 是对外提供服务的。Connector用于接收请求并将请求封装成Request和Response.

      Container用于封装和管理servlet,以及处理request请求

    • 一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端

  • 类加载流程

    • BootStrap启动类加载—> System 系统类加载------> Common 通用类加载-----> Webapp 通用类加载
  • 线程模型

    • BIO:阻塞式IO,采用传统的java IO进行操作,该模式下每个请求都会创建一个线程,

      适用于并发量小的场景

    • NIO:同步非阻塞,比传统BIO能更好的支持大并发,tomcat 8.0 后默认采用该模式

    • APR:tomcat 以JNI形式调用http服务器的核心动态链接库来处理文件读取或网络传输操作,需要编译安装APR库

    • AIO:异步非阻塞,tomcat8.0后支持

  1. tomcat如何调优,涉及哪些参数 。
  • JVM参数调优
    • -server : 使tomcat以server模式运行,这个模式下将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机 制,可以有更大的负载与吞吐量
    • -Xms -Xmx: jvm 堆设置
    • -Xss 堆栈设置
    • -XX:PermSize 和 -XX:MaxPermSize:非堆设置
  • Tomcat配置优化
    • connectionTimeout: 超时时间单位是ms,并发要求高的话,将此值减少!
    • acceptCount: 当指定的连接数被用尽时,可放到出列队列中的数量,也即可接受的排队数量.
    • maxThreads: Tomcat可创建的最大的线程数(每一个线程对应一个请求), maxThreads决定了tomcat的最大线程阀值,需要设置的大一些
    • maxKeepAliveRequests: 表示该连接最大支持的请求次数。
  1. 讲讲Spring加载流程。
  • 创建ServletContext --> 触发容器初始化cotextInitialized->创建上下文WebApplicationContext
  1. spring bean 生命周期
  • 实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization -->销毁 Destruction
  • 属性赋值后调用spring接口实现获取额外信息:BeanNameAware、BeanFactoryAware、ApplicationContextAware、EnvironmentAware 等等获取spring容器内的资源信息。
  • BeanPostProcessor 接口实现类加载在 实例化 和 初始化 阶段 用来影响bean对象,添加自定义逻辑。
  1. Spring AOP的实现原理。
  • spring aop通过代理模式生成代理对象,在不修改源代码情况下,对实现功能进行增强。其提供两种动态代理方式:
    • jdk动态代理
    • cglib动态代理
  • aop有多个场景应用:日志、事务、懒加载、缓存、权限
  1. 讲讲Spring事务的传播属性。
  • PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
  • PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。
  1. Spring如何管理事务的。
  • spring最初会去连接池中获取一个数据库连接,获取到连接之后修改数据库提价方式为手动提交,然后配合spring动态代理对象完成。
  • spring事务管理主要由三个接口配合完成
    • PlatformTransactionManager:事务管理器–主要用于平台相关事务的管理
    • TransactionDefinition:事务定义信息–用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用
    • TransactionStatus:事务具体运行状态–事务管理过程中,每个时间点事务的状态信息。
  1. spring循环注入的原理
  • 循环注入三种情形
    • 构造器注入。触发循环依赖,抛出BeanCurrentlyInCreationException异常
    • 单例bean的setter注入; Spring是先将Bean对象实例化之后,再设置对象属性,所以会先调用他的无参构造函数实例化。每个对象存在一个map中。当遇到依赖,就去map中调用对应的单例对象。
    • 多例bean的setter注入;对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。
  1. Springmvc 中DispatcherServlet初始化过程。

    1. 用户发送请求至前端控制器DispatcherServlet。
    2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    4. DispatcherServlet调用HandlerAdapter处理器适配器。
    5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
    6. Controller执行完成返回ModelAndView。
    7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
    8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
    9. ViewReslover解析后返回具体View.
    10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
    11. DispatcherServlet响应用户。
  2. springmvc用到的注解,作用是什么,原理。

  • controller、service、repository、component 这四个注解分别作用域控制层、业务层、持久层,第四个常用配置类。当spring容器进行加载的时候,会将标记为以上注解的类注入到spring容器中。
  • @Autowired 自动装配,默认是类型匹配。当有需要名称匹配时可搭配@Qualifier(“class-name”)注解
  • @Resource注解,默认通过name属性去匹配bean,当找不到时再按type去匹配,当指定了name或者type则根据指定的类型去匹配bean
  • component-scan标签默认情况下自动扫描指定路径下的包
  • RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上
  1. springboot启动机制。
  • @SpringBootApplication : springboot启动注解,负责扫描注册全局,是springboot的核心注解,它其实是一个组合注解
    • @SpringBootConfiguration: 内部引用@Configuration,用于标识这个类可以使用Spring IoC容器作为bean定义的来源。其搭配注解@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
    • @ComponentScan:自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
    • @EnableAutoConfiguration:借助@Import的支持,收集和注册特定场景的相关bean定义,将所有符合自动配置条件的bean定义加载到IoC容器
      • EnableAutoConfigurationImportSelector:@Import(EnableAutoConfigurationImportSelector.class)
      • SpringFactoriesLoader:其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
  • SpringApplication的run方法:开始->收集条件->准备环境->创建并实例ApplicationContext->refresh->结束
    1. 创建一个SpringApplication对象实例,并通知创建应用开始。
    2. 创建并配置当前Spring Boot应用将要使用的Environment,并通知环境配置已经加载
    3. ApplicationContext创建
    4. 将之前通过@EnableAutoConfiguration获取的配置加载到ApplicationContext
    5. ApplicationContext的refresh()
  1. netty的线程模型,netty如何基于reactor模型上实现的。
  • Reactor 单线程模式:是指所有的 I/O 操作都在同一个 NIO 线程上面完成的,此时NIO线程职责包括:接收新建连接请求、读写操作等。
  • Rector 多线程模型:与单线程模型最大的区别就是有一组 NIO 线程来处理连接读写操作,一个NIO线程处理Accept。一个NIO线程可以处理多个连接事件,一个连接的事件只能属于一个NIO线程。
  • 主从 Reactor 线程模型:服务端用于接收客户端连接的不再是一个单独的 NIO 线程,而是一个独立的 NIO 线程池。
  • netty 的线程模型并不是一成不变的,它实际取决于用户的启动参数配置。通过设置不同的启动参数,Netty 可以同时支持 Reactor 单线程模型、多线程模型。
  1. 为什么选择netty。
  • Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。
  1. netty的fashwheeltimer的用法,实现原理,是否出现过调用不够准时,怎么解决
  • HashedWheelTimer提供的是一个定时任务的一个优化实现方案,在netty中主要用于异步IO的定时规划触发
  1. netty的心跳处理在弱网下怎么办。
  • 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.一个连接如果长时间不用,防火墙或者路由器就会断开该连接。对于如何监测连接是否断开,则是通过重写ChannelInboundHandler#channelInactive来实现,但连接不可用,该方法会被触发
  1. 什么是TCP粘包,拆包。解决方式是什么。
  • 粘包:假设客户端向服务端连续发送了两个数据包,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包
  • 拆包:接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包
  • 原因:
    • 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
    • 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
    • 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包
    • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
  • 解决办法:
    • 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
    • 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
    • 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
发布了6 篇原创文章 · 获赞 2 · 访问量 238

猜你喜欢

转载自blog.csdn.net/han451375136/article/details/105433442