这几天面试了七八家公司,每天面试两家,从前面的问的问题简单,技术面问题不超过五六个问题,主要是自我介绍,在公司里做了什么,对项目的开发感兴趣。

面试关键字:

自我介绍,项目细节,为什么来到重庆,未来规划,技术问题。

面试题(后面的数字代表提问次数):

  1. Linux常用命令(4)
  2. Oracle函数过程(2)
  3. Drools规则引擎是做什么(1)
  4. 微服务组成(1)
  5. Docker四种网络模式(1)
  6. Docker常用命令(3)
  7. Docker如何部署项目(1)
  8. Map子类和线程安全(1)
  9. Hashmap和tablemap区别(1)
  10. Hashmap底层原理(4)
  11. 红黑树是什么(1)
  12. Nginx反向代理(2)
  13. 爬虫过程(1)
  14. AOP和IOC原理(1)
  15. 权限管理设计(1)
  16. Cloud使用什么作为注册中心(1)
  17. 微服务运行过程(1)
  18. MybatisPlus用过没有(2)
  19. Dubbo运行机制(1)
  20. Dubbo 的服务调用流程(1)
  21. Oracle查询一条数据命令(1)
  22. 读取yml方式(2)
  23. 服务治理(1)
  24. List子类(1)
  25. List和set区别(1)
  26. ArrayList和LinkedList区别(2)
  27. String和StringBuffer区别(1)
  28. 常用的RPC框架(1)
  29. SpringBoot常用注解(2)
  30. Springboot核心注解(2)
  31. run方法底层(1)
  32. MQ消费重复(2)
  33. Redis基本类型(4)
  34. Redis缓存穿透,雪崩,击穿(1)
  35. elk是什么(1)
  36. ES是什么(2)
  37. Redis持久化方式(4)
  38. 数据库优化方式(1)
  39. MySQL主从复制(1)
  40. Redis哨兵机制(1)
  41. Rabbitmq丢失了数据,如何处理(1)
  42. 为什么要用MQ(1)
  43. MQ解耦,异步,削峰(1)
  44. 还有什么其他特殊二叉树(1)
  45. MySQL主库挂了,如何处理(1)
  46. MySQL连接,主连接和外连接区别(1)
  47. mysql左右连接区别(1)
  48. varchar和char区别(1)
  49. #{}和${}区别(1)
  50. SQL如何注入(1)
  51. Vue生命周期(1)
  52. 单点登录做过没有(1)
  53. ES读写过程(1)
  54. RabbitMQ五种工作模式(1)
  55. mybatis where标签和where关键字区别(1)
  56. mysql悲观锁和乐观锁(0)
  57. Redis集群宕机(1)
  58. 如何设计主键自增(1)
  59. Nginx如何查看log(1)
  60. 用过什么http协议(1)
  61. object转换为string (1)
  62. TCP/IP三次握手建立连接和四次挥手(1)
  63. jsp作用域(1)
  64. mybatis的result返回类型(1)
  65. resultMap和resultType区别(1)
  66. lock锁过程和原理(1)
  67. 如何和甲方沟通(1)
  68. innoDB引擎是什么(1)
  69. 预编译是什么(2)
  70. spring事务(1)
  71. mysql如何保证主从复制数据一致性(1)
  72. mysql如何分库分表过程(1)
  73. springboot热部署(1)
  74. 微服务如何调用(1)
  75. spring默认日志是哪个(1)
  76. ES基本类型(1)
  77. 查询linux端口命令(1)
  78. spring的@transactic注解在什么情况下事务不生效(1)
  79. 拿到一个项目,如何着手(1)
  80. @Controller和@RestController区别(2)
  81. 日期格式化(@SimpDataFormat)(1)
  82. 线程池是怎么实现(1)
  83. 怎么保证线程安全(1)
  84. redis使用场景(1)
  85. 消息队列出现错误后,还会推送消息吗?处理机制是怎样的?(2)
  86. 数据库索引(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)

  • RDBRDB 持久化机制,是对 redis 中的数据执行周期性的持久化。
  • AOFAOF 机制对每条写入命令作为日志,以 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)

  • 解耦:通过一个 MQPub/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以上,红黑树,我又忘了。然后就没了,也基本面试失败。他说等两天回复。

第四家,问的问题最全,这个等到后面再写吧。只有加油了。

这个二面,技术组长一直贬低你,问了一个外包项目问题,拿到一个项目你该怎么做?没接触过,然后把你说道一顿,显示他的厉害。跑功能,不是看代码。