-
描述集群、负载均衡、分布式
集群:同一个业务,部署在多个服务器上
将一个应用程序,部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行;(保证高可用)
负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡
分布式:一个业务分拆多个子业务,部署在不同的服务器上
-
Nginx负载均衡的规则有哪些
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
2、指定轮询几率
weight和访问比率成正比,用于后端服务器性能不均的情况默认选项,当weight不指定时,各服务器weight
相同, (weight=1)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9vhWlUjK-1618486886636)(http://m.qpic.cn/psb?/V13x1ZYF1dFQtq/0zedfwdqA.ORytMl.yWI7UsbRYtXiEm1BlAhDaW64YA!/b/dMMAAAAAAAAA&bo=XAKVAAAAAAADB.k!&rf=viewer_4)]
数字越大,表明请求到的机会越大
-
详细描述什么是Spring?
1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。
2、Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
3、Spring提供AOP(Aspect-oriented programming)概念的实现方式。
4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。
5、Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
6、Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
总之,Spring是一个全方位的应用程序框架。 -
什么是Spring IOC?
IOC(控制反转),将创建对象的控制权由自己把控转移到spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系;DI(依赖注入),将对象之间的依赖关系交由框架处理,减低组件之间的耦合性,即应用程序在运行时依赖IOC容器来 动态注入对象需要的外部资源。
-
什么是Spring AOP?描述其应用场景(最少2个)
将相同的业务逻辑提取形成切面,将通知织入到方法连接点前后,底层使用的是动态代理
调用时间监控,日志记录,session开闭,事务管理,登录验证 -
AOP的通知有几个,分别是什么
前置通知(Before Advice):在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出异常)
后置通知(After Advice):在目标方法执行后(无论是否出现异常)执行的通知
返回后通知(After returning advice):在一个连接点正常完成后执行的通知。例如:一个方法正常返回,没有抛出任何异常。
抛出后通知(After throwing advice):在一个方法抛出异常时执行的通知。
环绕通知(Around advice):包围一个连接点的通知,就像方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回他们自己的返回值域或抛出异常来结束执行。
-
描述Spring Bean的作用域?
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围
scope配置项有5个属性,用于描述不同的作用域。① singleton:使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
② prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
③ request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
④ session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
⑤ global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
-
Spring Bean 注入有几种方式?
Spring IOC有三种注入方式 :构造器注入、setter注入、注解注入。
-
SpringBean 生命周期?
通过构造器或工厂方法创建Bean;进行set注入,给Bean设置初始值以及引用其他的Bean;将Bean实例传递给Bean后置处理器的postprocessBeforeInitialization方法;调用bean的初始化方法;将bean实例传递给bean后置器的postprocessafterInitialization方法;执行目标方法;关闭容器调用destroy方法
-
Spring框架中 用到了哪些设计模式?(不低于3个)
工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。 -
描述Spring事务传播行为?
spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
-
描述Spring事务的隔离级别?
- 事务的隔离级别
1. 读已提交-> READ_COMMITTED -> 可避免脏读的发生 2. 读未提交-> READ_UNCOMMITTED -> 最低级别,任何情况都无法保证 3. 可重复读-> REPEATABLE_READ -> 可避免脏读、不可重复读的发生 4. 串行化-> SERIALIZABLE -> 可避免脏读、不可重复读、幻读的发生
- 没有隔离级别产生的问题
-
- 脏读
一个事物读取的数据是另一个事物还没有来得及提交的数据,会造成脏读的问题
-
- 幻读
幻读是指,如果我正在对一个数据库表进行全部的修改某几个属性的值,同时还有其他事物向数据库表中添加数据,当修改完查询的时候发现出现了有的字段属性值没有修改成功,这时候就产生幻读问题.
-
- 不可重复读
不可重复读是指在一个事务当中通过相同条件多次查询相同的数据,返回的结果集不相同。造成的原因是有其他事物正在不断的修改这些数据.
-
Spring事务传播行为 REQUIRED和REQUIRES_NEW区别
REQUIRES:当前方法被另一个事务方法调用时合并成一个事务;
REQUIRES_NEW:当前方法必须启动一个新事务并在自己的事务内运行,若有事务在运行则将它挂起
14.SpringMVC中的Bean是线程安全的吗? 说出你的解决方案?
Spring管理的Bean对象默认是单例模式,当多线程操作Bean对象时就会出现线程安全问题;
因为在多线程中线程改变了bean对象的可变成员变量时,其他线程就无法访问该bean对象的初始状态,
这样就造成数据错乱。所以需要用线程同步来处理这个问题。方法一、使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,
这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。
ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。方法二、如果时web应用,可以使用Spring Bean的作用域中的request,在controller类前面加上@Scope("****"),
表明每次请求都会生成一个新的Bean对象。这样也能起到线程安全的作用。方法三、使用线程同步,关键字synchronized
当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block ,
多线程并发量大的时候会对性能有一定的影响。方法四:避免定义全局变量