Spring的bean的生命周期

什么是AOP,你们项目中有没有使用AOP

AOP是面向切面编程,用于那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。

记录操作日志

使用AOP中的环绕增强+切点表达式(找到记录日志的方法),通过环绕增强的参数获取请求方法的参数(类、方法、注解、请求方式),获取到这些参数后,保存到数据库。

SpringBoot自动装配的原理

@SpringBootApplication:

1.@SpringBootConfiguration:声明这是一个配置类,与@Configuration作用相同

2.@ComponentScan:组件扫描,扫面当前引导类所在包及其子包

3.@EnableAutoConfiguration:实现自动化配置的核心注解。

-3.1 @Import({AutoConfigurationImportSelector.class}) 导入自动配置选择器到spring容器中。

-导入AutoConfigurationImportSelector.class,会将META-INF下面的spring.factories文件加载到spring容器中。

-springfactories文件中有许多以AutoConfiguration结尾的类,但不是所有的类都会加载进来

只有满足了自动配置类中的@ConditionalOnClass的条件判断的注解中对应字节码文件,才会将该配置类中的所有Bean放入Spring容器中使用

Spring框架中常用的注解

Spring的常见的注解

@Component、@Controller、@Service、@Repository:使用在类上,实例化Bean。

@Autowired:使用在字段上,根据类型依赖注入。

@Qualifier:结合@Autowired使用,根据名称进行依赖注入。

@Scope:标注bean的范围。

@Configuration:声明配置类。

@ComponentScan:扫描包。

@Bean:使用在方法上,将返回值存储到spring容器。

@Import:导入的类会被加载到spring容器中。

@Aspect、@Before、@After、@Around、@Pointcut:用于切面编程(AOP)。

SpringMVC中的注解

@RequestMapping:映射请求路径,表示类中的方法都是以该地址作为父路径,可作用在类上和方法上。

@RequestBody:接收Http请求的json数据,并将json数据转换为java对象。

@RequestParam:指定请求参数名。

@PathViriable:从请求路径上获取参数{/user/id}。

@ResponseBody:将controller方法返回的对象转换为json对象响应给客户端。

@RequestHeader:获取指定请求头数据。

@RequestController:声明是控制类。

SpringBoot中的注解

@SpringBootConfiguration:组合Configuration实现配置文件的功能

@ComponentScan:组件扫描

@EnableAutoConfiguration:打开自动配置功能

SpringCloud 5大组件有哪些?

注册中心:Eureka(u瑞卡)、Nacos(Alibaba)

负载均衡:Ribbon

网关:GateWay

远程调用:Feign

服务熔断:Hystrix、Sentinel (Alibaba)

服务的注册和发现是什么意思?

nacos为例

服务注册:服务提供者需要把自己的信息注册到Nacos上,由Nacos保存这些信息(服务名、端口、ip)

服务发现:服务消费者向Nacos拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法选择一个服务发起调用

服务监控:服务提供者每隔30s向Nacos发送心跳,报告健康状态,如果Nacos服务90s内没接受到心跳,则将其从Nacos中移除

Nacos与Euraka的区别

相同点:

1.都支持服务的注册与发现(服务拉取)。

2.都提供心跳检测机制做健康检测。

不同点:

1.Nacos支持服务端主动监测提供者状态:临时实例采用心跳检测机制,而非临时实例采用主动检测模式(ephemeral: false)。

2.临时实例心跳不正常会被剔除,而非临时不会被剔除。

3.Nacos支持服务列表变更的消息推送模式,服务列表及时更新。

4.Nacos集群默认采用AP(强可用)与Eureka一致,如果存在非临时实例,则采用CP(强一致)模式。

5.Nacos还提供配置中心的功能实现配置文件的集中统一管理,而Eureka只提供注册中心。

CAP理论

一致性(Consistency):在分布式系统中,所有节点看到的数据都是相同的,即系统的状态在任何时刻都是一致的。

可用性(Availability):系统必须保证在任何时刻都能够处理请求并返回正确的结果,即系统一直处于可用状态。

分区容错性(Partition tolerance):系统在遇到网络分区故障时仍然能够保持正常的工作,即系统能够容忍任意数量的消息丢失或网络分区。

CAP理论的核心思想是,一个分布式系统最多只能同时满足上述三个特性中的两个,而无法同时满足所有三个特性。这是因为在分布式系统中,网络分区是不可避免的,而保证一致性和可用性需要对网络分区做出不同的权衡。

Ribbon负载均衡流程

Ribbon负载均衡策略有哪些

  • RoundRobinRule:简单轮询服务列表来选择服务器。
  • WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。
  • RandomRule:随机选择一个可用的服务器。
  • BestAvailableRule:最小连接数策略,忽略那些短路的服务器,并选择并发数较低的服务器。
  • RetryRule:重试机制的选择逻辑,一开始按照轮询机制,出现服务宕机,不断重试。
  • AvailabilityFilteringRule:可用性敏感策略,先过滤非健康的,再选择连接数较小的实例。
  • ZoneAvoidanceRule:区域可用的服务器为基础进行选择,就近原则,而后再对Zone内的对各服务做轮询。

Sentinel流量控制

限流类型(grade):QPS、并发线程数

流量控制效果(controllerBehavior):

直接拒绝:QPS超过阈值,新的请求直接拒绝,抛出FlowException异常。

Warm Up:预热/冷启动,系统长期处于低水位,流量突然增加,通过冷启动,让流量慢慢增加。

均匀排队:桶棍算法,设置请求通过的间隔时间,均匀通过。

什么是服务雪崩,怎么解决

服务雪崩:一个服务失败,导致整条链路的服务都不可用的情形

服务降级:确保服务不会受请求突增影响而不可用,确保服务不会崩溃(与feign接口整合编写降级逻辑)

服务熔断:默认关闭,需要手动打开,如果检测10s内请求失败率超过50%,触发熔断机制,之后每隔5s(熔断时间结束)重新尝试请求微服务,如果仍不能响应,继续熔断,若成功,则恢复服务。

服务降级

服务熔断

redis分布式锁如何实现

抢券场景,多个用户抢券时解决超买超卖的问题

使用redisson实现分布式锁,底层setnx和lua脚本。

Redisson实现分布式锁如何合理地控制锁的有效时长

在redisson的分布式锁中,提供了一个WatchDog(看门狗),一个线程获取锁成功后,WatchDog会给持有锁的线程续期,默认每隔10s续期一次。

Redisson的这个锁,可以重入吗

可重入,多个锁重入需要判断是否是当前线程,在redis中进行存储的时候使用的hash结构,来存储线程的信息和重入次数。

Redisson锁能解决主从一致的问题吗

不能解决,但是可以使用redisson提供的红锁机制来解决,但是这样的话性能太低了,如果业务非要保持数据的强一致性,建议采用zookeeper实现分布式锁。

什么是可重入锁

就像一个与锁相关的计数器,如果一个持有锁的线程再次获得了锁,那么获取计数器就加1,这得益于它的底层是一个hash结构key-value,key中存储的是锁的名称,value中存储了两个值一个是field它存储的是当前的线程id,value存储的是可重入的次数,只有当可重入次数为0时,才会真正地释放掉这把锁。

SpringMVC的执行流程

视图版本jsp

前后端分离阶段

用户发送请求到前端控制器,前端控制器收到请求去查询处理器映射器中存储的handler({key:/user/getById/1,value:”类名#方法名”}),并返回处理器执行链HandlerExecutionChain给前端控制器,前端控制器调用处理器控制器通过处理器执行链找到对应的处理器Controller,方法上添加了@ResponseBody,通过HttpMessageConverter将返回结果转换成json数据响应给前端。