nacos心跳检测机制:

对于临时实例,是微服务自身定时发送消息告诉nacos自己还是健康的。
当不健康状态超过一定时间就会从nacos删除。
非临时实例,是nacos定时向微服务发送消息确认是否健康。
不健康也不会被删除,永久保存再nacos中,等待他恢复。

nacos实时更新:

@RefreshScope

Zuul网关(Gateway):

一般是配合ribbon实现负载均衡
ribbon负载均衡策略:轮询,权重,随机,分发给并发量最小的~~~

springbean生命周期

1、实例化对象
2、填充属性
3、如果这个Bean实现了BeanFactory方法,传递的是spring工厂本身
4、如果这个bean实现了ApplicationContextAware,传入spring上下文中
5、如果配置了inti-method就用配置的初始化方法
6、如果bean实现了disposableBean接口,执行实现的destroy方法
7、如果这个bean不在需要,且配置了destroy方法,就执行配置的销毁方法。
image.png

BeanFactory和ApplicationContext区别(FactoryBean)

1、包不同:beans.jar~ context.jar
2、BeanFactory是spring的顶级接口,ApplicationContext是他的子接口,beanfactory的功能他都有。
3、BeanFactory是需要再创建,ApplicationContext是一开始就初始化所有的bean
FactoryBean
BeanFactory是一个工厂,或者说就是IOC容器,所有的bean归他管理,但是FactoryBean就是一个bean,特殊的bean可以对其他bean生产和装饰的bean,利用工厂+装饰者设计模式

spring出现循环依赖 如何解决

三级缓存
一级:初始化的bean
二级:实例化的bean(一些属性未赋值,或所有属性)
三级:实例化bean的工厂

spring bean的动态代理

JDK:java动态代理,反射机制实现代理接口的匿名类,再调用具体方法前调用invokerHandler来处理
cglib:基于ASM开源包,对.class文件加载,字节码来生成一个目标类的子类,执行的是这个子类。

spring先使用jdk来创建AOP代理,目标类没有实现接口的时候再调用Cglib代理。
实现方式:
jdk是针对接口,而sglib是针对类的
所以saglib代理的类方法不能用final修饰,他是子类,继承原因。
sglib性能更高,使用字节码生成代理类比反射更快。
原文地址:
https://blog.csdn.net/mywaya2333/article/details/122399020?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-122399020-blog-83549841.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-122399020-blog-83549841.pc_relevant_antiscanv3&utm_relevant_index=6

concurrenthashmap1.7和1.8

syz修饰静态和普通的区别

静态是锁的.class,由他创建的所有实例化对象都上锁
而普通方法只针对单个实例化对象,不同的线程执行不同的实例化对象不受影响

cas自旋是什么

compare and swap :比较和交换
在对一行数据操作前,先记录操作前的数据,对数据操作玩后,准备修改这个数据前用之前记录的值和现在的数据值做一个比较,如果符合预期,说明没有其他人操作,就执行修改操作,如果不符合,就重复该过程。

redis的过期机制

docker

java虚拟机堆空间模型

大对象为什么直接放入老年代

因为如果大对象可以进入年轻代的话,占据太多幸存者区,导致YGC过于频繁,使得对象进入老年代太快了,从而导致FULLGC频繁。

gc怎么判断对象什么时候回收

可达性分析算法、引用计数法,看该对象的标记是否对象头的mark word是11

空间担保原则

YGC之前会判断老年代空间是否满足年轻代所有对象放入,如果可以就放心GC,如果不可以,判断之前每次平均有多大的对象放入老年代,如果够也继续YGC,不够就先执行FGC

MQ消息丢失怎么解决:

生产者——发送交换机——队列——消费者
MQ自身:持久化
生产者confirm和return机制,消费者:重试,返回给队列,spring默认的,内部重试,超过重试次数放入死信队列。

消息有几种类型:

普通模式:消费者监听队列信息,有就执行,
工作模式:可以指定每次分配给不同消费者的消息量
fanout:发送给交换机,交换机再给绑定的队列
direct:直连交换机,带有key,不支持通配符
topic:支持通配符

双写一致性(缓存同步):

1、加锁,读写操作都必须获得锁再操作,很耗费性能
2、先更新库,再删缓存
3、延时双删:先删除缓存,再更新数据库,隔一段时间,再删除缓存

高可用方案:

应用层:无状态、不适用session,负载均衡访问任意节点,如果宕机就移除
服务层:
核心服务和非核心服务分开部署,非核心服务采用降级
设置超时时间,超时后:重试、降级、转移
没有即时性要求的服务采用异步调用的方式。
缓存层:

分布式事务:

两阶段提交:
TCC:
try,confirm,cancel

mysql的锁

全局锁,防止主从同步时带来的数据不一致,
表锁、元数据锁、意向锁
增删改查跟表定义语句的冲突,加了元数据锁
意向锁(共享、互斥):因为判断每一行太耗费性能,为了帮助表锁判断是否可以加read(可读)/write(不可读,不可改)锁。
行锁:
间隙锁

image.png

mysql索引失效:

image.png
image.png
image.png
image.png
字符串加’ ‘,不加的话,相当于给索引加了转换的函数,所以失效了。
image.png
回表:
image.png

执行流程

image.png

redis为什么快:

IO多路复用,基于内存,存储是哈希key-value

switch可以传string吗?

1.7之后可以,比较string就是比较他们的hash值。

FullGc怎么排查:

1、首先查看GC日志,通过jstat -gcutil -t pid 1000 1000查看GC日志,看到FullGC的次数达到了接近两万次。。。并且GC速率没有下降的趋势。
2、又通过jmap -heap pid查看堆内存情况,发现Old区Free剩余2M。。
3、通过jmap -hsito pid查看哪些类占用的空间多,看到我们自定义的一个类占用很大,因此定位到是我们项目的代码问题。
4、通过jmap -dump:format=b,file=xxxx.hprofDump下我们的堆内存日志,通过MAT内存分析工具分析日志。查看到MAT帮助分析出来的两个问题
image.png

什么软件监控JVM

1、JDK自带的几款在线监控工具(JPS、jstat、jstack、jmap),用户实时监控JVM运行状态
2、JVM离线分析工具(VisualVM),用于分析dump下来的堆内存文件,远程监控JVM状态。
3、第三方在线监控工具(Arthas的使用)

Linux操作:

image.png
redis使用场景

springboot解决了依赖冲突,starter

分布式锁

Mybatis执行流程

Mybatis如何实现一对多映射

collection标签,property对应实体类属性,,oftype对应关联表的字段

自动装备什么时候初始化

怎么设置redis过期时间

setex(),setnx()分布式锁
expire(key,6)