前言
项目可以说是我们面试环节中最重要的部分了,从面试官的角度出发,他需要了解你是否真的参与过这个项目,在这个项目中做了哪些工作,有没有什么亮眼的设计。从应聘者的角度出发,我们需要用尽量简洁的话语向面试官展示我们项目的目标、数据、总体设计、自己负责的工作已经点睛之笔在哪里。下面我将以一个例子来展示如何博得面试官的好感。
正文
面试官:介绍一下你的项目吧
介绍项目要讲究章法,不能一通乱讲,讲完了连自己都不知道自己在讲什么。那么要怎么讲呢?首先,介绍项目的背景和目的,然后,介绍项目的数据来源,然后介绍项目的整体架构,即项目整体分为哪几个模块,分别是做什么的。最后,介绍自己负责的工作。举个例子:
项目背景和目的: XX公司与XX大学成立校企联创实验室,开展大数据分析项目的应用研究及建立数据融合平台,主要目的是利用大数据分析模型支撑企业决策分析,同时对企业各类资源进行统计分析,推动企业数字化转型;
数据来源: 从公司各个业务系统中抽取关联数据(所有数据均以离线方式存储在本地服务器)
数据量:200w条
主要包含哪些数据:设备信息:设备id,型号,购买时间,负责人等等。人员信息:员工id,员工姓名,性别,联系方式等等。
项目整体模块设计:整个项目分为3个主要模块,第一是我们的主体web模块,主要管理一些结构型数据,还包括报告生成、模型预测等。第二是文件管理模块,因为公司那边还会给我们上传一些视频、图片等非结构化的多媒体数据。为了存储非结构数据,我们设计了一个文件管理子系统,这个子系统上传成功非结构化数据后,会给我们返回一个url地址和对应的id。第三是数据同步模块,负责对于数据的导入和同步工作,然后导入到我们这边之后还要同步到相应的下属部门。
我的主要工作:我主要负责项目微服务部分的架构设计和开发,数据库的建模设计、已经数据同步子模块的设计开发。架构设计使用的是dubbo,用来做服务解耦。数据库的引擎是Innodb,库表结构是这样设计的:xxx,然后索引是这样设计的:xxx。数据同步模块我使用了netty来做一个数据传输通道,主实现方式是这样的:xxx。
注: 主要工作这块自己要理解透彻,不仅要知道怎么做的,还要知道为什么要这么做,比如面试官会问你,为什么要选dubbo来做微服务的框架,而不用别的?很多问题要自己先去查,面试时才不至于慌乱。举个例子:
面试官:你这块为什么要用dubbo,是出于什么样的考虑?
这里我们首先要讲一下为什么要用微服务,然后讲dubbo的优点。
答:先讲一下为什么使用微服务的方式吧,我们的这个系统之前也是使用单体的架构对外提供服务的,但是有一次我们一个同学把修改了一个服务的代码,他当时测试的时候这个服务是没有问题的,但是第二天我们给领导演示的时候因为这个服务的改动影响到了其他服务,导致有些服务崩溃了,演示完之后我们老板很生气,把我们痛骂了一顿,然后我们决定对这个项目进行重构,使用微服务的方式,将各个业务剥离出来,形成各自的服务,实现一个服务解耦的模式。
负责人当时熟悉dubbo,用的比较熟,而且项目当时催的比较紧,没有时间学习新的知识,负责人就决定用dubbo了。
Dubbo的优点:
1、使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
2、分布式架构可以承受更大规模的并发流量。
面试官:那dubbo 的服务调用过程你讲一下
答:在服务消费者启动的时候,会根据自己的配置从注册中心上去订阅服务,然后存到自己本地的服务目录里边,相当于缓存。然后调用服务的时候,直接从自己的服务目录里面拿,将自己的请求参数,如服务名(接口名)、方法名、方法参数、方法返回值值等参数,装到一个invoke对象里边;服务提供者根据服务名与方法名还有方法参数列表唯一确定所要调用的是哪个服务,确定后去调用服务,最后将结果封装成响应数据包返回。在真正源码实现中,是用DubboNameSpaceHandler类解析dubbo:Reference标签,最终解析成一个ReferenceBean对象,调用它的getObject方法,并且会将配置封装成一个Map对象最终,调用createProxy(),最终获得一个服务实现类的代理对象;这个方法里面用proxyFactory代理工厂来创建代理类;但是如果没有配置的话,则默认采用javasist的proxyFactory;如果指定了用jdk的,则用jdk的proxyFactory来创建代理类;而实际上这个代理类是对invoke对象的再一次封装,服务消费者通过代理对象进行服务调用,而代理对象实则是通过invoke对象调用服务提供者对应的服务;这样的话在程序开发者来说好像是调用了自己的服务一样,在代码编写的过程中不必考虑这些问题而是更专注于主体业务逻辑的设计和开发。
Dubbo的负载均衡实在服务消费端完成的。将符合当前所要调用的所有已有服务全部封装成Invoke对象,以list的方式传递给select方法,select方法更具负载均衡策略最后计算出一个作为结果返回。
面试官:dubbo支持哪些协议,你们用的是哪一种?
答:dubbo://(推荐)1、dubbo 协议 (默认)2、rmi 协议3、hessian 协议4、http 协议5、webservice 协议6、thrift 协议7、memcached 协议8、redis 协议。
我们使用的是默认的dubbo协议,因为它足够支持我们的业务场景。
数据库的库表结构设计以及数据同步子模块的设计介绍方式是一样的,对面试官可能问到的点要先想好怎么回答,不要等着临时想。
注: 面试时面试官通常会对高并发、微服务这些工作中比较常见的场景感兴趣,如果项目中有用到,那么一定要回答好,这里很加分。