项目面试题

项目面试题
小伙伴们,为了让大家拿这个项目更好的出去面试,鸡哥给大家准备了这个项目的面试专栏,鸡哥以面试官的角度来告诉大家这个项目会被问到哪些题目,你应该准备哪些东西。同时小伙伴们出去面试的时候,获得的题目真题,也会在此进行集合。保障大家咔咔乱杀~
以下题目会以面试官的口吻来问写问题,答案以大家回答的口吻来进行回答,鸡哥给大家准备的贴近大家的表达。同时会给大家准备校招,社招的不同版本,如果你的简历上写这个项目,那么完全照搬就可以,如果你是把技术结合到自己的业务上的,那就做平移即可。目前题目和答案还在努力更新中!
介绍一下你这个项目吧?
1.1. 校招生回答版
好的,面试官,接下来我来阐述一个这个项目的业务是什么。这个项目主要是我在学校和几个小伙伴一起来做的,背景主要是我们是学校的 xx 专业,大家在求职的过程中,免不了要进行面试题的学习,网上的 pdf 很多,大家一般都是基于此来进行背诵或者收集,重复的题目及答案的质量参差不齐,我们就有一个想法,做一个线上化的面试题网站,来进行资源整合。学习面试的同时,将所学习的技术结合到一起。我们采用的是主流的微服务架构 alibaba,配合主流的中间件,前端主要是以 react 配合 antdesign 来进行,以 C 端为主的一个网站形式。我们叫他 XXclub(说你自己起的名字),整体为一个社区的形式,主要实现的功能有刷题,练题,交流群,模拟面试。我在这里面承担的角色是负责人,主要是输出想法设计,技术选型,架构设计,功能的设计及落地。其中刷题模块是我来进行主要落地实现的。项目主要为我们计算机院的人来提供使用,目前有 300 多个用户在我们的网站刷题和学习,未来会进行继续的推广。
1.2. 社招回答版
好的,面试官,接下来我来阐述一个这个项目的业务是什么。这个项目主要是我和公司的一个前端一起配合来做的,我负责整体的后端,背景主要是我们想要统一公司技术人员的技术理解标准,通过面试题的分类,难度,打标,来让大家统一认知。同时在我们公司招聘季的时候,极大的提高了招聘效率,往常面试,面试官需要准备题目等等,有了这个网站,面试官可以直接在这个网站找到题目来对面试者进行面试。这个线上化的面试题网站,进行面试资源整合。我们采用的是主流的微服务架构 alibaba,配合主流的中间件,前端主要是以 react 配合 antdesign 来进行,以 C 端为主的一个网站形式。我们叫他 XXclub(说你自己起的名字),整体为一个社区的形式,主要实现的功能有刷题,练题,交流群,模拟面试。我在这里面承担的角色是负责人,主要是输出想法设计,技术选型,架构设计,功能的设计及落地。其中刷题模块是我来进行主要落地实现的。项目主要为我们公司内部的人来提供使用。
你认为这个项目的难点和亮点是什么?
好的,面试官,这个项目对于我来说还是有一定的挑战性的,在此过程中,我也成长和学习到了不少。亮点和难点方面我主要从三个方面来阐述,一个是业务方面,一个是整体设计方面,一个是技术方面。业务方面来说,这个是我主导的,从0到1来进行落地的一个项目,前期的业务调研和老板不断的碰撞,对于我的沟通能力还是有很大的提升的。最终从不同人反馈的需求下,进行提炼,沉淀,发散。用户想要的是1,仅限于一个小点,不断挖掘用户背后的真实需求点,才是最好的。最终和老板碰撞,形成一套合理的业务形式。从整体设计方面,我们采用的是微服务架构的形式,领域能力的方式进行驱动划分,采取了一个整洁一点的分层模型架构,目前划分出来,题目主数据、权限、文件、网关几个服务。每个服务之间解藕。整体采用的是springcloud alibaba作为后端的技术框架,前端采用的是react+antdesign,中间件相关的东西,用docker进行中间件的部署。相较于目前的市面上的技术,项目采取的架构师比较新的(PS:如果对模型理解的比较差的小伙伴,此处不要过于装逼,请换种说法:从整体设计方面,我们采取的是微服务的形式,主要是划分为题目主数据、权限、文件、网关几个服务,每个服务之间解藕,xxxxx后面的和上面相同来说)。从技术层面来说,在这个过程做技术选型和功能的设计对我的提升是非常大的。这个完全的从0到1,意味着很多东西,需要我们来融合贯通,比如,我们做了网关gateway配合redis实现分布式的会话共享,基于threadlocal实现了整体用户上下文的打通,将一些设计模式融入到代码中。吧啦啦啦,自己再补充一点即可,选自己喜欢的,能说明白的。
鸡哥点评:这道题我们百分之90都问,我想听的真的是你搞了什么惊为天人的牛逼技术吗?或者你搞了什么牛逼的问题解决。大多数人是打不到的。亮点和难点是针对你自身的情况来设定的。讲的时候,讲出自信,逻辑自洽,这个环节会刷掉一些对自己项目都不了解的人,一问就是:我觉得我这个项目没什么亮点和难点。
说说你这个项目的架构情况吧?
从整体部署情况上,目前这个项目部署在两台服务器上,每台服务器部署一套应用在里面,如果某个服务挂了也不会影响到我们的整体的服务提供。当然,如果我们的服务器资源宽裕的话,可以继续进行部署,不断的进行水平的扩展。数据库,redis等中间件都部署在另一台专门中间件的服务器的上。前端的项目打包后,部署nginx,nginx反向代理到我们的网关,网关再进行各种请求的分发。对外是前端的域名,解析到前端服务器暴露公网,其他的后端及中间件交互都是通过内网的地址来进行交互。
从技术上,我们选取的是spring cloud alibaba微服务框架,ssm,权限satoken,gateway网关,配合mysql,redis,xxl-job,es等中间件来作为整体项目的技术架构。
鸡哥点评:如果你是直接简历用的鸡哥这个项目可以按上面这个说法来这么说,其中服务器的情况可以根据自身经历进行一定的微调,没有过项目经验以及校招的人,就按这个来说就可以。有经验的,懂服务器部署的,可以根据自身实际情况进行一定的微小调整。
你在这里面主要负责哪些东西?
好的,面试官。我在这个项目里面主要负责技术选型,框架的构建,刷题模块的设计与开发(ps:记住这个地方要给面试官埋沟子,这块说的,让面试官有兴趣延伸)。技术选型主要是评估用户量,服务器资源,工时的预估,选取最快能达成结果和比较主流的技术栈。框架构建这个过程也是看了很多资料,传统的三层,四层,洋葱等等,最终决定选择XX。(ps:这个xx。如果你对领域一点理解都没有,请不要给自己埋坑,踏实的说是三层的架构)。刷题模块就是从0到1 的设计与落地了。从需求沟通到业务建模到原型设计,数据库设计这些都是我来做的,最终开发进行落地。以上就是我负责的内容。
鸡哥点评:这道题一定要埋一埋钩子,什么叫沟子,面试官想问你负责什么就是要问具体的情况了,如果你在这里吸引了他,他一定会问你说的那个东西,那么你相当于提前准备好了,预想好了,应该如何说这些东西,直接就给面试官拉入你的节奏里面了。
你的技术选型是怎么做的?
技术选型主要是从几个方面来进行考虑的,需求背景,上手程度,技术生态,成本,工期等等。这个项目的工期比较充足,所以我们可以做自己的框架选型后,再开发业务,不需要选取一些已经做好的框架和业务,在上面二次开发,二次开发对扩展性和可维护性都比较差。我选择从0到1来做这个项目。这个需求社区设计的功能比较多,为了后续更好的扩展,我们选取微服务的形式来进行开发,直接使用的是cloud alibaba,相比于传统cloud,更加方便使用。数据库的数据量不会太大,直接选择mysql即可。缓存就是用redis比较方便。定时任务因为是微服务,选择 xxljob。
你们的前后端的开发模式是什么样的?
我们这个项目采取的方式是前后端分离开发的模式,前后端通过接口文档配合原型来进行开发设计。整体的设计规范由我们后端的接口开发者来进行定义,定义好接口的出入参之后,和前端进行沟通对接。双方确认后,进行开发,文档用的是 apipost,进行团队的协作。按照文档开发完成后,进行前后端联调。联调无问题则进行测试。在此过程中,有任何的变更,都要在联调之间,双方沟通好,保证一致。
编写接口对接的时候,你觉得应该注意些什么?
这个问题从两个层面来说吧,一个是咱们给前端用的接口规范。这块要保证可理解性高,语义简单,定义好公共的出参格式。必填非必填等定义清晰,类型定义清晰。另一个层面是大头,就是咱们后端在编写接口的时候要注意的点。最重要的一个原则是,让前端只负责进行渲染,尽可能的将逻辑进行后移。前端不要根据后端的参数做复杂的逻辑判断和处理。然后就是接口性能层面,对于 c 端项目尽可能在 100~300ms,部分可以到 500ms 以上,再往上就要考虑异步的通知来进行。一定要保证用户的体验。
你的这个刷题业务是怎么做的?
刷题业务整体是这样进行设计的,我先讲一下业务。刷题主要是为了方便看题库,题目是主要的信息,那么题目会分为几个类型,单选,多选,判断,简答。这块可以扩展为设计模式,工厂+策略来做。然后就是题目为了方便查询,会涉及到其中的分类,标签。分类是大类,比如框架,数据库等等,标签是题目的小类,一个题目可以属于多个标签,比如一道 mysql 的题目,既可以属于 mysql 标签,也可以属于基础标签。进行了难度的划分,还有题目的解析。为了方便大家进行精准查找,做了全文检索的高亮设计。
你说其中用到了设计模式,这样设计有什么好处吗?
在目前的项目中,用了几处设计模式,第一块就是题目录入的时候,因为题目类型有四种,未来也可能做一些变种题目类型的变更,于是用工厂+策略模式来进行了一波处理,这样处理的好处是,四个题型各写各的逻辑,互相解耦,互相没有任何影响。然后主逻辑的 service 层代码。也不需要任何变动。当我新增加一种题目类型的时候,也是不需要修改任何主逻辑的代码。直接增加枚举,然后处理其中的逻辑即可。另一处设计模式的使用,是文件相关的适配器模式。在文件的 sdk 上封装一层 adapter,主要是为了操作底层文件的时候,不用处理任何的上层代码。上层业务无需进行任何修改,即可更换文件存储 oss。
你这个项目的分层是怎么做的?
鸡哥点评:这道题如果面试官问到了,请注意:如果你对分层理解的不深,不要装逼,老老实实的按照三层架构回答,如果你理解了分层,就按项目的模块正常回答即可。
我们对项目进行了一波分层的拆分,主要是分为对外接口层,应用层,领域层,基础设施层,公共层,启动层。相较于传统的三层架构,这样来做模块分层更加的清晰,便于管理,每层只关注自身行为。对外接口层,主要是微服务之间的 api 接口提供,会放到这里面,方便消费方进行引用调用。应用层,主要放我们的入口,比如 controller 入口,mq 的消费,job 的启动。领域层就是我们把领域性的代码放在里面,比如新增题目能力,这个内部可能涉及很多原子,我们在领域层做组装,提供出去。基础设施层,这层,我们做最原子性的处理,主要是与 mysql,redis 等数据来源的交互,以及外部的 rpc 调用。公共层主要是沉淀,所有层都需要的包及逻辑,便于复用。启动层,就是单独抽一个 starter,专注于启动配置。
这个项目如何的进行上线?
注意:这道题其实很少会这么问,但是有小伙伴想知道。有些小伙伴总是纠结,要不要给面试官看什么上线的地址,其实都是没必要的。直接说内部使用即可。校招有时间,倒是可以本地弄下。
我们的项目是在内部进行使用的,走的是公司内网,所以没做外网地址。整体分为两部分来说,从前端来看,先申请了域名,做域名备案后,与服务器上 nginx 的地址进行了映射绑定,nginx 内部放了前端打包好的静态资源,nginx 配置了反向代理,直接到我们的后端网关,统一进行路由。前端我们就放了一台机器。再来说后端,后端主要是弄了 2 台服务器,来平摊了服务的部署,网关进行整体的转发,通过 nacos 找到服务提供。因为内部用,服务器比较少,中间件相关和服务都在一起。可以随时进行水平的扩展。拆开也是一样可以直接使用的。
你这个数据库密码加解密怎么做的?
数据库的密码加密主要是保证信息的安全性。直接使用了 druid 连接池的方式。利用 druid 提供的加密工具,先生成公钥和私钥。然后将密码进行加密。在项目配置文件,进行配置,其中 druid 提供了一个 property,可以开启加密的使用,然后配置密钥。就实现了密码在配置文件的加密。
你的分类和标签这个业务是怎么做的?
这个分类和标签的设计主要也是调研了一下需求,一开始我们设计的是一个分类对应一个标签,然后一个题目只能打一个标签,后来发现,比如 redis 为什么这么快,从分析上来看,属于缓存分类,属于 redis 和基础的两个标签。那么就要打破一对一的关系。其次就是标签为基础,不仅仅是 redis 下面的,也可以是其他分类下面的。所以做了一个标签池的概念,只和分类做关联,这样做之后,既方便了录题,也方便查询。其次就是题目与他们的关联关系,通过中间表来进行关联做,这样就打通了分类,标签,题目三者的关系。
你说你封装了一些提效的组件,这块都有什么?
举一个例子,我们在做 es 的时候,发现无论是 data 操作还是传统的 client 组装起来还是很麻烦的。其中呢,又有大量的需要组装的重复代码。还有就是集群和索引切换的情况基于这种情况,我们就封装了一个 esclient,其中封装了常见的各种使用,通过入参,传入属性,可以去做不同的查询逻辑,比如高亮,模糊,精准搜索等等。同时将 es 多集群,多索引的情况,通过加载的形式,放入了工厂 map,涉及不同 service 的场景,直接传入 key 就可以取到 es 的链接。进行切换使用。这个小组件,在项目里面用起来十分的方便。
自动部署你是怎么做的?
自动部署主要是采用了 Jenkins 来做,通过 Jenkins 构建一个 maven 项目。在 Jenkins 的系统工具里面配置好 maven 环境,jdk 环境,gitcode 地址及用户密码。进行代码的拉取,配置其中打包的 pom 位置。然后,配置 maven 打包的命令。进行这几步后,就可以从 git 上拉取代码并进行打包,生成我们的 jar 包,然后要配合 shell 脚本,shell 脚本的作用主要是将我们打包好的 jar 包,复制到目录进行统一管理,然后配合我们的 kill 还有 jar 包启动命令来实现自动启动。
自动部署如何往多台服务器部署呢?
往多台服务器部署的能力主要是使用了 Jenkins 的一个插件 publish ssh,当 Jenkins 服务器打包完成后,可以通过这个插件将 jar 包发送到不同的机器上,发送完毕后,还可以执行配置好的 shell 脚本,这样就实现了往多台机器自动部署,只需操作一个 Jenkins。
nacos 的动态配置原理是什么?
nacos 主要是长轮询的方式获取数据,client 也就是我们的服务会像 nacos 的 server 发送请求,判断数据是否有变更的情况。如果与本地的数据对比有变化则进行配置的更新,其中判断是否更新了采取的是整体加密后的 md5 串的对比。如果无变化,则证明无更新,有变化,则拉取最新的配置。
搭建项目你是如何解决包冲突的问题和各种组件的兼容?
在最初进行选择的时候,比如 boot 与 cloud 与 cloudalibababa 的冲突适配问题,我们是先选择了 springboot 的版本,考虑再三觉得 2 还是比 3 更加成熟一点,3 可能有一些还没有适配上。于是我们选择了稳定的 2.4.2 版本。然后再通过 springboot 给我们提供的组件选择,还有阿里云的脚手架工具,就可以配置我们想要使用的微服务的组件,然后进行兼容版本的获取。这是项目层面。还有就是在开发过程中的 maven 相关的设计,maven 产生了包依赖的冲突,主要依靠的是 mavenhelper 插件,他可以帮助我们将整个 pom 梳理成树结构,同时冲突的会变成红色进行标注。方便我们找到冲突,还可以通过他直接操作排除,非常方便。
鉴权模型你是如何设计的?
鉴权模型主要采用的是 rbac,我们的项目不像 b 端项目那么复杂,需要 rbac-0 啊,1 啊 ,2 啊这些进阶的,就用最传统的即可。基于角色帮助我们把授权和用户的访问控制来做结合。用户就是指我们的系统使用者。权限就是用户我们对系统的操作,访问哪些东西,可以操作写入操作等等。实际的例子,比如新增题目。Role(角色)就是我们去把一组的权限,去做集合,就得到了角色。核心思想就是把角色和权限做关联,实现整体的一个灵活访问,提高我们的系统的安全性和管理型。基于这个模型,我们的开发速度还有粒度的粗细也都是十分好控制的。
权限数据你是放到了哪里?redis 吗?
对的,在微服务架构下的一个难题便是会话信息同步,单机版的Session在分布式环境下一般不能正常工作,为此我们需要做一些处理。处理的方案有几种,比如强制的 session 同步,通过算法保证统一用户请求落在同一节点。基于 redis 建立会话中心,节点改为无状态。从实现上,我们选择了主流的 redis 来存储权限信息。同时配合了网关 gateway 实现权限接口,来实现统一的鉴权处理。避免了与数据库频繁的交互。
为什么选取 satoken 来作为你们的权限框架?
这个问题从两个方面来回答的吧,一方面是技术选型涉及的成本,大家都知道权限是每个项目都绕不开的,如何快速的接入,并且具备较好的扩展性,功能完备,使我们最开始需要考虑的一个东西,satoken 十分轻量,功能齐全,学习成本低。可以快速接入。另一方面就是复杂性考虑:Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。正好符合我们的微服务分布式项目的场景。
无需实现任何接口,无需创建任何配置文件,只需要一句静态代码的调用,便可以完成会话登录认证。
相比 Shiro、SpringSecurity 等框架的复杂,你使用之后就知道 Sa-Token 的 API 设计是多么的好用。
token 机制的鉴权有什么好处?
说到 token 必须先说一下 cookie。传统的常规的一般是由 cookie 进行完成,Cookie 有两个特性:可由后端控制写入,每次请求自动提交。这就使得我们在前端代码中,无需任何特殊操作,就能完成鉴权的全部流程。但是在app、小程序等前后端分离场景中,一般是没有 Cookie 这一功能的。所以我们就引入 token 的这个概念。拆解出来主要是两步,一步是登录后,后端返回 token,另一部是前端请求带着 token,将 token 放到 header 里面。实现了 token 的传递之后,token 的生成过程,可以包含各种信息,比如用户的用户名,相关的权限,都可以包含在里面,这样一个 token 就可以帮助我们带来很多信息,鉴权等功能也就非常容易做了,同时还解决了 cookie 问题。
gateway 网关你都是怎么设计的?
gateway 网关,作为我们项目的整个流量入口,目前主要实现了路由,负载,统一鉴权,全局过滤器,异常处理这些功能。路由和负载承载了后台微服务的 uri 转发和前缀匹配。统一鉴权主要是配合 satoken,在 gateway 集成 redis,同时实现 satoken 提供的权限读取接口,在其中自定义读取逻辑,实现鉴权的校验。在其中还实现了登录拦截器,用于传递 loginId 到微服务中,借助了 header 的传递。
分布式会话的鉴权在微服务中的是怎么做的?
分布式会话鉴权的重点主要是如何获取到权限数据,然后进行校验处理,一般其实有三种形式,在网关处集成ORM框架,直接从数据库查询数据。先从Redis中获取数据,获取不到时走ORM框架查询数据库。从Redis中获取缓存数据。我们采取的是第三种直接从 redis 中获取缓存的权限数据,这有一个要求,就是我们的 redis 的高可用性必须要高。因为我们是内部使用,这块可以采取刷新等措施,来处理极端异常情况,例如权限缓存丢失。如果想要保障的话,可以采用第二种方式,也是常见的缓存没有查数据库。从角度来看,个人觉得我们这种场景下,再集成数据库 orm 导致网关有点重,所以我们直接与缓存做交互。
gateway 如何实现的全局异常处理?
gateway 的全局异常处理主要需要我们实现一个接口ErrorWebExceptionHandler,实现其中的 handle 方法,在方法内,我们能获取到其中 request 与 response,webhandler 会帮助我们拦住所有异常的情况。然后我们可以在里面做拦截的进一步处理,更改状态码,状态错误信息等等。最后通过 response 可以将其返回出去。
用户登录的密码加密你做了吗?
数据库如果说存储明文的密码是非常的危险的,一旦被攻击啊,或者数据泄漏,用户的信息疯狂的暴露出去,黑客什么都能干,这是非常不行,所以我们要做加密,让黑客即使拿到了密码信息, 也不知道原始的密码,就登录不成功。加密主要有摘要加密,对称加密,非对称加密。我们采用的是 md5 摘要配合加盐。摘要算法比如 md5,光加密 123456,结果都是一样的,如果是破解的库里正好有这个 md5 就很容易知道逆向是 123456。来一手加盐。盐是随机的字符串,他来与原密码进行一波二次加密。这样获取到的很难破解出来。
缓存与数据一致性,你有什么样的理解吗?
直接阅读这个

缓存与数据一致性问题
辩证两个情况1、直接和缓存做交互,完全信任缓存2、和缓存做交互,如果缓存没有,则去和数据库查缓存与数据一致性问题根据以上的流程没有问题,但是当数据变更的时候,如何把缓存变到最新,使我们下面要讨论的问题。1、更新了数据库,再更新缓存假设数据库更新成功,缓存更新失败,在缓存失效和过期的时候,读取到…
【项目实战】鸡翅Club
你是如何对接公众号登录的?
对接公众号主要是希望用某新的唯一的 openId,来作为唯一的标识,也方便用户的登录。
整体流程主要是用户扫公众号码。然后发一条消息:验证码。我们通过 api 回复一个随机的码。存入 redis
redis 的主要结构,就是 openId 加验证码。用户在验证码框输入之后,点击登录,进入我们的注册模块,同时关联角色和权限。就实现了网关的统一鉴权。用户就可以进行操作,用户可以根据个人的 openId 来维护个人信息。用户登录成功之后,返回 token,前端的所有请求都带着 token 就可以访问。
从服务涉及上,我们开一个新服务,专门用于对接某信的 api 和微信的消息的回调。
你是如何监听用户发给公众号的消息的?
主要是对接公众号的回调消息平台配置。重点主要分为三步:填写服务器配置,验证服务器地址的有效性,依据接口文档实现业务逻辑。
在公众号配置界面填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
验证消息的确来自微信服务器:某信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数有签名,内容,时间戳之类的,后台服务要通过一样的加密形式来进行校验。
依据接口文档实现业务逻辑:验证URL有效性成功后即接入生效,用户每次向公众号发送消息,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
回调消息的验证校验是如何做的?
开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
多线程你是在哪里用到的,咋用的?
多线程主要是因为最初快速开发的时候,前端的分类请求,每个分类都是轮询获取标签,比如有 10 个分类,他要串行调用 10 次,导致速度特别的慢。于是将逻辑进行后移,将分类换成多线程并发获取,然后统一进行组装,再返回给前端,这个过程,提高了性能。主要用到了 futuretask 来进行实现,同时自定义了线程池,没有使用 jdk 里面的提供的自带的线程池。
自定义线程工厂的意义是什么?
自定义线程工厂好处多多,比如可以设置自定义的线程名,方便我们开发调试,问题日志查找及定位。可以设置守护线程。可以设置线程优先级尅处理未捕获的异常:在执行一个任务时,线程可能会由于未捕获的异常而终止,默认处理是将异常打印到控制台。但这种处理方式有时并非你所想要的,存放如文件或者db会更合适。我们在代码中实现了自定义线程名的实践。在这个过程中,也看到了其他各种方式,如果要做的话,在代码处的如何进行处理。
线程池的数量应该设置多少?
这个问题,直接看这篇文章。

线程到底设置数量多少合适
可能很多人都看到过一个线程数设置的理论:CPU 密集型的程序 - 核心数 + 1I/O 密集型的程序 - 核心数 * 2不会吧,不会吧,真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心…
【项目实战】鸡翅Club
全局的用户上下文打通你是怎么做的?
当用户的请求来临的时候,前端会带着 token,token 里面有用户的 loginId 信息,首先经过网关的全局拦截器,拦截器会帮我们放入 header 里面,传递到其他微服务,微服务自己又实现了拦截器,获取到之后,放入上下文对象中,如果是微服务之间的 feign 调用,则又实现了 feign 的拦截器交互。
微服务之间的数据交互是如何做的?
微服务之间的交互,我们用的是 openfeign 来进行远程的调用。说到这里是放到我们的架构设计里面,当时设计的一个 api 模块层,专门来写对外提供的服务 api,打包成 jar 后,需要调用的服务直接引入 jar 包就可以实现调用。api 包,我们定义了当前微服务对外的各种接口,比如我们的题目微服务,想要调用用户信息,直接引入 auth 微服务的 jar 包即可。开启 feignclient 指定好应用名,就可以开始调用了。
本地缓存在哪里使用的?
本地缓存在项目中是在分类和标签查询那里进行使用的,分类和标签的数据很少产生变更,加个缓存速度更快,其实从实际的角度,我的思考是直接用 redis 作为缓存就可以适合这个场景了。但是我希望去了解一下本地缓存 guava 到底应该如何使用,于是引入了本地缓存。并且基于此配合函数式编程封装了一个公共缓存工具类。
你这个函数式编程配合泛型是为了解决什么问题?
对于我们大多数的场景,无非就是先查询缓存,缓存内没有数据,则去查询数据库。这个过程其实是一个很固定的模式。那么我就在想,查询数据库的地方可以抽象为函数 function,返回数据和入参可以作为泛型。中间和缓存的交互,我可以通过序列化,在工具内部进行判断。如果做了这个工具类,那就意味着,只要我调用工具类的一个静态方法,传入一个当缓存不存在的时候,我要执行的动作,那么就可以实现缓存的存入和读取了。
全文检索怎么做的,有高亮吗?
全文检索只要是引入了 es 模块。依靠其强大的倒排索引的能力来做关键词的反向搜索,获取搜索结果相关性的评分,评分高的证明相关性越高,排序排在最前面。其中的高亮主要是用了 hignlight 的方式,确定高亮数据要展示的标签,比如我们加了一个 span red,这样返回给前端之后,前端将其展示出来就变为了红色。其中的分词我使用了 ik 分词器,更加的符合中文的切分逻辑。
你封装的这个 es 工具有什么好处吗?
我们在做 es 的时候,发现无论是 data 操作还是传统的 client 组装起来还是很麻烦的。其中呢,又有大量的需要组装的重复代码。还有就是集群和索引切换的情况基于这种情况,我们就封装了一个 esclient,其中封装了常见的各种使用,通过入参,传入属性,可以去做不同的查询逻辑,比如高亮,模糊,精准搜索等等。同时将 es 多集群,多索引的情况,通过加载的形式,放入了工厂 map,涉及不同 service 的场景,直接传入 key 就可以取到 es 的链接。进行切换使用。这个小组件,在项目里面用起来十分的方便。
排行榜是如何设计的?

排行榜设计思路
排行榜一般来说实时的,非实时的。实时的方案数据库统计现在数据库里面的 createby 字段。用户的标识是唯一的,那我直接通过 group by 的形式统计 count。select count(1),create_by from subject_info group by create_by…
【项目实战】鸡翅Club
点赞和收藏怎么设计的?

点赞与收藏功能设计
点赞与收藏的逻辑是非常一样的,我们这里就选取点赞功能来给大家做开发。按照我们的鸡翅 club 的设计,点赞业务其实涉及几个方面,一、我们肯定要知道一个题目被多少人点过赞,还要知道,每个人他点赞了哪些题目。点赞的业务特性,频繁。用户一多,时时刻刻都在进行点赞啊,收藏啊等等处理,如果说我们采取传统…
【项目实战】鸡翅Club
项目有用到定时任务吗?怎么做的?
有的,项目上的定时任务,我们采用的是 xxljob,分布式任务调度,因为我们这一块用的是微服务,必须要考虑多个服务的执行的问题,如果用传统的定时任务方式,防止不了同时执行的问题,可能还有自己写分布式锁来进行排斥处理。不如直接使用 xxljob,xxljob 的调度十分完善,故障转移,负载均衡算法选择都非常方便,引入后,直接配置即可执行。像项目里面同步点赞和收藏的数据,我们就是采用定时任务来进行操作的。定时任务扫描到待同步的数据,扫描后,同步到数据库。
你还有什么想要问我的吗?
这个问题,鸡哥真的要给你们好好说一说,一定不要说没啥。在这个问题上,到这里就是面试的尾声了,你要体现的是自己的积极上进,意愿强烈,这些东西。说几个比较好的问题。
1、面试官,请问咱们这个部门的业务主要是做什么呢?ps:如果是网上能搜到的业务,你就不要在这重复问了,显得你不会收集信息。
2、面试官,请问咱们这个产品的并发和用户量有多少?平时技术挑战多吗?
3、面试官,通过这场面试,您觉得我应该在哪些方面进行继续的努力?
4、面试官,我觉得我十分想加入咱们公司,有哪些东西是我可以提前准备准备的?(ps 这个问题,hr 面,或者终面,觉得效果不错再问)

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值