精选

【API 开放平台】面经 By fengling


自我介绍


大家好,我是一个二本的学生,今年四月加入星球,6月跟着星球学习。8.21在星球嘉宾“苍何”大哥的建议下开始投简历,一个星期后,陆续有约了一些线上面试,之前有约下线,但是我不想去线下,基本上也是小公司,我针对这几次的中小厂面试情况,总结一下某厂的面试题以及面试经验。


项目目前的情况是:API项目几乎必问,BI几乎不问。



API项目流程介绍


项目分为多个子模块:

  1. api-backend:完成用户管理,接口管理,接口在线调用等相关功能。
  2. api-gateway:实现路由转发、访问控制、用户鉴权、流量染色,并统一完成登录校验,API签名校验,接口统计以及请求和响应日志的处理。
  3. api-interface:提供请求的真实接口功能。
  4. api-common:统一抽取的公共实体、接口。

启动nacos、 backend、gateway、interface,sdkClient 和 common需要提前在本地install。

先在backend项目中调用对应的 interfaceInfo/invoke 方法,校验参数、判断接口id是否存在、是否关闭等,然后获取到当前登录用户,并查出对应的accessKey和secretKey,并以此作为参数创建SDK客户端对象,然后把刚才参数中的userRequestParams通过Gson 库将 JSON 字符串反序列化为 Java 对象,SDK客户端封装一系列请求参数,使用hutool工具包,将请求发送给gateway网关项目。

在网关项目中,在全局过滤中,我们先获取请求头上的一系列信息,包括“请求参数、路径、方法、来源地址”等,并通过获取请求头中特定信息实现流量染色。该部分设置了黑白名单,只允许IP地址为当前服务器的请求通过,然后我们再做鉴权,通过传入的accessKey去找出对应的用户,并且对请求的时间等作校验,再通过accessKey查出来的用户,进一步得到对应的secretKey。与此同时,我们还需要对得到的path和method所对应的接口进行查询,判断是否存在,如果不存在则抛出指定的异常。最后,如果上述校验都没问题,那么我们认为这个请求是合法的,通过一个返回结果处理器handleResponse,将用户和接口对应表 user_interface_info 中的用户的剩余接口调用次数等字段进行更新操作,结束后完成业务流程。

在上面的过程中,我提到了“鉴权、校验、查询用户、查询secretKey”等操作,这些操作对应的代码是在backend项目中,如果我们直接把对应的代码放到gateway项目,势必会增加项目的复杂度以及冗余等。所以我想到了使用Dubbo这样一个RPC框架,通过@EnableDubbo、@DubboReference、@DubboService等注解,配置相应的yml属性,并以Nacos作为服务的注册中心,实现了远程业务代码的调用。

此外项目还使用了sentinel对主要接口进行熔断和限流。



某中厂

一面(被面试官拷打)


  1. 自我介绍
  2. 讲讲api项目
  3. 为什么不用feign直接去封装SDK的接口?
  4. 我现在希望你换个方式实现SDK:如果接口用feign,并且把签名、异常、日志都加进去,你会怎么去做SDK?
  5. 提示:异常是在哪儿做的,处理过后对吧?日志是在调用前后做的对吧?你觉得这像什么?(像把饭喂到嘴边,哈哈哈)
  6. 回答:Spring AOP,然后讲述了一下Spring AOP。但还是不知道怎么做,已经吓傻...
  7. 面试官:没事,这个问题不用纠结,你以后就会了。
  8. redis 实现分布式session的原理是什么?
  9. cookie和session如何保证会话的一致性?
  10. 不太懂意思
  11. 面试官:就是说我去请求 接口,我怎么知道是这个人而不是别人?我怎么定义到别的方面去,保持后端可以 识别出来这个人是谁?
  12. 回答cookie怎么存储的,session怎么存的,反正讲了自己对cookie和session的理解,不至于什么也不说。
  13. 你是看文档看的dubbo文档学习的对吧?你注册中心是用的nacos对吧?怎么做的?
  14. redis用过吗?用了什么数据结构?(疯狂输出)
  15. 你现在是在学校吗?在哪个城市?
  16. 你为什么要来公司所在的城市?


二面(问的不难,总体不错)


  1. 自我介绍
  2. 项目是自学的吗还是?
  3. 为什么要做API开放平台?
  4. 项目模块和特性都是自己设计的吗?
  5. 你觉得整个API开发过程比较难的点是什么?
  6. sentinel限流工具是你自己本地搭的吗?
  7. 你本地启动redis或者sentinel的过程是什么样的,配置怎么调的?
  8. hashmap数据结构?为什么要把链表转红黑树?有什么优点?
  9. synchronize关键的实现原理?(唯一一个完全忘记了的)
  10. Java里面常用的线程池有哪些?
  11. MySQL在InnoDB引擎里面,常用的索引类型哪些?
  12. 索引所用的数据结构是什么?
  13. 你觉得可以用二叉树来实现索引吗?
  14. 聊岗位位置
  15. 聊职业规划
  16. 反问:咱们公司的转正规则
  17. 反问:咱们公司的技术栈、业务
  18. 最后:面试官说面下来感觉比较好,并给我提了一点学习建议


HR面


今天中午HR视频面:自我介绍、聊在校经历、聊竞赛经历、聊入职公司这块儿的时间等简单问题、聊职业规划等。我认为主要是考察性格和语言表达能力。HR对我的感觉比较好,说下周一发Offer,但是要补个笔试,说之前面试官们给搞忘了。(然后下午接到消息说不用补了?啥情况呢,我的算法白刷了?)



0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
提问广大鱼友们: 本人今天第一次面试,面了一个实习岗!!!(女面试官) 我把api项目讲的很好,并且聊了可能挺久的,然后但是总整个过程就我一个人在讲述,不过我把他讲的很清楚。 然后完了就随便问了几个问题: spring boot和spring cloud有啥关系,就简单介绍一下。 然后问了一下JAVA的面向对象的三个特点。 然后问了一下Redis的问题,就是说怎么理解的,怎么使用的? 然后最后问了简单的一个联表查询和一个分组查询买的。 问了下来感觉面试官对我的印象比较好,整个过程也是比较轻快的,我问了一下面试官对我的感觉怎么样,他说嗯,总体还不错,然后回答的也挺流利的,知识面也还可以。这种情况是不是稳了呀,兄弟们?
19
提问星球小伙伴们[可怜]: 大家最近的面试是线上多还是线下多呢? 如果收到了小厂offer,但是自己有更好的选择,大家是怎么拒offer的呢? 线上实习可行吗?
12
## 整理了一点儿关于 API 开放平台后端部署 的笔记 前两天看到有个关于API开放平台的精选文章(作者昵称:哒 ),他将项目改造了微服务架构,我看了一下他的项目结构,结合以前学习微服务里面的父子pom,把项目重构为多模块。然后参照着他的部署流程,在其他同学的还有鱼皮哥的帮助下,上线了后端。 我主要使用的工具是Xftp、Xshell、阿里云控制台、宝塔。(大佬们的基本上都是容器化部署)   其实主要是backend、gateway、interface三个jar包,然后就是部署nacos,去网上下载linux对应版本的nacos解压即可。我的是小服务器(2核2G),所以启动的时候调了jvm参数才跑起来的。中间服务器崩了很多次,主要是因为跑了太多服务器,控制台的IO基本上满了,通过ps -ef | grep java查看java相关的进场,参数没调好就kill -9 id杀进程,不断调试。如果项目启动出了问题或者你需要调试,接提前在代码中写log(),然后去服务器的日志里面查看。
4
今天上线了api后端,2核2g的服务器把这个上线了基本上就不能再开别的服务了[流泪]踩了好多坑,累了
1
《中国大学生计算机设计大赛》应用与开发组 "国二省一" 备赛心得
27
下载 APP