面试大纲
1. Java
设计模式
工厂模式(简单工厂模式,工厂模式(多个工厂,先选工厂),抽象工厂模式(产品族,指定工厂,再由工厂生产具体的零件))
单例模型(懒汉式,双重检查锁,饿汉式,静态内部类,枚举)
建造者模式(链式调用),原型模式(cloneable接口)
适配器模式(默认适配器,对象适配器,类适配器)
代理模式(内部真正的实现类,静态代理,动态代理)
观察者模式(subject,注册,通知),门面模式
策略模式(会员卡)
基础
反射(Class,constructor,filed,method)
泛型(代码复用,类型检查,泛型类,泛型方法,泛型接口,类型擦除)
注解(自定义注解)
异常(exception,error,runtimeException,checkedException,try,catch,finally)
SPI机制:本质是将接口实现类的全限定名配置在配置文件中,由服务器加载配置文件,加载实现类,动态加载。线程上下文加载器
equals和hashcode
容器
list(arrayList,vector,linkedList,copyonwriteList)
set(treeSet,hashSet,linkedHashSet)
map(hashTable,linkedHashMap)
hashmap,ConcurrentHashMap,1.7,1.8,Segment(lock,获取独占锁,自旋重试),synchronized
io/nio
IO模型(bio,nio,aio)
多路复用实现(select,poll,epoll,kqueue,lt,et)
零拷贝(用户态直接IO,减少拷贝次数,写时复制)
并发
线程:生命周期(新建,可运行,运行中,死亡,阻塞 sleep),什么时候适合使用多线程(发送短信),sleep(进入阻塞状态,不释放锁)和wait(释放锁,等待唤醒),yield(优先级问题)
CAS:判断工作内存的值和主内存的值是否相等
锁:乐观锁,悲观锁,可重入锁,自旋锁
原子类:基于CAS,基础数据类型,数组类型,引用类型,字段类型
AQS:state,同步队列,公平锁,非公平锁
lock:
synchronized:使用方式(修饰实例方法,静态方法,代码块),锁优化(无锁,偏向锁,轻量级锁,重量级锁),原理(代码块同步 monitorenter 和 monitoexit,方法同步 ACC_SYNCHRONIZED)
volatile:可见性(汇编语言前加lock指令,同时会写到主内存,并使其他内存失效),重排序(写内存屏障,读内存屏障),不具备原子性)
阻塞队列
condition接口
copyOnWriteArrayList
countDownLatch(等待多个线程执行后再执行),CyclicBarrier(多个线程同时等待某个事件的发生,然后同时唤醒再执行)
Fork/Join
Java线程池:任务调度,阻塞队列(数组,链表,优先级,定时),拒绝策略(丢弃任务,抛出异常,丢弃最前面的任务,提交线程执行任务),4种线程池(固定数量的线程池,单个,无限的,定时任务,阻塞队列串行执行任务,...),运行状态(running,shuntdown,stop,tidying,terminated),业务场景(快速响应,查询商品(详情,库存并发执行,调用成功后执行返回,CountDownLatch,批处理,发送短信))
ThreadLocal:threadLcalMap,内存泄漏(对于已经不再被使用且已被回收的 ThreadLocal 对象,它在每个线程内对应的实例由于被线程的 ThreadLocalMap 的 Entry 强引用,无法被回收,可能会造成内存泄漏。在get和set方法中将key=null的情况特殊处理)
并发容器:copyonwriteList(读写分离)
JVM:
类加载机制:加载(全限定名转换成二进制字节流,静态存储结构转换成方法区的运行时存储结构,内存中生成class对象,作为数据的访问入口),验证(文件格式验证,元数据验证,字节码验证,符合引用验证),准备(为类变量static分配内存方法区,设置初始值),解析(符号引用替换成直接引用),初始化(虚拟机执行类构造器init()方法的过程),使用,卸载
双亲委派:启动类加载器,扩展类加载器,应用程序类加载器,线程上下文类加载器(getContextClassLoader()),破坏双亲委派
jvm内存结构:程序计数器,虚拟机栈(局部变量表,方法数栈,方法返回地址,动态链接),本地方法栈,堆,方法区,逃逸分析(减少Java内存堆的分配压力,变量是否被外部访问,栈上分配)
内存模型:工作内存,主内存,happens-before
垃圾回收算法:标记-复制,标记-清除,整理
垃圾处理器:g1(引入分区的思路,弱化分代的概念,可预测的时间模型,降低停顿),ZGC(G1转移阶段的STW,标记-转移,重定位都是并发的,着色指针,读屏障技术),CMS...Serial,ParNew,Parallel Scavenge(高吞吐),Serial Old,Parallel Old,CMS(低停顿,标记-清除),Shenandoah GC
gc调优,
对象存活判定算法:引用计数法,可达性分析算法,
引用类型:强引用,软引用,弱引用,虚引用
排错:内存溢出,内存泄漏,cpu100%,Heap Dump(jmap,jconsole生成,jhat分析),Thread Dump(jstack,死锁,热锁),Gc Log,动态调式,在线调式,GCeasy(各代分配内存大小,峰值,吞吐量,停顿时间,GC前堆,GC后堆,GC持续时间,GC导致程序停顿时间,垃圾对象大小)
新特性:lambda,Optiontal
spring:AOP,IOC,动态代理,静态代理,拦截器,过滤器,事务(隔离级别,传播行为,事务失效),循环依赖(三级缓存),设计模式,bean,线程池和自带的@sync(没有拒绝策略,默认直接抛出异常)
springboot:自动配置原理
mybatis:缓存,分页,会话
netty:线程模型,可靠性
2. 数据库
MySQL:
事务
并发(锁(共享锁,排他锁,死锁(预防和发现)),
乐观并发控制(时间戳,验证),MVCC),
优化
分库分表
索引(B+)
缓存与数据库双写(先更新数据库,后删除缓存,消息队列,binlog)
执行流程(链接器,缓存,分析器,优化器,执行)
数据页(user records)
分区表:类型(范围,键值对,哈希,列表),维护成本高,重组分区,打开并锁住所有底层表,选择分区的成本比较高,分区列和索引列不匹配
Redis:
单线程模型:IO多路复用(redis逐步引入了多线程,在redis 6中对网络数据的读写和协议解析都使用了多线程)
数据结构:String,list ziplist linkedlist,set hashtable,hash,zset,BitMap,BitArray,HyperLogLogs
持久化:RDB,AOF,AOF重写,
事务,
缓存雪崩(高可用,缓存降级,redis持久化),穿透(布隆过滤器,返回null缓存,),击穿(分布式锁,随机过期时间)
高可用,
内存管理:淘汰策略(默认报错,移除最近很少使用,随机移除,设置了过期时间中移除最近很少使用,随机移除),淘汰算法,删除策略(定期删除,惰性删除)
持久化(RDB,AOF),
复制:全量复制,增量复制,异步复制
集群:单机,集群,哨兵(监控,提醒,故障转移),cluster模式
应用:分布式锁
3. 算法
数据结构:数组,链表,栈,队列,跳表,二叉树,平衡二叉树,B树
算法:查找算法,排序算法,大数据处理算法,加密算法,分治算法,贪心算法,回溯算法,动态规划算法,分支界限算法,限流算法(固定窗口算法,滑动窗口算法,漏桶,令牌桶)
4. 微服务
springcloud:服务注册发现(eureka,consule,nacos,zookeeper,服务注册机制,服务续约机制(心跳),服务注销机制,服务剔除机制,服务获取机制,服务同步机制)feign,hystrix,config,zuul,gateway
Dubbo:
Dubbo SPI,原生加强SPI机制,SPI自适应扩展
服务导出
服务引用:直连,注册中心
服务调用过程:首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client 将编码后的请求发送给服务提供方的网络层上,也就是 Server。Server 在收到请求后,首先要做的事情是对数据包进行解码。然后将解码后的请求发送至分发器 Dispatcher,再由分发器将请求派发到指定的线程池上,最后由线程池调用具体的服务。
服务目录:Directory存储服务提供者的信息(ip,端口,服务协议),会随着注册中心的修改而动态变化。StaticDirectory和RegistryDirectory(1. Invoker的列举逻辑,2. 接收服务提供者变更的逻辑,3. invoker列表的刷新逻辑)
集群:容错(失败自动切换,快速失败返回空结果,失败安全抛出异常,失败自动恢复,并行调用多个服务提供者)
负载均衡:权重随机算法,最少活跃调用数,hash 一致性,加权轮询
Istio
Spring cloud alibaba:
nacos:动态配置(先查询本地文件,检查本地文件是否修改,长轮询,每隔10ms检查一次本地配置信息和拉取服务器的配置信息推送给订阅的客户端),服务注册发现(注册:注册信息,心跳;发现:订阅,本地缓存,定时拉取,pull和push;注册信息保存在concurrentHashMap),ap,cp(在Nacos的Instance(实例)中提供了一个ephemeral字段,这个字段是bool类型,这个字段和ZK中的含义差不多,都代表的是否是临时节点,在Nacos中如果是临时节点就会使用AP协议,如果不是临时节点就会走CP。当然在注册中心中所有的实例其实默认都是临时节点。)
Sentinel(流量,熔断)
Seata(AT,TCC,XA,SAGA)
5. 分布式
算法:2阶段,3阶段,CAP理论(一致性,可用性,分区容错性),BASE理论(级别可用,副本不用实时一致,最终可用),共识算法(Paxos 和 Raft(leader只能是拥有最新,最全的日志节点)),拜占庭将军问题,paxos算法死循环
分布式事务:ACID,事务隔离级别(读未提交,读提交,可重复读,串行化),两阶段提交(投票阶段,提交阶段),三阶段提交(超时机制,准备阶段),全局事务,消息服务,最大努力通知,TCC,XA事务,saga
分布式锁:redis(setnx,redlock,redisson),mysql(主键,唯一索引,排它锁),ZK(监听临时顺序节点小的)
RPC:通信,序列化,动态代理,服务注册发现,协议
Zookeeper:ZAB协议(解决分布式一致性,发生崩溃时快速恢复服务,zixd最大的会被选择为leader),架构(leader节点,follow节点),文件系统(临时与持久节点,顺序与非顺序节点),使用场景(发布订阅(订阅某个节点的变更),命名服务(文件系统),分布式锁,分布式事务),Watcher(一次性,客户端串行执行,轻量)
ES: 倒排索引
消息队列:消息队列作用(解耦,异步,削峰),消息顺序问题,消息重复问题(幂等),消息丢失问题(事务机制,ack机制,持久化机制),设计(解耦,异步,最终一致性,广播,错峰流控)
Kafka:高吞吐(速度低,容量大的硬盘,顺序读写、零拷贝、文件分段、批量发送和数据压缩),架构(topic,partition),删除策略(基于时间,基于文件大小), Replication(partition) & Leader election(in sync list,in-sync replicas),Consumer group,为什么Kafka吞吐量大,速度快(顺序写磁盘,offset,零拷贝 sendfile,分区分段+索引,批量读写)
RabbitMQ:基本概念(Exchange,Queue,Routing Key,Channel,每个channel代表一个会话任务),工作模式(simple模式,work工作模式,发布订阅模型共享资源,路由模式),交换器(direct,headers,topic,fanout用户广播),顺序性(queue与消费者一一对应),rabbitMQ集群模式(普通集群,镜像集群),消息挤压,死信队列
6. 容器化
nginx(反向代理web服务器):反向代理,负载均衡(轮询,权重,ip绑定,fair算法,url_hash算法),5万并发(高并发),限流(限制一个用户发送的请求,漏桶原理;限制并发连接数)
什么是正向代理和反向代理?
正向代理就是一个人发送一个请求直接就到达了目标的服务器。
反方代理就是请求统一被Nginx接收,nginx反向代理服务器接收到之后,按照一定的规 则分发给了后端的业务处理服务器进行处理了。**反向代理服务器可以隐藏源服务器的存在和特征。**它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。
docker:
基本命令:镜像,容器,存储卷,网络,仓库
实现原理:命名空间(进程 namespace,网络,为容器提供ip,在iptables中配置转发路由,挂载点clone_newns,根目录chroot),控制组CGroup(隔离cpu,内存等物理资源)),镜像(docker的镜像由一系列只读的层组成的,容器是在镜像上面加一个可读写的层),AUFS(联合文件系统,将不同文件夹中的层联合在一个文件夹中)
网络:网桥,container,none,host
Dockerfile命令:from,label,run,expose,copy,volume,
Linux下iptables不仅可以用来做防火墙还可以用来做端口转发。
k8s:
k8s组件:master:apiserver,etcd,scheduler,controller-manager(节点控制器,副本控制器) ,node组件:kubelet,kube-proxy,容器引擎(docker),插件addons)
pod:容器组,存放container:共享网络,存储卷,k8s的最小的单位
工作负载:Deployment(无状态),StatefulSet(有状态),DaemonSet(守护进程,监控,日志收集),Job,CronJob
服务与路由 :service(ClusterIP,NodePort,LoadBalance),ingress(将集群内部的service通过https方式暴露到集群外部,并通过规则定义路由,ingress controller -- nginx)如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。
自动伸缩:根据cpu,内存,网络,磁盘自动调节pod数量;算法(基于期望的度量值和当前的度量值之间的比例运作),以 CPU 利用率为例,假设当前有2个实例, 平均 CPU 利用率(当前指标数据)为90%,自动伸缩设置的目标 CPU 为60%, 则自动调整实例数量为:90% × 2 / 60% = 3个。如果用户设置了多个弹性伸缩指标,HPA 会依据各个指标,分别计算出目标副本数,取最大值进行扩缩容操作。
存储(数据卷类型:emptyDir(存放临时数据),nfs(network file system:网络文件系统),hostPath,configMap,secret)
7. 其他
敏捷开发:快速迭代,快速交付,降低风险,及时止损,每个迭代版本(需求规划,设计,编码,测试,交付)和Scrum 三种角色,四种会议(Sprint,角色(产品,master,开发团队),会议(Sprint 计划会,站会,验收会,回顾会议),避免在迭代版本中加入新需求)
职业规划:架构师需要什么样的能力(编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力),2年内成为一个合格的leader,公司越来越好,平台越来越高,自己能得到锻炼,提升自己能力,项目管理(对业务比较敏感,喜欢沟通),一共5个后端,1个小程序,2个PC端,先成为一个合格的小组长,技术经理,项目经理,然后再到技术
高并发:1wqps,秒杀,用redis进行拦截,消息队列
遇见的问题:技术上 spring cloud + dubbo的环境下,消费者找不到服务的问题, 业务上产品做出来了,用户不喜欢用
最近在看的书:1984,图解算法与数据结构
自我介绍
你好,我叫邓朝胜,6年后端开发经验,1年管理经验,毕业后先后参与了外包项目,长租公寓项目和社区团购项目,熟练使用MySQL数据库,后端开发链,对微信小程序,前端也有所了解。
8. 计算机基础
网络编程:四层模型(应用层,传输层,网络层,数据链路层),3次握手
算法:动态规划,数据结构,算法思维
Java:JDK源码(HashMap,ThreadLocal,ArrayList,LindkedList,StringBuffer,StringBuilder,jdk1.8),并发编程(volatile,synchronized,lock,reentrantLock),CAS,AQS),多线程(线程池,线程生命周期),JVM,设计模式),反射,代理
Redis:命令,架构(数据类型,淘汰策略,单线程,RDB,AOF,持久化策略选择),应用(redis集群,redis同步机制,缓存雪崩)
MySQL: 锁(全局锁,表锁,行锁,意向锁,共享锁,排它锁,乐观锁,悲观锁,锁优化),事务(acid,隔离级别,不可重复读,脏读,幻读),日志(redolog,undolog,binlog),索引(数据结构,最左匹配原则,前缀索引),存储引擎(InnoDB,MyISAM)
框架:Spring(Bean注册流程,Bean定义,隔离级别,schedule使用,拦截器,过滤器),mybatis(缓存,session,分页),springboot(starter),Spring Cloud (服务发现注册,rpc,负载均衡,熔断隔离,网关),Dubbo(通信模型,协议,与Spring Cloud的区别),MQ(RabbitMQ,Kafka),es
架构:数据库设计,服务治理,压测,
最后更新于