文章目录

东篱南山

采菊东篱下,悠然现南山

面试篇--开源框架

1.Spring 核心模块

core 提供依赖注入和Bean管理功能,主要组件是 BeanFactory,
ORM Spring支持多种ORM框架,简化了数据库操作。
web 建立于Context模块之上,提供了一个适合于Web应用的上下文,同时还提供和其他web服务的支持
Context 扩展了BeanFactory的概念,增加了对国际化、事件传播,
AOP 为Spring容器管理的对象提供了对面向切面编程的支持;
DAO 该层封装了对数据库的访问,并且处理了其抛出的错误消息,同时还基于AOP模块提供了事务管理;
MVC:是一个全功能的构建 Web 应用程序的 MVC 实现,容纳了大量视图技术,如 JSP、Velocity、POI等;

2.Spring IOC
控制反转,是一种设计思想,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
1.调用refresh()方法开始
2.Rosource资源定位 resourceLoader
3.资源载入 将指定用户的Bean表示成BeanDefiontione
4.注册 将bean注册到一个map容器中

3.Bean的生命周期:
1.实例化bean
2.设置依赖注入
3.注入Auto接口
4.初始化Bean
5.使用
6.卸载
https://www.zhihu.com/question/38597960

加载第三方的Bean @Configuration +@Bean

spring事务传播属性:

Propagation.REQUIRED(required):支持当前事务,如果当前有事务, 那么加入事务, 如果当前没有事务则新建一个(默认情况)
Propagation.NOT_SUPPORTED(not_supported) : 以非事务方式执行操作,如果当前存在事务就把当前事务挂起,执行完后恢复事务(忽略当前事务);
Propagation.SUPPORTS (supports) :如果当前有事务则加入,如果没有则不用事务。
Propagation.MANDATORY (mandatory) :支持当前事务,如果当前没有事务,则抛出异常。(当前必须有事务)
PROPAGATION_NEVER (never) :以非事务方式执行,如果当前存在事务,则抛出异常。(当前必须不能有事务)
Propagation.REQUIRES_NEW (requires_new) :支持当前事务,如果当前有事务,则挂起当前事务,然后新创建一个事务,如果当前没有事务,则自己创建一个事务。
Propagation.NESTED (nested 嵌套事务) :如果当前存在事务,则嵌套在当前事务中。如果当前没有事务,则新建一个事务自己执行(和required一样)。嵌套的事务使用保存点作为回滚点,当内部事务回滚时不会影响外部事物的提交;但是外部回滚会把内部事务一起回滚回去。(这个和新建一个事务的区别)

3.Spring AOP
面向切面编程
连接点:能够被拦截的地方
切点:每个方法都可以称之为连接点,我们具体定位到某一个方法就成为切点。
通知:前置、后置、返回、异常、环绕

AOP使用:权限、日志、缓存
3.AOP实现方式三种:1.JDK动态代理 2.Cglib字节码 3.Aspet增强
JDK动态代理和Cglib字节码区别
动态代理
1.通过实现 InvocationHandler 接口创建自己的调用处理器
2.通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类
3.通过反射机制获得动态代理类的构造函数
4.通过构造方法将自定义的处理类当参数放入。
5.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
Cglib
1.通过asm字节码生成框架生成代理类Class的二进制字节码
2.通过Class.forName加载二进制字节码,生成Class对象
3.通过反射机制获取实例构造,并初始化代理类对象
1.动态代理需要实现接口,cglib需要继承
2.动态代理通过类加载和反射来生成代理类,cglib是基于字节码来生成

4.依赖注入方式
setget注入
构造器注入
注解注入
接口注入 有侵入性
5.相关注解
@Autowired默认按类型装配 假如有相同的Bean,再按名称匹配
@Qualifier名称装配
@Resource 是JDK1.6支持的注解,默认按照名称进行装配
6.Spring的事物传播属性
七中事务传播机制 REQUIRED, REQUIRES_NEW等等

5.SpringMvc 原理
(1) Http请求:客户端请求提交到DispatcherServlet。
(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) 调用处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(8) Http响应:视图负责将结果显示到客户端。

6.Servlet 干了什么
DispatcherServlet 继承 FrameworkServlet 继承 HttpServletBean 并且它也继承自 HttpServlet
HttpServletBean 主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
FrameworkServlet 初始化webApplicationContext,建立springMVC 上下文,并于父类spring上下文关联
DispatcherServlet 初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。
7.Mybaties 原理
1.通过configuration解析config.xml配置文件和mapper.xml映射文件,映射文件可以使用xml方式或者注解方式
2.然后由configuration获得sqlsessionfactory对象,再由sqlsessionfactory获得sqlsession数据库访问会话对象,
3.通过JDK动态代理生成Mapper文件的代理类
8.Mybaties 二级缓存和更新策略
一级缓存是SqlSession级别的,如果同一个SqlSession中使用了相同的SQL,只有第一次会查询数据库,假如有了DML语句,将会一级缓存
二级缓存是跨SqlSession,不同的SqlSession两次执行相同的namespace下的sql语句,
LRU默认
FIFO
软引用
弱引用
#{}是经过预编译的,是安全的。
而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

9.Dubbo的原理,
1.消费方调用本地服务
2.本地服务将参数方法等信息组装成网络传输的消息体
3.本地服务找到服务地址,并将消息发给服务端
4.服务端本地服务收到消息后进行解码
5.服务端本地服务调用本地服务,本地服务做业务处理,然后再把结果转给服务端
6.服务端就结果打包成网络传输的消息体
7.客户端收到消息进行转码然后给消费方
10.数据怎么流转的,怎么实现集群,负载均衡,服务注册,和发现,重试转发,快速失败的策略是怎样的

  1. dubbo服务治理、服务降级以及重试
    1.调用链路自动生成
    2.服务访问压力以及时长统计 主要看全链路,TP50/TP90/TP99
    3.服务分层、调用链路失败监控报警、服务监控
    2.服务降级
    假如两个服务调用多次失败,就走降级备用逻辑给用户响应/
    3.服务重试
    ①失败重试
    consumer调用provider失败了,比如provider出现了异常,这时候就要进行重试。
    ②服务超时
    设置超时时间
    重试:6次,超时:200ms
dubbo提供了负载均衡:1.Random 2.随机,按权重设置随机概率。 3. 轮循,按公约后的权重设置轮循比率。4.最少活跃 5.一致性hash
快速失败策略:

11.zk原理
12.什么是paxos算法, 什么是zab协议。
zab协议采用的paxos算法, leader节点失效,迅速从从节点中重新选出一个替代者
Paxos算法的目标就是让他们按照少数服从多数的方式,最终达成一致意见。

13.Zookeeper watch机制原理。

14.ngnix原理
ngnix反向代理和负载均衡
轮询
加权轮询
源地址哈希法
随机
最小连接数法
15.ngnix限流
limit_req_zone:通过“漏桶”算法限制每个 IP 发起的请求频率。
limit_conn_zone:限制每个 IP 发起的连接数。
正向和反向代理

16.简单讲讲tomcat结构,以及其类加载器流程,线程模型等。
tomcat就是一个server ,一个server对应多个service,一个service对应对应多个Connector 和 Container,其中Connector 主要负责对外交流,Container 主要处理 Connector 接受的请求
17.tomcat如何调优,涉及哪些参数
1.提高JVM栈内存Increase JVM heap memory
Xms – 指定初始化时化的栈内存
-Xms – 指定初始化时化的栈内存
-Xmx – 指定最大栈内存
2. – 线程池设置
maxThreads
常用限流方法;
1.计数器法
一分钟只能有100个请求
缺点:没法处理临界值问题
1.漏桶算法
消费速率一定,但进量会受到限制,座椅用过流程整形
2.令牌桶算法
往桶里添加令牌,请求来了,从桶里申请令牌,如果有,则去消费,没有就排队或者丢弃请求

降级:技术降级、服务开关

过滤器和拦截器的区别:

   1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 
   2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器
   3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 
   4、拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 
 拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

  web.xml 的加载顺序是:

context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

netty 相关
1.Netty 的线程模型
1、Reactor单线程模型
1.作为 NIO 服务端,接收客户端的 TCP 连接;
2.作为 NIO 客户端,向服务端发起 TCP 连接;
3.读取通信对端的请求或者应答消息;
4.向通信对端发送消息请求或者应答消息。
2、Reactor多线程模型
1.有专门一个 NIO 线程 Acceptor 线程用于监听服务端,接收客户端的 TCP 连接请求;
2.网络 IO 操作 - 读、写等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现,它包含一个任务队列和 N 个可用的线程,由这些 NIO 线程负责消息的读取、解码、编码和发送;
4.1个 NIO 线程可以同时处理 N 条链路,但是 1 个链路只对应 1 个 NIO 线程,防止发生并发操作问题。

  3、主从多线程模型

        Netty 通过 Reactor 模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,boss 线程池和 work 线程池,其中 boss 线程池的线程负责处理请求的 accept 事件,当接收到 accept 事件的请求时,把对应的 socket 封装到一个 NioSocketChannel 中,并交给 work线程池,其中 work 线程池负责请求的 read 和 write 事件,由对应的 Handler 处理。   
2.TCP 粘包/拆包的原因及解决方法
   因为是走TCP/IP 协议,一个完整的包会被拆成多个包发送,
    粘包和半包
	粘包就是数据包多了一截,半包就是少了一部分
解决办法:
  1.消息定长
  2.包尾增加结束标识
3.Netty空转问题
   定义一个当前时间currentTimeNanos,接着计算出一个执行最少需要的时间timeoutMillis。每次对selectCnt做++操作。
  若在某个周期内连续发生N次空轮询,则触发了epoll死循环bug,就重建Selector   默认512
4.

标题:面试篇--开源框架
作者:zc1249274251
地址:https://www.fanyueba.com/articles/2019/09/26/1569471327290.html