7 天,凭这个项目,我进了大厂!
共 3556字,需浏览 8分钟
·
2023-03-03 22:54
大家好,今天这篇文章是 编程导航星球 的 404ERROR 同学的面经分享(已上岸大厂实习):
星球原文链接:https://t.zsxq.com/0bngfX6Ll
首先,感谢鱼皮的 接口开放平台项目,我凭借该项目通过了多个大厂、中厂的面试,最终拿到了某大厂 Java 后端实习生的 offer。
在这里分享一下十几场面试下来被问到关于该项目的一些真题,回馈星球。以下回答都是基于我自己的理解整理的,如果有不准确的地方,希望各位大佬指教,也希望鱼皮能多出几个这样的项目!
问题1
项目是你自己做的吗?你为什么做这样的一个项目?你做这个项目的背景(初衷)是什么?几乎每次都被问到
答:我的初衷是尽可能地帮助和服务更多的用户和开发者,让他们更加方便快捷地获取他们想要的信息和功能。
接口开放平台它可以帮助开发者快速接入一些常用的服务,从而提高他们的开发效率,比如天气服务、随机头像和心灵鸡汤等服务,它们是一些应用或者小程序中常见的功能,所以提供这些接口可以帮助开发者更加方便地实现这些功能。
这些接口也可以让用户在使用应用时获得更加全面的功能和服务,从而提高他们的用户体验。所以我认为接口开放平台是一个有意义的项目,可以为用户和开发者带来更多的便利和价值。
注:因为我个人已经将项目上线,并能够提供一些真实的接口服务。有条件的同学尽量将项目上线。此外有两场的面试官想要查看数据库,我开了屏幕共享给他们看,所以要对数据库的表结构和设计有一定的了解。
问题2
项目的架构你是怎么设计的?
答:我采用前后端分离的架构,前端使用Nginx部署,通过 Nginx 反向代理将请求转发到 web 项目,因为项目刚刚上线,所以这里暂时采用了单机部署的模式,未来可能采取水平扩容的方式,增加多台节点,通过 Nginx 的负载均衡,将请求平均的分发到我的每个节点上,以支撑更高的并发。
我的 web 项目使用 Spring Boot 开发,并连接到了数据库和 Redis,数据库使用的是 MySQL,主要用来存储用户的信息和接口的信息;通过 Redis 实现了分布式 session,因为考虑到未来要使用分布式架构,为了避免使用 tomcat 保存 session 有用户登录失效的问题。
注:这里我说出了反向代理,水平扩容,负载均衡等技术名词,很多面试官会根据这些名词进行延伸提问(引导面试官往自己熟悉的东西上提问)比如:说说什么是正向代理/反向代理?什么是水平扩容?什么是负载均衡?你了解哪些负载均衡的算法?提前准备好这些知识之后,就可以跟面试官一顿输出了。
问题3
你怎么做的技术选型?为什么要用这些技术?
答:使用 SpringBoot 是因为通过自动装配能够提高项目的开发效率,还能够很好的整合其他服务。
使用 MySQL 的原因是因为考虑到未来有用户充值交易,限制调用次数等场景需要用事务保证数据的完整性和一致性。
使用 Redis 的原因是因为可以用来实现分布式 session、锁、缓存等功能。因为 Redis 是一个单独的中间件,不同客户端可以往同一个 Redis 或者集群中存放session/加锁,这样就能保证资源能够在分布式服务下都可见。
并且由于 Redis 也是单线程的,同时也支持 lua 脚本,可以保证并发安全的问题,所以可以很简单的实现分布式锁的功能。
注:被面试官追问自动装配的原理你了解过吗?自动装配是怎么实现的?分布式 session 的原理?
问题4
你的开发流程是什么?先实现还是先技术选型?
这里可以参考鱼皮大佬直播开发时对企业中做项目流程的讲解
答:我先参考了一些已有的产品,根据这些产品,总结出来比较好的功能点,再结合自己想要实现的一些功能特色,去做了一个项目整体设计,有了产品原型后再进行技术选型。使用什么样的技术去解决什么样的业务问题。
问题5
为什么你要使用网关?
答:我这个平台的关键点就在于提供接口服务,要保证接口的可用性和稳定性,所以将接口服务独立部署在另一台机器上,隐藏真实的接口地址及端口,调用接口服务的请求都必须经过网关流量染色之后...(这里细节太多,比如 rpc 调用获取用户sk,重新生成签名认证等等)之后,将请求转发到真实的接口地址,防止接口被恶意调用、盗刷。
注:这个问题要对网关做了什么事情非常非常熟悉,建议反复观看鱼皮大佬的直播回放。
问题6
为什么使用 RPC 调用?有了解过其他的方式吗?
答:因为如果在网关引入数据库的操作的话,不仅会增加项目体积,以及违背了设计原则的单一职责原则,所以我考虑通过服务间调用的方式,我了解过有两种方式,第一种是 Open feign,原理是构造了一个 HTTP 请求,并会添加很多的请求头,body 是使用 json 字符串传输,所以调用效率会比较低,更加适合外部服务间的调用。
然后我了解到 RPC 是可以基于 TCP 协议,避免了无用的请求头,以及可以通过将数据序列化为二进制流的形式传输,效率更加高效,更加安全,所以更适用于我这个场景。最终我选择了 Dubbo RPC 框架来实现这个功能。
问题7
你的接口调用次数统计以及排行是怎么实现的?
答:通过 MySQL 统计,每次调用结束后,网关都会发起一个 rpc 请求,调用次数+1。
注:这里我会抛出一个设计缺陷,在实际测试过程中,通过 jmeter 压测工具,会出现调用次数不准的情况,原因是因为没有在业务层面加锁,导致数据库出现并发写的问题。并且并发量大的话,对数据库造成很大的压力。引导面试官问出,那你有什么更好的解决方案吗?
答:如果在业务层面加一个写锁的话,会影响业务的执行效率,所以我想使用 Redis 去解决,Redis 有一个数据结构 Zset 支持排序,score 可以用来存储调用次数,并且 Redis 是单线程,可以解决并发问题。
注:这里被追问过 Zset 的底层实现,以及如何将这些数据进行持久化保存,防止 Redis 宕机导致数据丢失,可以从 AOF,RDB 展开来讲,或者在后台开启一个定时任务,定时将这些数据进行落库。
问题8
你做过什么优化吗?你接口的性能怎么样?
答:我有一个接口是随机返回土味情话,我在数据库中插入了几千条土味情话,当调用接口时随机返回一条。
在还没有优化前,接口的 qps 在 300 左右,但是考虑到这个接口只有读操作,没有增删改操作,所以我将这张表的存储引擎从 Innodb 改为了 MyISAM,接口的 qps 提升到了 1500。
注:被面试官追问为什么改为 MyISAM 有这么大的性能提升?Innodb 和 MyISAM 有什么区别?
这个问题一定要根据自己实际情况来答,根据自己擅长的方面,比如对查询语句做了索引优化,提升了接口的性能。
总而言之,面试官会从各个角度去深挖项目的细节,考量你是不是真的自己做的,是不是真的理解?所以要做到对项目的所有细节都非常的熟悉。当完全理解项目之后,就能够提前预测到面试官会怎么问,并在面试过程中说出一些技术名词引导面试官,然后对这些问题,和延伸的知识点能够完全掌握后,相信一定可以征服面试官。
星球活动
1.欢迎参与 30 天面试题挑战活动 ,搞定高频面试题,斩杀面试官!
2.欢迎已加入星球的同学 免费申请一年编程导航网站会员 !
3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!
加入我们
欢迎加入鱼皮的 编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。
💎 加入星球后,您可以:
1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情
2)获取海量编程知识和资源,包括:3000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、500+ 精华帖等!点击了解详情
3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情
4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 3 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情
外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题
星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!
长按扫码领优惠券加入,也可以添加微信 yupi1085 咨询星球(备注“想加星球”):
往期推荐