当前位置:首页 > 科技  > 软件

阿里面试:看过框架源码吗?举例说明一下

来源: 责编: 时间:2023-11-10 09:15:52 380观看
导读前两天有朋友面试“淘汰集团”,也就是“淘宝”+“天猫”的组合,最后被面试官问到了这道题:“你看过哪些开源框架的源码?举例说明一下”。诚然,这是一道比较考验应聘者基本功的问题,也是很好区分“好学生”和“普通学生”的

前两天有朋友面试“淘汰集团”,也就是“淘宝”+“天猫”的组合,最后被面试官问到了这道题:“你看过哪些开源框架的源码?举例说明一下”。Fmi28资讯网——每日最新资讯28at.com

诚然,这是一道比较考验应聘者基本功的问题,也是很好区分“好学生”和“普通学生”的一道经典的开放性问题。Fmi28资讯网——每日最新资讯28at.com

那这个问题应该怎么回答呢?Fmi28资讯网——每日最新资讯28at.com

解答思路

我这给大家提供两个思路吧:Fmi28资讯网——每日最新资讯28at.com

  1. 可以回答比较常见的,你比较熟悉的源码,例如 Spring Boot 收到请求之后,执行流程的源码。
  2. 还可以回答 Spring Cloud 微服务中,某个组件执行的流程源码,这样能很好的体现你对微服务比较熟悉,因为微服务在公司中应用比较广泛,所以回答的好,是一个极大的加分项。

1.Spring Boot 源码分析

Spring Boot 在收到请求之后,会先执行前端控制器 DispatcherServlet,并调用其父类 FrameworkServlet 中的 service 方法,其核心源码如下:Fmi28资讯网——每日最新资讯28at.com

/** * Override the parent class implementation in order to intercept PATCH requests. */@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());    if (httpMethod == HttpMethod.PATCH || httpMethod == null) {        processRequest(request, response);    } else {        super.service(request, response);    }}

继续往下看,processRequest 实现源码如下:Fmi28资讯网——每日最新资讯28at.com

protected final void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 省略一堆初始化配置      try {       // 真正执行逻辑的方法       doService(request, response);   }   catch (ServletException | IOException ex) {       ...   }}

doService 实现源码如下:Fmi28资讯网——每日最新资讯28at.com

protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception;

doService 是抽象方法,由其之类 DispatcherServlet 来重写实现,其核心源码如下:Fmi28资讯网——每日最新资讯28at.com

@Overrideprotected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {    // 省略初始化过程...    try {        doDispatch(request, response);    }    finally {  // 省略其他...    }}

此时就进入到了 DispatcherServlet 中的 doDispatch 方法了:Fmi28资讯网——每日最新资讯28at.com

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {    // 获取原生请求    HttpServletRequest processedRequest = request;    // 获取Handler执行链    HandlerExecutionChain mappedHandler = null;    // 是否为文件上传请求, 默认为false    boolean multipartRequestParsed = false;    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);    try {        ModelAndView mv = null;        Exception dispatchException = null;        try {            // 检查是否为文件上传请求            processedRequest = checkMultipart(request);            multipartRequestParsed = (processedRequest != request);            // Determine handler for the current request.            // 获取能处理此请求的Handler            mappedHandler = getHandler(processedRequest);            if (mappedHandler == null) {                noHandlerFound(processedRequest, response);                return;            }            // Determine handler adapter for the current request.            // 获取适配器            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());            // Process last-modified header, if supported by the handler.            String method = request.getMethod();            boolean isGet = "GET".equals(method);            if (isGet || "HEAD".equals(method)) {                long lastModified = ha.getLastModified(request, mappedHandler.getHandler());                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {                    return;                }            }            // 执行拦截器(链)的前置处理            if (!mappedHandler.applyPreHandle(processedRequest, response)) {                return;            }            // 真正的执行对应方法            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());            if (asyncManager.isConcurrentHandlingStarted()) {                return;            }            applyDefaultViewName(processedRequest, mv);            mappedHandler.applyPostHandle(processedRequest, response, mv);        }        // 忽略其他...}

通过上述的源码我们可以看到,请求的核心代码都在 doDispatch 中,他里面包含的主要执行流程有以下这些:Fmi28资讯网——每日最新资讯28at.com

  1. 调用 HandlerExecutionChain 获取处理器:DispatcherServlet 首先调用 getHandler 方法,通过 HandlerMapping 获取请求对应的 HandlerExecutionChain 对象,包含了处理器方法和拦截器列表。
  2. 调用 HandlerAdapter 执行处理器方法:DispatcherServlet 使用 HandlerAdapter 来执行处理器方法。根据 HandlerExecutionChain 中的处理器方法类型不同,选择对应的 HandlerAdapter 进行处理。常用的适配器有 RequestMappingHandlerAdapter 和 HttpRequestHandlerAdapter。
  3. 解析请求参数:DispatcherServlet 调用 HandlerAdapter 的 handle 方法,解析请求参数,并将解析后的参数传递给处理器方法执行。
  4. 调用处理器方法:DispatcherServlet 通过反射机制调用处理器方法,执行业务逻辑。
  5. 处理拦截器:在调用处理器方法前后,DispatcherServlet 会调用拦截器的 preHandle 和 postHandle方法进行相应的处理。
  6. 渲染视图:处理器方法执行完成后,DispatcherServlet 会通过 ViewResolver 解析视图名称,找到对应的 View 对象,并将模型数据传递给 View 进行渲染。
  7. 生成响应:View 会将渲染后的视图内容生成响应数据。

2.Spring Cloud 源码

Spring Cloud 组件有很多,你可以挑一个源码实现比较简单的组件来讲,这里推荐 Spring Cloud LoadBalancer,因为其核心源码的实现比较简单。Fmi28资讯网——每日最新资讯28at.com

Spring Cloud LoadBalancer 中内置了两种负载均衡策略:Fmi28资讯网——每日最新资讯28at.com

  1. 轮询负载均衡策略
  2. 随机负载均衡策略

轮询负载均衡策略的核心实现源码如下:Fmi28资讯网——每日最新资讯28at.com

// ++i 去负数,得到一个正数值int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;// 正数值和服务实例个数取余 -> 实现轮询ServiceInstance instance = (ServiceInstance)instances.get(pos % instances.size());// 将实例返回给调用者return new DefaultResponse(instance);

随机负载均衡策略的核心实现源码如下:Fmi28资讯网——每日最新资讯28at.com

// 通过 ThreadLocalRandom 获取一个随机数,最大值为服务实例的个数int index = ThreadLocalRandom.current().nextInt(instances.size());// 得到实例ServiceInstance instance = (ServiceInstance)instances.get(index);// 返回return new DefaultResponse(instance);

小结

开源框架的源码在面试中经常会被问到,但只因如此,就去完整的看某个框架的源码,其实还是挺难的。第一,框架中的源码很多,很难一次性看懂。第二,即使能看懂,看完之后也会很快忘记(因为内容太多了)。此时,不如挑一些框架中的经典实现源码来看,其性价比更高,既能学到框架中的精髓,又能搞定面试,是一个不错的选择。Fmi28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-19925-0.html阿里面试:看过框架源码吗?举例说明一下

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十个使用Spring Cloud和Java创建微服务的实践案例

下一篇: ​Gorm 中的钩子和回调

标签:
  • 热门焦点
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的“头腾
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top