1.项目周期?
答:传智所学项目的业务逻辑不够复杂,模块也不多,所以建议项目周期为5-8个月。
2.项目团队有多少人,如何分配的?
答:项目团队一般由6-10个人组成,4-5个人是java后台的,1-2个是前端,2个产品。
3.在项目中充当什么样的角色?
答:在项目中的职位是组员或者组长,主要负责开发功能模块,后期配合测试修改bug。
看工作时间与入职的时间,在一家公司入职时间少于1年并且从事开发少于2年很少有机会担任小组领导
4.项目中遇到的最大的问题是什么?
答:这种问题不要说一般的错误,尽量说业务上的问题。例如:单点登录的时候如何解决多系统之间用户登录信息同步以及用户信息共享;登录需要发送短信验证码的时候如何保证消息到达率是100%;如何实现redis与数据库信息同步;开发环境程序正常,生产环境程序bug
等。
5.如何保证所负责与需求相符合?
答:在做模块之前,与产品经理确定好需求,再与项目负责人确定好技术选型应用,在开发过程中遇到业务问题与产品经理和项目负责人及时沟通。
6.你觉得做商品模块(首页展示、轮播图、购物车、单点登录、订单)时的难点在哪里?
答:商品模块:添加或者修改商品时,数据库、redis、静态页面如何同步信息。
购物车:添加的商品数量与库存数量的对比。商品价格变动同步。购物车的存储。
单点登录:如何进行多系统之间的信息交互。(主要指验证登录信息 )子系统如何保证登录信息的安全。
订单:商品数量与库存的同步,商品价格的准确性。提交订单的方式,如何验证订单。
7.所负责模块里有哪些功能?(不要上来就说增删改查)
答:商品模块的功能:添加商品时,商品图片的上传以及存储,商品价格确保准确性,商品的上下架。也可以简单介绍下查询的各种条件或删除的各种条件。以及商品信息同步(数据库、redis、静态页面等),商品id的生成规则。
8.在项目开发过程中遇到不会的功能是如何处理的?
答:技术问题:首先是谷歌,在网上查看各种资料以及博客。其次是与同事交流。最后再去找领导。
业务问题:业务问题首先找经理沟通,技术问题首先google百度
9.项目中前台与后台是如何进行数据交互的?
答:ajax,http请求,socket。
10.如何实现数据库与redis同步?
答:用消息队列mq实现。具体操作是在添加或者修改数据的时候,用mq来同步到数据库与redis,加上事务,确保reids与数据库数据一致。
11.在项目开发过程中还有哪些工作内容?
答:与项目经理去客户公司确定用户需求,与同事配合完成单元测试,与测试人员配合完成测试并修改bug,bug提交
12.项目共有多少张表?所做模块用到多少张表?表与表之间的关系?
答:180-220(选一个具体数值)。
商品模块:商品表,库存表,品牌表,分类表,商品详情表,规格表,图片表,商品排序表,商品筛选表,图片资源类型表,图片资源表,商品日志表,晒单图片说明表。
购物车:商品表,品牌表,分类表,库存表,用户表,库房表,购物车表,购物项表,优惠券表,商品推荐表。
订单:订单表,用户表,用户地址表,商品表,品牌表,分类表,库存表,库房表,地区表,物流信息表。
登录(后台):用户表,权限表,角色表,用户角色表,权限角色表,日志表。
13.插入商品的话,要求级联插入几张表,你们当时是怎么实现的?
答:商品表,商品详情表,库存表,图片表,日志表。
14.项目中用的注解开发还是手动注入?分别如何实现?为什么?
答:注解开发,在类、属性、方法上写注解。因为项目中需要配置的太多,用注解可以简化开发。
15.错误日志的处理?项目中的日志文件存在哪里?保存多长时间?
答:看日志大小存放, 一般是15天或者30天。存放在一个单独的服务器目录。
16.生产环境与开发环境在上线部署的时候应该如何配置?
答:生产环境:
1、上线之前备份之前的项目
2、修改上线项目的相关配置
3、关停服务
4、替换之前的项目
5、启动服务,观察日志,是否异常
17.开发时数据库中数据从哪来?数据量有多大?
答:开发时数据库数据部分来自客户或者运营,部分自己添加,部分来自网络爬虫扒的数据。
18.如何保证库存?
答:用mq+redis。
19.如果日志存储量过大如何处理?
答:定期清除日志,日志一般存放在另一台服务器上,15-30天清理一次。
20.在项目开发过程中如何进行测试?压力测试如何做?
答:对自己所负责模块进行单元测试,然后交给公司测试人员进行测试。一般压力测试都是测试人员做,Visual Studio 自带的工具,还有Loader Runner(LR),轻量级的工具有Apache项目中的ApacheBench。
21.项目的并发量有多大?用了多少台服务器?
答:并发量500-1000,服务器数量一般是10-20台左右,具体数量看图
22.在项目中,是如何分配开发任务的?
答:开会时,由项目经理与组长分配到个人需要负责开发的功能模块。
23.项目中的技术选型的依据是什么?
答:1.什么技术更适合当前项目的业务需求,例如互联网项目查询条件比较多,数据库框架选用mybatis;传统项目查询条件比较单一,选用hibernate比较合适。
2.如果两个技术都适用于项目,就看架构师更熟悉哪个技术,因为如果大部分开发人员都不会,企业会负担很高的学习成本。
24.项目的安全问题是如何解决的?
答:单点登录用token来校验。或者可以说有专门负责项目安全的人员。或者说花钱买服务。
环境安全:初期通过购买云服务
程序安全;token +签名
25.用户分为几种?每种所对应的权限?权限具体是如何实现的?
答:一般后天项目中普通用户、普通管理员、超级管理员。用shiro框架具体实现。
普通用户:访问。普通管理员:管理后台信息。超级管理员:所有权限。
26.电商项目是否上线?用户量有多少?
答:可以说上线(找一个地方性的小型电商网站)或者测试没有完成,项目还没有上线。可以说用户量有日活量:几千。
27.商品的属性是如何进行存储的?
答:需要存储到商品表,商品详情表,库存表,日志表等。
28.工作之余有没有在研究一些流行的技术?
答:有,再看一些技术博客。比如说跨域,如何解决高并发,不同系统之间的通信。
29.在项目中如何实现页面跳转并把当前页面数据传递到跳转页面?
答:把要传递的数据放在request域中(转发)。
30.所负责模块的查询都有那些条件?那些是静态条件、哪些是动态条件?
答:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女,商品名称。
静态条件:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女
动态条件:商品名称,商品类型
31.所负责模块中删除数据的时候直接删除就可以么?如果不是需要做哪些操作?
答:如果单表的可以进行逻辑删除,不会进行物理删除。级联删除,删除该条数据不影响到其他表中的数据就可以直接删除,否则要进行级联删除,这里也是指的逻辑删除。
32.支付是如何做的?
答:与支付宝、微信对接,下载它们两个的SDK(jar包),需要配置公钥与私钥,进行对接,根据官方文档的API,调用相关支付的借口,接收回调信息(成功或失败)。进一步做自己的业务逻辑操作。
33.表是如何设计的?
答:可以说是项目经理或者架构师设计的。自己所负责模块可以根据项目需求来设计有哪些字段,需要关联到哪些表。尽量推行单表设计,不定义外键约束。
34.面向服务通过什么样的方式实现?
答:soa架构,表现层与服务层分离,用dubbo和zookeeper搭配完成。
35.如何提高代码质量?在项目中如何优化代码?
答:尽量减少不必要的操作,尽量不要用到三层以上的for循环与递归。写代码的时候要给关键代码写上注释。相同功能的代码进行抽取,抽取原则不影响功能的正常运行。
36.商品的审核如何做的?
答:添加或者修改,商品的价格以及库存等重要信息要进行二次填写,以保证准确率。
前台js校验,后台java代码校验。
37.在项目中如何调试bug?
答:1.以dug方式运行项目,打断点调试。2.查看项目中的错误日志。3.测试人员使用专业测试工具进行测试。4.运行脚本对代码进行测试。
38.查询商品的时候如果redis没有数据,可以抛异常么?如果不可以如何做?
答:不可以用throws抛异常,可以用trycatch捕获异常。因为在redis中查询不到数据,还要对数据库进行查询,如果throws抛异常则不能按正常业务运行。
39.购物车如何实现的?未登录可以用购物车么?购物车的存储?
答:购物车有三种。1.存放在Cookie。2.放在缓存里面。3.放到数据库里面。
未登录的时候可以放在cookie中,但是有的电商网站针对未登录用户不提供购物车功能。(例如天猫、淘宝添加商品到购物车的时候必须先登录)
40.购物车里面商品种类可以无限添加么?同一种商品的数量有限制么?
答:不可以,京东最多只可以添加八十种(足够使用了),避免占用太多存储空间;商品数量根据商品类型来控制,一般不超过200种。
41.如果库存数量少于购物车用户添加的数量如何处理?
答:每次用户访问购物车的时候,都发送ajax请求查询一遍redis或者数据库,如果存库数量少于购物车中商品数量,发送消息进行提示,并做相应修改。
42.生成订单具备的条件?如何保证这些条件?
答:商品数量不能超过限制数量和库存数量。限制数量在前台用js校验,后台查询数据库校验库存。
43.首页展示的轮播图,在页面中是如何存放的?在数据库中是如何存放的?
答:页面中存放的是图片地址,在数据库中存放的也是图片的地址。图片存放在另一台服务器上面。
44.用户地址是如何保存实现的?(具体)
答:用户的地址是单独存放在一张数据库表中的,需要绑定用户的id,还需要设置默认路径。
45.在电商项目中如何针对不同的用户做推送?
答:对用户的浏览内容做一下记录,然后在页面的下方或者右方做商品的推送。还有一种就是针对用户购物车或者关注商品做促销信息推送。
46.如何迁移数据库(mysql)?
答:这里介绍的是mysql数据库,如果被问到其他的可以说只知道mysql的。
1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入。
2.使用【MySQL GUI Tools】中的 MySQLMigrationTool。
3.数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。
我在我的电脑上用虚拟机测试后,选中了占用时间最少的第三种方案。下面是三种方案的对比:第一种方案的优点:会重建数据文件,减少数据文件的占用空间。
第一种方案的缺点:时间占用长。(导入导出都需要很长的时间,并且导出后的文件还要经过网络传输,也要占用一定的时间。)
第二种方案的优点:设置完成后传输无人值守
第二种方案的缺点:设置繁琐。传输中网络出现异常,不能及时的被发现,并且会一直停留在数据传输的状态不能被停止,如不仔细观察不会被发现异常。 传输相对其他fang时间长。 异常后很难从异常的位置继续传输。
第三种方案的优点:时间占用短,文件可断点传输。操作步骤少。(绝大部分时间都是在文件的网络传输)
第三种方案的缺点:可能引起未知问题,暂时未发现。
47.服务器宕机如何处理?全部宕机如何处理?
答:配置主从服务器,运维人员搭建集群后,从服务器会给主服务器发送信息,如果主服务器没有响应,那就启用从服务器。一般不会全部宕机,如果全部挂掉,就重启。
48.一件商品只有2件,现在被他人购买一件,这边如何修改当前用户的商品信息?
答:这个考察的是对库存的安全校验。商品上架多少 库存 讲库存缓存在redis 中 下单 就在redis 减少,异步 在库存数据库中也减少商品 查询只查询redis 中的 商品库存更新后 更新redis 库存;在用户点击添加到购物车按钮时,发送ajax查询redis。
dubbo服务开发流程,运行流程?zookeeper注册中心的作用?端口是多少?
答:dubbo主要是发布服务和调用服务。
使用流程:
第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。
第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。
49.******消息中间件acitveMQ的作用、原理?几种模式,每种的特点及使用问题?MQ发送消息失败怎么办?
答:Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。
Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢失的。如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。
50.Tomcat集群中怎么实现共享
答:用dubbo与zookeeper配合来实现tomcat共享。
1,tomcat自身提供的session集群共享
2,编写tomcat的session插件对session进行存储
3,使用javaweb规范中的filter对request对象的getSessio()进行拦截替换实现集群共享
51.前台做过静态页面么?Freemark如何生成静态页面?生成模板的命令?
答:做过。
第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
第二步:设置模板文件所在的路径。
第三步:设置模板文件使用的字符集。一般就是utf-8.
第四步:加载一个模板,创建一个模板对象。
第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
第七步:调用模板对象的process方法输出文件。
第八步:关闭流。
@Test public void genFile() throws Exception { // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。 Configuration configuration = new Configuration(Configuration.getVersion()); // 第二步:设置模板文件所在的路径。 configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl")); // 第三步:设置模板文件使用的字符集。一般就是utf-8. configuration.setDefaultEncoding("utf-8"); // 第四步:加载一个模板,创建一个模板对象。 Template template = configuration.getTemplate("hello.ftl"); // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。 Map dataModel = new HashMap<>(); //向数据集中添加数据 dataModel.put("hello", "this is my first freemarker test."); // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。 Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html")); // 第七步:调用模板对象的process方法输出文件。 template.process(dataModel, out); // 第八步:关闭流。 out.close(); } |
52.什么是存储过程?好处?
答:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
好处:1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。
53.Shiro如何进行权限控制?
答:1.通过浏览器访问路径,配置文件查看,是否需要认证等,如果不需要,直接访问controller
2.如果需要认证,通过配置文件的loginUrl,跳到这个地址,输入用户名、密码等
3.登录:1.访问自定义的form表单过滤器FormAuthenticationFilter(自己起的名字和shiro一样了,所以。。)的createToken方法,装配token;如果没有自定义表单过滤器,默认的FormAuthenticationFilter会自动装配表单token2.访问自定义realms的认证方法doGetAuthenticationInfo(),查库(或者缓存),判断用户名和密码是否正确。
4.如果登录之后访问的url,通过配置文件里的配置需要权限:调用自定义realms的授权方法:doGetAuthorizationInfo(),查库(或者缓存),查出用户权限,判断是否拥有权限,没权访问,跳到响应的refuse配置的路径,有权访问,跳到响应的url
54.solr的原理?分词器的原理?如何设置高亮显示?
答:Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据一定的规则拆分成若干个关键词,然后根据关键词创建索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展示给用户的过程。
IK分析器的分词原理本质上是词典分词。现在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。
55.秒杀功能能否与正常的商品购买放在同一台服务器上?
答:可以,但是尽量不要这么做。因为秒杀商品,抢购的用户会比较多,并发量过高容易引起宕机,导致正常购买商品功能也不能正常使用,所以建议放在不同服务器上。
56.redis是内存数据库,如果宕机了,如何解决数据丢失的问题?
答:方案一:redis拥有两种不同形式的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操作既可以在“指定时间段内有指定数量的写操作执行”这一条件被满足时执行,又可以通过条用两条转储到硬盘中命令中的任何一条来执行;第二种持久化方法将所有修改了数据库的命令都写入一个只追加文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步、每秒同步一次或者每写入一个命令就同步一次。
方案二:使用redis集群。Redis实现了主从复制的特性:执行复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本;之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。
57.商品存入数据库怎么保证数据库数据安全?
答:设置后台用户的权限,并对数据库修改做好记录(日志),保证责任到人。
58.项目中商品小图片点开后,单品页面是大图片,这些图片是如何处理的?
答:在小图片上设置连接,点击小图片后,加载大图片。
62.项目中的网络安全是怎么做的?
答:设置防火墙,买服务。
63.solr优化怎么实现?
答:http://blog.csdn.net/kuyuyingzi/article/details/17651451
64concurrent这个包有什么特性?
答:http://blog.csdn.net/defonds/article/details/44021605/