1.多线程中的上下文切换
上下文切换是指在多线程环境下,当一个正在运行的线程被其它线程抢占了 CPU 资源时,这个正在运行的线程就必须先把当前上下文信息(包括 CPU 寄存器值、程序计数器、虚拟内存映射表等)保存到内存中,然后就轮到另一个线程执行了
2.如何确定核心线程数
参考回答:
① 高并发、任务执行时间短 →(CPU核数+1),减少线程上下文的切换
② 并发不高、任务执行时间长
IO密集型的任务 >(CPU核数*2+1)
计算密集型任务 →(CPU核数+1)
③ 并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)
3.什么是元数据
元数据(Meta Date),关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。
这些定义都很是抽象,我们可以把元数据简单的理解成,最小的数据单位。元数据可以为数据说明其元素或属性(名称、大小、数据类型、等),或其结构(长度、字段、数据列),或其相关数据(位于何处、如何联系、拥有者)
4.负载均衡
4.1 你们项目负载均衡如何实现的 ?
微服务的负载均衡主要使用了一个组件Ribbon,比如,我们在使用feign远程调用的过程中,底层的负载均衡就是使用了ribbon
4.2 Ribbon负载均衡策略有哪些?
RoundRobinRule:简单轮询服务列表来选择服务器
WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小
RandomRule:随机选择一个可用的服务器
ZoneAvoidanceRule:区域敏感策略,以区域可用的服务器为基础进行服务器的选择。使用Zone对服器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询(默认)
4.3 如果想自定义负载均衡策略如何实现 ?
提供了两种方式:
1,创建类实现IRule接口,可以指定负载均衡策略(全局)
2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略(局部)
5.什么是服务雪崩,怎么解决这个问题?
服务雪崩:一个服务失败,导致整条链路的服务都失败的情形
服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与feign接口整合,编写降级逻辑
服务熔断:默认关闭,需要手动打开,如果检测到 10秒内请求的失败率超过 50%,就触发熔断机制。之后每隔5秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求
6. Spring的bean的生命周期
1. 通过BeanDefinition获取bean的定义信息
2. 调用构造函数实例化bean
3. bean的依赖注入
4. 处理Aware接囗(BeanNameAware、BeanFactoryAware、ApplicationContextAware)Bean的后置处理器BeanPostProcessor-前置初始化方法(InitializingBean、init-method)Bean的后置处理器
5. BeanPostProcessor-后置
6. 销毁bean
7.Spring中的循环引用
循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于8,B依赖于A0·循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖
一级缓存:单例池:缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存:缓存早期的bean对象(生命周期还没走完)
三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
8. 构造方法出现了循环依赖怎么解决?
A依赖于B,B依赖于A,注入的方式是构造函数
原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入
解决方案:使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建