这几天面试了七八家公司,每天面试两家,从前面的问的问题简单,技术面问题不超过五六个问题,主要是自我介绍,在公司里做了什么,对项目的开发感兴趣。
面试关键字:
自我介绍,项目细节,为什么来到重庆,未来规划,技术问题。
面试题(后面的数字代表提问次数):
- Linux常用命令(4)
- Oracle函数过程(2)
- Drools规则引擎是做什么(1)
- 微服务组成(1)
- Docker四种网络模式(1)
- Docker常用命令(3)
- Docker如何部署项目(1)
- Map子类和线程安全(1)
- Hashmap和tablemap区别(1)
- Hashmap底层原理(4)
- 红黑树是什么(1)
- Nginx反向代理(2)
- 爬虫过程(1)
- AOP和IOC原理(1)
- 权限管理设计(1)
- Cloud使用什么作为注册中心(1)
- 微服务运行过程(1)
- MybatisPlus用过没有(2)
- Dubbo运行机制(1)
- Dubbo 的服务调用流程(1)
- Oracle查询一条数据命令(1)
- 读取yml方式(2)
- 服务治理(1)
- List子类(1)
- List和set区别(1)
- ArrayList和LinkedList区别(2)
- String和StringBuffer区别(1)
- 常用的RPC框架(1)
- SpringBoot常用注解(2)
- Springboot核心注解(2)
- run方法底层(1)
- MQ消费重复(2)
- Redis基本类型(4)
- Redis缓存穿透,雪崩,击穿(1)
- elk是什么(1)
- ES是什么(2)
- Redis持久化方式(4)
- 数据库优化方式(1)
- MySQL主从复制(1)
- Redis哨兵机制(1)
- Rabbitmq丢失了数据,如何处理(1)
- 为什么要用MQ(1)
- MQ解耦,异步,削峰(1)
- 还有什么其他特殊二叉树(1)
- MySQL主库挂了,如何处理(1)
- MySQL连接,主连接和外连接区别(1)
- mysql左右连接区别(1)
- varchar和char区别(1)
- #{}和${}区别(1)
- SQL如何注入(1)
- Vue生命周期(1)
- 单点登录做过没有(1)
- ES读写过程(1)
- RabbitMQ五种工作模式(1)
- mybatis where标签和where关键字区别(1)
- mysql悲观锁和乐观锁(0)
- Redis集群宕机(1)
- 如何设计主键自增(1)
- Nginx如何查看log(1)
- 用过什么http协议(1)
- object转换为string (1)
- TCP/IP三次握手建立连接和四次挥手(1)
- jsp作用域(1)
- mybatis的result返回类型(1)
- resultMap和resultType区别(1)
- lock锁过程和原理(1)
- 如何和甲方沟通(1)
- innoDB引擎是什么(1)
- 预编译是什么(2)
- spring事务(1)
- mysql如何保证主从复制数据一致性(1)
- mysql如何分库分表过程(1)
- springboot热部署(1)
- 微服务如何调用(1)
- spring默认日志是哪个(1)
- ES基本类型(1)
- 查询linux端口命令(1)
- spring的@transactic注解在什么情况下事务不生效(1)
- 拿到一个项目,如何着手(1)
- @Controller和@RestController区别(2)
- 日期格式化(@SimpDataFormat)(1)
- 线程池是怎么实现(1)
- 怎么保证线程安全(1)
- redis使用场景(1)
- 消息队列出现错误后,还会推送消息吗?处理机制是怎样的?(2)
- 数据库索引(2)
面试题解析:
1.Linux常用命令(3)
Linux常用命令记录_hikktn的博客-CSDN博客
2.Oracle函数过程(2)
Oracle pl/sql编程语言基本命令入门_hikktn的博客-CSDN博客
3.Drools规则引擎是做什么(1)
用于提取复杂的业务逻辑,方便技术扩展,产品经理的快速变更业务。
4.微服务组成(1)
- Eureka注册中心
- Feign消费者
- Ribbon负载均衡
-
Hystrix服务降级
-
Turbine监控
-
Gateway网关
-
Config分布式配置文件
-
Stream中间件整合消息队列
-
Zipkin链路追踪
5.Docker四种网络模式(1)
Docker四种网络模式 – 简书
6.Docker常用命令(2)
Docker基本命令入门_hikktn的博客-CSDN博客
7.Docker如何部署项目(1)
- 使用nginx反向代理,代理当前ip和端口,并且启动tomcat中war包
- 例如war包和jar包,tomcat放到webapps文件下,启动docker容器版本的tomcat
- 宝塔一键启动
- 如果没有使用docker,则使用守护进程 命令 nohup java -jar app.jar
- 编写dockerfile命令,打包成docker启动
8.Map子类和线程安全(1)
- HashMap : 非线程安全,效率高,支持 无数个null 值和,但键只支持一个null。
- HashTable : 线程安全,效率低,不支持null值和null键,底层使用重量级锁Synchronize(同步锁)。
- TreeMap : 线程不安全,有序,基于红黑树实现,重写了equals和hashCode方法。
- LinkedHashMap : 线程不安全,有序,基于双向链表实现,底层hashmap和linkedlist结合,可重复key和value,同时也支持null值,key值重复直接覆盖。
9.HashMap和TableMap区别(1)
-
底层都是hash算法
-
线程安全和不安全
10.HashMap底层(3)
- JDK1.7之前数组和链表,1.8之后就是数组加链表加红黑树
https://www.jb51.net/article/206024.htm
11.红黑树是什么(1)
- 特殊的二叉树
- 每个节点要么是红节点,要么黑节点
- 根节点必须是黑色
- 红黑节点不能连续,父节点和子节点必须分为红黑节点
12.Nginx反向代理(1)
- 正向代理只是一台服务器对应一个端口,一个ip返回一个url
- 反向代理就是多台服务通过nginx代理,负载均衡后返回给浏览器一个url
13.爬虫过程(1)
- java爬虫,主要依托httpClient爬取网页数据,Jsoup解析HTML数据,每次爬取网页数据,必须按照HTML格式进行编码爬取。
14.AOP和IOC原理(0)
- IOC : Spring IOC容器:控制反转 Spring的IOC容器控制对象的创建
- AOP : 面向切面编程 软件开发中,不属于业务代码,属于可重复使用的代码,具有公共行为和逻辑,这一类称为切面类
在软件正常运行中,通过动态代理和设计模式编程,称为面向切面编程
Spring个人面试总结_hikktn的博客-CSDN博客
15.权限管理设计(0)
- 用户表
- 角色表
- 权限表
- 组表
- 角色权限表
- 组权限表
- 用户权限表
- 用户角色表
- 用户组表
- 组织表
- 操作日志表
通用权限管理设计篇_设计模式 – jiangxiaobo – 博客园
16.Cloud使用什么作为注册中心(1)
- Eureka作为注册中心
17.微服务运行过程(1)
- 用户访问url,通过负载均衡后统一网关发送请求,调用相应的功能组件,返回响应数据。
18.MybatisPlus用过没有(2)
- 没有使用,但是学习使用过其他类似的技术,springdatajpa,mybatis通用模板,现在已经花费时间学习完毕。
19.Dubbo运行机制(1)
- 基于RPC框架实现,利用提供者和消费者IO通信,JDK动态代理序列化的对象,单例模式引入各类bean,反射机制查找到自定义注解的类。
手写RPC框架
手写RPC框架_hikktn的博客-CSDN博客
20.Dubbo 的服务调用流程(1)
-
Consumer发送请求
-
Provider接收请求并发送响应
-
Consumer接收响应
-
大致实现,首先是读取配置信息,然后去注册中心调用URL,没有匹配到URL则通过配置信息默认创建http,匹配到则返回一个map,然后将其map中的url注入到动态代理中,同时传递给中间件处理。
阿里面试:dubbo的服务引用过程 – 敖丙 – 博客园
21.Oracle查询一条数据命令(1)
- rownum=1 返回行数一条命令
22.读取yml方式(1)
- @Value注解
-
@ConfigurationProperties注解
-
YamlMapFactoryBean硬编码获取
-
YamlPropertiesFactoryBean硬编码获取
23.服务治理(1)
- 企业为了确保事情顺利完成而实施的过程,包括最佳实践、架构原则、治理规程、规律以及其他决定性的因素。服务治理指的是用来管理SOA的采用和实现的过程。
到底什么是服务治理? – 知乎
24.List子类(1)
- ArrayList
- LinkedList
- Vector
25.List和set区别(1)
- list存储有序可重复元素,元素有索性
- set存储无序不可重复元素
26.ArrayList和LinkedList区别(1)
-
LinkedList :
基于链表实现,链表内存是散列的,增删快,查找慢; -
ArrayList :
基于数组实现,非线程安全,效率高,增删慢,查找快; -
Vector :
基于数组实现,线程安全,效率低,增删慢,查找慢;
27.String、StringBuffer 和 StringBuilder 的区别(1)
- String:字符串常量,字符串长度不可变。
- StringBuffer:字符串变量(Synchronized,即线程安全),效率不高。
- StringBuilder:字符串变量(非线程安全),效率高。
Java String、StringBuffer 和 StringBuilder 的区别 | 菜鸟教程
28.常用的RPC框架(1)
- RMI
- Hessian
- Dubbo
JAVA中几种常用的RPC框架介绍_Vince的修炼之路-CSDN博客_java rpc框架
29.SpringBoot常用注解(1)
Spring Boot常用注解(绝对经典)_Java攻城狮-CSDN博客_springboot常用注解
30.Springboot核心注解(1)
SpringBoot核心注解_Ein的博客-CSDN博客_springboot的核心注解
31.run方法底层(1)
深入剖析Springboot启动原理的底层源码_zw764987243的博客-CSDN博客
32.MQ消费重复(1)
- 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update 一下好吧。
- 比如你是写 Redis,那没问题了,反正每次都是 set,天然幂等性。
- 比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个 id 去比如 Redis 里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个 id 写 Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。
- 比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。
33.Redis基本类型(3)
-
String(字符串)
-
Hash(哈希)
-
List(列表)
-
Set(集合)
- ZSet(有序集合)
34.Redis缓存穿透,雪崩,击穿(1)
- 击穿:如果并发特别高,缓存没有的话,常规情况下,从数据库查到然后放到缓存里面,但是呢,并发量太大了,写入需要时间,这时大批量请求全部压在缓存,这个时候的缓存还没有写进来,后面的请求都去数据库查,这时候就是击穿。
- 穿透:你去缓存查的时候,比如一个用户去查,用户id为1,但是缓存里没有这个用户,然后去数据库查询,数据库也没有,查出数据库里null,缓存不可能命中,如此反复,缓存命中率很低,失效了。
- 雪崩:缓存会设置有效时间,如果设置的时间为同一时间,同一时间缓存失效了。然后同一时间去数据库查询,大批量的访问会直接将数据库压垮。
雪崩处理方式:
事前:redis 高可用,主从+哨兵,redis cluster,避免
全盘崩溃。 – 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。 – 事后:redis
持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据
穿透处理方式:
每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。 然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓 存中取数据。
击穿处理方式:
可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等 待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
35.elk是什么(1)
一种能够从任意数据源抽取数据,并实时对数据进行搜索、分析和可视化展现的数据分析框架。
36.ES是什么(1)
分布式搜索引擎
37.Redis持久化方式(1)
- RDB:RDB 持久化机制,是对 redis 中的数据执行周期性的持久化。
- AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
38.数据库优化方式(1)
- 分库分表,水平分表:根据时间分表;垂直分表:根据业务分表。
- 查询慢SQL,优化SQL语句
- 建立索引
- 集群
- 数据库底层配置,引擎选择
39.MySQL主从复制(1)
- 主库写入,从库读取,读写分离,利用binlog日志同步主从库。
40.Redis哨兵机制(1)
- redis 实现高并发主要依靠主从架构,一主多从。
- redis 高可用,如果是做主从架构部署,那么加上哨兵就可以了,就可以实现,任何一个实例宕机,可以进行主备切换。
41.Rabbitmq丢失了数据,如何处理(1)
- 生产者:开启事务,不推荐(同步);开启confirm模式(异步),推荐;
- MQ:开启持久化
- 消费者:关闭自动ACK提交
42.为什么要用MQ(1)
- 解耦,异步,削峰
43.MQ解耦,异步,削峰(1)
- 解耦:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。
- 异步:通过一个MQ,异步处理多个接口,响应速度小于200ms。
- 削峰:限制最多2k请求,防止MySQL挂了。
44.还有什么其他特殊二叉树(1)
-
二叉排序树
-
平衡二叉排序树(AVL树)
-
B树
-
B+树
-
红黑树
几种特殊的二叉树_tyisi的专栏-CSDN博客_特殊的二叉树
45.MySQL主库挂了,如何处理(1)
- 手动更改从库提升为主库。
46.MySQL连接,主连接和外连接区别(1)
- 内连接查询[内连接查询的是两张表有交集的部分数据(有主外键关联的数据)]
- 外连接查询[查询左表的全部数据,和左右两张表有交集部分的数据]
47.mysql左右连接区别(1)
- 右外连接[查询右表的全部数据,和左右两张表有交集部分的数据]
48.varchar和char区别(1)
char是定长,varchar是变长
char效率要高,varchar效率低一些。
49.#{}和${}区别(1)
- #{}是预编译处理
- ${}是字符串替换,不能防止sql注入
50.SQL如何注入(1)
- 数字型判断
- 字符型判断
Sql注入基本原理_猿小雷的博客-CSDN博客_sql注入攻击的原理
51.Vue生命周期(1)
52.单点登录做过没有(1)
- 没有
53.ES读写过程(1)
es 写数据过程
客户端发送一个node请求,通过document进行路由,发送给主分区,然后复制到子节点,最后返回响应结果。
es 读数据过程
客户端发送一个node请求,拿到document的id进行哈希路由,经过随机轮询算法后,在主分区中随机选择一个子节点,让读请求负载均衡,最后在将节点返回给document。
es 搜索数据过程
客户端发送一个协调请求,将所有节点发送给全部主从分区,经过查询阶段,获取阶段,最终返回结果。
54.RabbitMQ五种工作模式(1)
- 简单模式
- 工作模式
- 订阅模式
- 路由模式
- 通配符模式
55.mybatis where标签和where关键字区别
MyBatis中的标签和where关键词的区别 – 吃饭用大碗的程序猿
56.mysql悲观锁和乐观锁(0)
- 悲观锁:读锁,写锁,行锁,表锁
- 乐观锁:一种是通过版本号,一种是通过时间戳
57.Redis集群宕机(1)
建立三个集群,当主集群挂掉了,这时就可以开启副本集群,将这个未使用的从库变为主库,建立主从关系。
58.如何设计主键自增(1)
- UUID
- mysql主键自增
- 雪花算法
59.Nginx如何查看log(1)
- awk
- cat
60.用过什么http协议(1)
没有
61.object转换为string (1)
JAVA中Object转String_程序员的成长之道-CSDN博客_object转string
62.TCP/IP三次握手建立连接和四次挥手(1)
确认通信双方收发数据的能力
- 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。
- 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。
- 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。
卧槽!牛皮了,头一次见有大佬把TCP/IP三次握手四次挥手解释的这么明白 – 知乎
63.springboot 的 run是如何运行?
面试官问你你可以这样说,springboot是通过main方法下的SpringApplication.run方法启动的,
启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式祖册bean,
而它是通过启动类的SpringBootApplication注解进行开始解析的,
他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,
根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面
以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,
他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,
先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器4
反问面试问题:
- 应该在我的技术栈中增加什么
- 评价下一我的这次面试表现
- 有机会下次面试吗
走之前,一定要问几天之内回复,但是大概率是上午面了几小时就会回复你,超过一天基本上面试失败。
第一家,非常详细的问了项目中的开发,对一些细节问了几遍,而后问到技术,问的也是非常简单,linux常用命令,spring开发,Oracle函数过程,还有一个drools规则引擎是干什么的。后面就记不清了,然后就是让你提问,简单问了公司框架,回了公司怎么怎么厉害,业务怎么怎么广泛;接着问了,考核制度,根据领导来判断;又问了,加班情况,基本上996;还问了出差情况,出差地点范围西南,成都,贵州等地。等了三天以上,没有消息,基本面试失败。
第二家,还是问了项目介绍,没怎么细问项目开发,吸取上次的教训,让自己说整个工作经验更加流程。后面就是技术问题,微服务的组成,只回答了eureka注册中心,feign消费者,ribbon负载均衡,熔断降级,zuul网关,后面的config分布式文件忘了,以及中间件stream也忘记了。第二个问题,docker四种网络模式,没有接触过,没有回答上。第三个问题,docker常用命令,docker ps 、docker ps -a 、docker exec 、docker run -it 数据卷配置 、docker start 、 docker stop 、 dockercompose.file配置文件,帮助部署。第三个问题,docker如何部署项目,我回答的是,nginx下载容器后,配置反向代理,然后docker run -it 配置一下,最后启动。又问,如果是tomcat呢,我回答tomcat也是下载容器后,配置数据卷将webapps移出来,这个文件下可以放相应的HTML,如果不配置数据卷,那么就需要在容器内部存放jar包。又问了,如果只是单独的jar包运行,我回答的是java jar -配置 启动。然后就是,提问环节,还是问了公司框架,他的回答说,公司以政府项目,和水电厂合作好像是,有点忘了,以微服务为主要开发。我又问了加班情况,他说加班少,早九晚六。 当时我就觉得这个面试又挂了,没想到居然过了,可是我是第一次面试,经验太少,人也太年轻,问了问同学后,听取了他们意见,我当时再想多面试几家,以为加了微信,HR告诉我公司开的薪资,就是拿到office,后来我才知道还没到那一步,我当场石化。可是我已经发送了,我现在还有一点事,租房子之类,等几天我在告诉你是否入职,后头HR就没回消息。他们说我基本凉了,是真的凉透,大家一定要多问问HR,拿到office后,在拖一下。我也不知道该不该说实话,就是想多面试几家……………………………
第三家,第一反应,就是那家好偏,周围没有什么人烟,全是待开发地段,然后公司居然在一个看起来小区里的小工作室,30人团队。进门就是填写各种资料,从个人信息到家庭信息,一个简单的调查。一面,HR,问的是一些自我介绍,项目细节,为什么来重庆,然后就是未来规划,最后HR给公司一个介绍,介绍了06年政府项目,干什么的忘了。二面,技术面,上来就问map的子类,和线程安全,我只回了hashmap线程不安全,tablemap线程安全,treemap,然后就没有。补充:treemap线程不安全,linkedhashmap线程不安全,concurrentmap线程安全。然后问了hashmap底层原理,我回了hashmap是以链表存储,一个一个node节点存储,根据hash算法增加查询效率,以及hashmap默认大小为16,扩容调用的resize方法。可惜,我没有回答上1.8以上,红黑树,我又忘了。然后就没了,也基本面试失败。他说等两天回复。
第四家,问的问题最全,这个等到后面再写吧。只有加油了。
这个二面,技术组长一直贬低你,问了一个外包项目问题,拿到一个项目你该怎么做?没接触过,然后把你说道一顿,显示他的厉害。跑功能,不是看代码。