宝典
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数据响应给前端。