查看原文
其他

7 天,凭这个项目,我进了大厂!

The following article is from 编程导航 Author 星球-404ERROR

大家好,今天这篇文章是 编程导航星球 的 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 咨询星球(备注“想加星球”):

往期推荐

我的学习小圈子

连接不存在的 IP ,会发生什么?

偷偷盘点面试官才知道的事

这个项目不算烂大街,可以冲

代码这样写,同事乐开花

8 大 Web 开发趋势预测!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存