
【API 开放平台】面经 By fengling
自我介绍
大家好,我是一个二本的学生,今年四月加入星球,6月跟着星球学习。8.21在星球嘉宾“苍何”大哥的建议下开始投简历,一个星期后,陆续有约了一些线上面试,之前有约下线,但是我不想去线下,基本上也是小公司,我针对这几次的中小厂面试情况,总结一下某厂的面试题以及面试经验。
项目目前的情况是:API项目几乎必问,BI几乎不问。
API项目流程介绍
项目分为多个子模块:
- api-backend:完成用户管理,接口管理,接口在线调用等相关功能。
- api-gateway:实现路由转发、访问控制、用户鉴权、流量染色,并统一完成登录校验,API签名校验,接口统计以及请求和响应日志的处理。
- api-interface:提供请求的真实接口功能。
- 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对主要接口进行熔断和限流。
某中厂
一面(被面试官拷打)
- 自我介绍
- 讲讲api项目
- 为什么不用feign直接去封装SDK的接口?
- 我现在希望你换个方式实现SDK:如果接口用feign,并且把签名、异常、日志都加进去,你会怎么去做SDK?
- 提示:异常是在哪儿做的,处理过后对吧?日志是在调用前后做的对吧?你觉得这像什么?(像把饭喂到嘴边,哈哈哈)
- 回答:Spring AOP,然后讲述了一下Spring AOP。但还是不知道怎么做,已经吓傻...
- 面试官:没事,这个问题不用纠结,你以后就会了。
- redis 实现分布式session的原理是什么?
- cookie和session如何保证会话的一致性?
- 不太懂意思
- 面试官:就是说我去请求 接口,我怎么知道是这个人而不是别人?我怎么定义到别的方面去,保持后端可以 识别出来这个人是谁?
- 回答cookie怎么存储的,session怎么存的,反正讲了自己对cookie和session的理解,不至于什么也不说。
- 你是看文档看的dubbo文档学习的对吧?你注册中心是用的nacos对吧?怎么做的?
- redis用过吗?用了什么数据结构?(疯狂输出)
- 你现在是在学校吗?在哪个城市?
- 你为什么要来公司所在的城市?
二面(问的不难,总体不错)
- 自我介绍
- 项目是自学的吗还是?
- 为什么要做API开放平台?
- 项目模块和特性都是自己设计的吗?
- 你觉得整个API开发过程比较难的点是什么?
- sentinel限流工具是你自己本地搭的吗?
- 你本地启动redis或者sentinel的过程是什么样的,配置怎么调的?
- hashmap数据结构?为什么要把链表转红黑树?有什么优点?
- synchronize关键的实现原理?(唯一一个完全忘记了的)
- Java里面常用的线程池有哪些?
- MySQL在InnoDB引擎里面,常用的索引类型哪些?
- 索引所用的数据结构是什么?
- 你觉得可以用二叉树来实现索引吗?
- 聊岗位位置
- 聊职业规划
- 反问:咱们公司的转正规则
- 反问:咱们公司的技术栈、业务
- 最后:面试官说面下来感觉比较好,并给我提了一点学习建议
HR面
今天中午HR视频面:自我介绍、聊在校经历、聊竞赛经历、聊入职公司这块儿的时间等简单问题、聊职业规划等。我认为主要是考察性格和语言表达能力。HR对我的感觉比较好,说下周一发Offer,但是要补个笔试,说之前面试官们给搞忘了。(然后下午接到消息说不用补了?啥情况呢,我的算法白刷了?)
