本文主要是介绍2021面试的暴击(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
停更了比较久的时间,主要是去年说是去备考软考,经过一段时间的“努力”确实也是成功上岸,拿到证书以后整个人有点飘飘然,想着年后就可以拿到一份大的offer,从此变成高薪码农,走上人生巅峰。
但是现实总是那么的不尽如人意,在上家公司呆了一段时间,一方面是有这个保底,另一方面确实呆的已经足够久了,也想跳出来看看自己的水平在这个行业目前是什么样的一个状态。然后在多方原因的共同作用下果断的辞去了现在的工作,当时还是满心欣喜,但是到了确定的时间点没有等到我想要的结果,公司在深圳,正在迁地址,时间少则三五月,多则半年,然后内心是十分崩溃的。
调整了一段时间后,没办法,只得开始我的慢慢面试的道路。从学校毕业到现在,也是没有经历过一次完整的面试(上家公司作为初创进去的,001号员工),最多就有几个电话面试,所以在找到满意的工作之前,先更新一段时间我这些日子的面试经历,算是一种经验积累的一个过程。
时间:2021年3月23号 某中型信息科技有限公司
面试过程:
1、填张表格,一些基本信息,上到个人下到家庭(很详细的要求填写,有点反感),然后做DISC性格测试。
2、提交表格,等待面试(有个小点,公司人事没有打印简历,我也没带,所以面试官是看着我写那些想到哪问到哪,所以面试的话最好自己准备几份简历)
3、面试正式开始,进来一位看起来就比较资深的慈眉善目的大佬,刚开始闲扯了几句,然后开始面试,前面是一些基本的问题,对于上家公司做了哪些项目,都实现了哪些功能,使用了哪些技术,随后开始了技术层面的一系列追问,不是对于所有问题都记得,捡一些印象比较深一点的记录一下。
问题一:SpringCloud五大常用组件并简述其作用
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon(我们之前用的nginx做的负载均衡)
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
问题二:单点登录使用的框架以及简述单点登录的实现
当面试官问这个问题的时候我是有点懵的,现在回想起来的话他当初的意思应该是我们用了哪种实现方式,并简述实现方式。
最简单的单点登录实现方式,是使用Cookie作为媒介,存放用户凭证。用户登录父应用之后,应用返回一个加密的Cookie,当用户访问子应用的时候,携带上这个Cookie,授权应用解密Cookie并进行校验,校验通过则登录当前用户。(此方法有跨域的问题,安全性也有待考量)
其次的话可以使用JSONP实现。用户在父应用中登录后,跟Session匹配的Cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的Cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。(存在安全性问题)
最后的话就是页面重定向。父应用提供一个GET方式的登录接口,用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个的登录页面,用户输入账号密码进行登录。如果用户已经登录了,则生成加密的Token,并且重定向到子应用提供的验证Token的接口,通过解密和校验之后,子应用登录当前用户。(较为繁琐)
对于大型系统话可以使用用户中心作为单独的服务,该服务不做系统交互,只做用户的登录鉴权操作。
问题三:对jvm的了解,简述一下
因为jvm的知识体系太大了,一时也不知道从何讲起,就简述了一下jvm的结构并解释了每一块的作用,随后引申了GC机制,简述了GC过程和寻找垃圾的几种方式。
问题四:Redis可以缓存哪些数据结构?
string,list,set,hash,sorted_set
问题五:Redis有哪几种模式?SpringBoot如何实现和Redis的连接?
standalone模式(主从模式),sentinel模式(哨兵模式),cluster模式(集群模式)
添加依赖,在yml文件中配置database,host,port,password等,创建编写redisConfig,创建redis操作类(其实我不大明白这个问题的意义在哪里,可能是我理解错了)
问题六:什么是数据库连接池?为什么使用数据库连接池?项目使用了哪些连接池。
数据库连接池(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。
即在程序初始化的时候创建一定数量的数据库连接,用完可以放回去,下一个在接着用,通过配置连接池的参数来控制连接池中的初始连接数、最小连接、最大连接、最大空闲时间这些参数保证访问数据库的数量在一定可控制的范围类,防止系统崩溃,使用户的体验好。
为什么要使用连接池呢,数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的时候可能导致服务器崩溃;数据库连接池可以节省系统许多开销。
使用的是HikariCP数据库连接池,也没用过其他。
问题七:Mysql索引的类型有哪几种?分别简述。
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
常用的也就是HASH和RTREE了,由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(多路平衡查找树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
问题八:Mysql联合索引只用了其中一列造成索引浪费如何优化?
根据联合索引最左前缀匹配,建立联合索引的时候需要把热点数据按照从高到低的建立联合索引,把最热的数据放到联合索引的最左边。但同时联合索引越多,索引列越多,则创建的索引越多,索引都是存储在磁盘里的,通过索引算法(Btree代表索引算法使用二叉树的形式来做索引的)来查找数据,的确可以极大的提高查询效率,但是与此同时增删改的同时,需要更新索引,同样是需要花时间的,并且索引所占的磁盘空间也不小,所以建议单表最好不要超过一个联合索引,字段不超过三个。
问题九:负载均衡怎么实现的?
服务端的话一般使用的是Nginx,常用的方式的话主要是轮询和加权轮询。轮询的话,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
加权轮询可以在后面指定每个服务器的比重,比如:
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
客户端负载均衡使用Spring-Cloud-Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。
问题十:针对SpringCloud负载均衡服务端实现和客户端实现,两者区别。
一张图说明吧,我当时也没讲清楚
客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端清单,这些清单统统都是从Eureka服务注册中心获取的。
问题十一:项目中使用是否使用分布式事务?如何解决分布式事务一致性问题?
二阶段提交和补偿。二阶段提交举个例子:
第一阶段,张老师作为“协调者”,给小强和小明(参与者、节点)发微信,组织他们俩明天 8 点在学校门口集合,一起去爬山,然后开始等待小强和小明答复。
第二阶段,如果小强和小明都回答没问题,那么大家如约而至。如果小强或者小明其中一人回答说“明天没空,不行”,那么张老师会立即通知小强和小明“爬山活动取消”。
补偿的话按实际生产需求,我们是使用MQ进行补偿。
其他的一些问题记忆不是很清了,对于我来说也算是首秀了,可能是比较长的时间没有接触面对面的面试了,很多问题面试官提出来我是没有反应过来的,整个过程大概四十分钟,然后回答了六六七七吧,长路漫漫,加油吧骚年。
这篇关于2021面试的暴击(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!