java面试题saas

第1天

技能

1. 能够使用maven分模块构建项目
2. 可以使用pd绘制用例图

面试题

maven的作用是什么?

    依赖管理:对jar包的管理
    一键构建:通过一个命令来完成项目的构建过程

maven的常见命令有哪些? 每个命令对应的作用是什么?

	清理  clean    清理上一次构建过程产生的文件,就是把target目录删除清理掉
	编译  compile  将正式的java文件,也就是对main目录下的java文件编译 
	测试  test     编译并执行test下的文件
	打包  package  将正式的文件打包
	安装  install  将打好的包放入到本地仓库
	部署  deploy   将打好的包放入到私服

maven有几套生命周期? 每套生命周期中分别由哪些主要命令?同一套生命周期中的命令有什么特点?

1. maven有三套生命周期
2. 生命周期中的命令分别是:
	Clean Lifecycle:在真正的构建之前进行一些清理工作
		包含的命令有:pre-clean   clean   post-clean
	Default Lifecycle:构建的核心部分
		包含的命令有:compile  test  package  install  deploy 
	Site Lifecycle:生成项目报告,站点,发布站点。
		包含的命令有:pre-site   site   post-site   site-deploy  
3. 位于同一个生命周期中的命令的执行特点: 执行后面的命令,前面的命令会自动执行

maven有几种仓库? 他们之间的调用关系是什么? 哪种仓库是必不可少的?

1. maven有三种仓库:
	本地仓库  位于开发者电脑
	远程仓库  位于公司内网服务器
	中央仓库  位于公网
2. 调用顺序:
	1.如果有私服:   程序-->本地仓库-->私服-->中央仓库
	2.如果没有私服:  程序--<本地仓库---->中央仓库
3. 本地仓库是必须要有的

在maven中, 一个jar包使用哪几个标签表示? maven的打包方式有几种?

1. 一个jar包的标签,主要有三部分组成:
	1. groupId: 用于标识当前程序的所属公司, 一般为公司域名倒过来写
	2. artifactId: 用于标识当前项目名称
	3. version: 用于标识当前项目版本
2. maven打包一般有三种:
	jar: java工程
	war: web工程
	pom: 父工程

什么是maven的依赖冲突? 有几种解决方案?

1. maven在依赖传递的过程中,有可能会同时依赖到jar包的多个版本,这样的话会出现版本冲突问题
2. 解决方案有4种:
	第一声明优先原则: 在pom文件定义依赖,先声明的依赖为准
	路径近者优先原则: 从依赖程序开始算起,到被依赖的程序,以路径短的为准
	依赖排除: 在依赖引入的过程中, 通过exclusions标签排掉指定的跟随依赖
	版本锁定: 直接锁定版本来确定依赖构件的版本(经常在企业中用)

什么是SaaS平台? 它的优点是什么?

1.  SaaS, 就是软件即服务的意思,它是一种通过因特提供软件的模式
    厂商将软件统一部署在自己的服务器上,客户可以根据自己实际情况告诉厂商自己需要什么提供什么样的服务并且按照服务的多少来支付费用
    也就是说:用户购买的是基于web的软件服务,而不是购买来软件,然后将软件安装在自己的电脑上用

2. SaaS优点:
	1:能够降低企业的成本,按需要购买,不需要关注软件的开发与维护
	2:由于SaaS部署在云端,软件迭代更新速度加快
	3:支持远程办公:将数据存储到云端后,用户可以通过Internet访问其信息

第2天

技能

1. 能够搞清楚项目中每个模块的作用
2. 能够使用AdmintLTE实现前端页面搭建
3. 能够搞清楚一套增删改查中对应的后台方法有几个\每个方法执行完毕应该是转发(重定向)到什么地址
4. 能够使用PageHelper插件进行数据的分页操作

面试题

全局异常处理器配置有几种方式? 如果使用注解的话,用到的注解是哪几个? 如何在一个类中处理多个异常?

1. 全局处理异常有两种方式:
    一种是我们自己自定义一个异常处理器类来实现HandelrExceptionResolver接口,并在类中实现异常的处理方法
    另一种是注解方式,需要我们自定义一个普通类,并在类上标注@ControllerAdvice注解, 然后在类中实现异常处理的方法,并在方法上标注@ExceptionHandler注解。
2. 使用注解的方式来处理全局异常的话,主要用到的是两个注解
    @ControllerAdvice注解标注在类上,标识这是一个异常处理器的类
    @ExceptionHandler注解标注在异常处理器类中的方法上, 可以用于指定被标注的方法用于处理哪一类异常
3. @ExceptionHandler注解支持一个value属性, 可以用它来定义被标注方法能够处理的异常类型
    我们只需要在异常处理类中定义多个异常处理的方法,然后每个方法上面使用@ExceptionHandler指定具体处理的异常类型即可

谈一谈PageHelper的分页原理

    首先,pagehelper将前台传来的参数封装到page的对象中,接着将page的副本存放入ThreadLoacl中,这样应该是保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,最后再次赋值给下一步操作,就实现了分页。

使用了PageHelper分页之后, 查询的sql语句后面还可不可以加; 为什么?

    使用了PageHelper分页之后, 查询的sql语句后面就不可以再加; 
    因为pagehelper底层是基于拦截器来实现分页的, 它会首先拦截到我们编写的查询所有的SQL语句(select * from tableName), 然后再后面拼接limit .....实现分页
    	类似于这样: select * from tableName limit .....
    如果此时我们的SQL语句中有; 那么结果就变成了这样:select * from tableName; limit .....  很明显这是一条错误的SQL    

PageHelper在使用的时候,如果PageHelper.startPage()方法在查询列表之后执行, 会出现什么问题?

    出现的问题是: 不会实现分页,而是查询到所有数据
    因为PageHelper.start()方法是创建一个page对象,并且设置3个属性初始化page, 然后将page绑定到当前线程;
    而分页方法在执行时会先判断当前线程是否有page对象, 有才会执行分页, 没有就查询所有

第3天

技能

1. 可以使用pd绘制数据库关系图
2. 能够看懂数据库外键引起的异常报错,并且解决

面试题

谈一谈你对多租户系统数据库设计的认识,你们系统采用的是哪一种方式? 为什么这样选择?

1. 多租户系统数据库设计方案分为三种:
	第一种是独立服务器,独立数据库: 一个用户用一个服务器,这种模式数据安全性和隔离性非常好,但是开发和维护成本很高
	第二种是共享服务器,独立数据库: 所有用户公用同一个服务器,但是每个用户用一个独立的数据库
	第三种是共享服务器,共享数据库: 就是所有用户公用一台服务器和数据库,然后通过特定标识去区分不同的租户, 这种模式开发和维护成本最低,但是数据安全性和隔离性也最低
2. 我们的项目目前采用的是第三种方式, 主要考虑到项目初期资金不是特别充足; 
    但是项目二期计划采用第一种和第三种两种方式相结合的方式来做,公司会设置vip用户,为他们定制第一种方式; 普通用户使用第三种方式

什么是数据库的三范式? 什么是数据库的反三范式? 两者之间如何选择?

1. 数据库的三范式就是一种数据库库设计规则,主要目的是用来减少数据的冗余,提高硬盘利用率的。
	第一范式: 确保每一列的原子性, 也就是每列不可再拆分
	第二范式: 在第一范式的基础上, 保证每张表只描述一件事
	第三范式: 在第二范式的基础上, 消除推导关系,消除相关依赖, 就是能通过其他字段推导出来的字段就不要再单独出现一列
2. 数据库反三范式是基于第三范式所调整的,它是通过添加一些冗余字段, 来提供我们数据的查询效率
3. 在开发中我们灵活选择, 如果对查询效率无要求,为了节省空间和简化增删改操作,可以选择遵循三范式; 如果非常注重查询效率, 就适当选择反三范式.
     我们的项目中在购销合同--货物--附件中都采用了反三范式的设计(为了提高查询效率加入'金额amount和TotalAmount'字段)

当数据表之间存在外键约束时, 哪张表的数据不能随表删除? 哪张表的数据不能随便添加?

    当表之间存在外键约束时,主表也就是约束别人的表不能随便删除,从表也就是被别人约束的表 不能随便增加。
    举个例子,有一个员工表和部门表,部门表作为主表,员工表作为从表添加外键约束,部门表不能随便删除,员工表不能随便添加,例如添加不存在的部门。 

谈一谈,当删除一个含有子部门的部门时,会出现什么样的问题? 处理的方案有几种?

1. 删除一个含有子部门的部门时会报错,由于部门表是自关联的设计,就表示我们在直接删除父部门时成功了,子部门数据其实就变成了孤儿,由于外键会约束不能删除
2. 有两种解决方案:
    第一种就是在删除部门数据之前可以做一个判断,如果该部门有子部门,做个提示,不允许删除。
    第二种是级联的操作,就是删除一个部门的时候连同子部门一起删除,这个需要在数据库中将外键关联改为CASCADE。

谈一谈密码加密的时候,加盐的目的是什么?

1. 我们现在项目中用到的加密技术是Md5, 它有个特性就是对一个字符串多次加密之后的结果是一致的, 这样的话就很容易被别人猜到密码
2. 加盐就是在加密的时候掺入一些字符, 即:保证同一个字符串在加密过程中, 只要盐不同, 那得到的结果也会不同, 这样就增加密码破解的难度

谈一谈你知道的系统权限设计模型有几种? 分别是什么? 应该如何选择?

1. 我在企业中接触过的系统权限设计主要有下面三类:
    1. 用户---权限 (直接为用户绑定权限)
    2. 用户---角色---权限 (为用户绑定角色, 在为角色绑定权限)
    3. 用户---用户组---角色---权限 (给用户分配用户组, 给用户组绑定角色, 给角色绑定权限)
2. 目前大部分系统用的都是第二种(RBAC), 至于如何选择主要是看系统的用户和权限数量
    如果系统用户量较少, 权限也较简单, 采用第一种
    如果系统用户量较多, 权限也比较繁杂, 采用第二种或第三种

谈一下什么是RBAC,它涉及到的表有几张? 表之间的关系分别是什么?

    RBAC说的是基于角色的权限访问控制.
    它涉及到五张表:用户表,角色表,权限表,还有用户表与角色表,角色表和权限表的中间表
    用户表和角色表,角色表和权限表之间都是多对多的,所以中间都加了中间表

第4天

技能

1. 理解用户分配角色  角色分配权限的本质操作
2. 掌握ZTREE的基本使用
3. 掌握aop控制日志的具体步骤

面试题

聊一聊你们项目中ZTREE的使用场景? 说一说你知道的ZTREE的功能

1. 我们这个项目ZTREE主要是使用在用户分配权限时候的权限展示页面上,
2. 我所了解的ZTree是一个依靠jQuery实现的多功能树插件。它的主要功能:
    1. 灵活的根据JSON数据展示树形结构
    2. 支持节点的单选/ 复选 / 拖拽 / 编辑

你们平台的用户分为几类? 每类用户的职责是什么? 程序中是如何控制他们的权限的

1. 我们这个平台主要是包含三类用户
    SaaS管理员: 这个是属于我们SaaS系统的,主要责任是维护SaaS管理模块
    企业管理员: 这个是具体属于某个企业的,主要责任是维护企业相关模块
    企业级普通员工: 也是属于某个企业的,主要责任是负责维护企业中某块信息的维护。
2. 控制权限大致分为两种情况,
    第一种是管理员(包括SaaS管理员和企业管理员)的权限,因为这两种身份特殊性,他们的权限也是固定的, 所以我们会在权限表中设置一个字段来标识出他们的权限
    第二种是企业普通员工的权限,每个员工的权限都是由管理员来分配的, 都不一样, 所以考虑到复杂性,我们是通过RBAC权限模型来管理的

说一下SpringAop的使用场景? 具体说说你们项目中的日志是如何记录的?

1. SpringAOP是面向切面编程思想的一个具体实现, 主要用来处理一类公共问题, 在公司中的主要有下面几个应用场景:
   1. 事务(直接使用了Spring的声明式事务)
   2. 日志
   3. 性能分析
2. 我们这个项目运用了AOP来实现日志记录,大体上分三步:
	第一步是确定目标对象: 我们是将所有的Controller层的类作为目标对象
	第二步是编写增强对象: 自定义了一个类, 在类中定义了一个环绕通知的方法, 在方法中记录切点的执行时间/操作人/操作动作等等信息
	第三步是配置切面:使用注解的方式配置了切点和增强的执行顺序

第5天

技能

1. 能够基于shiro实现认证和授权,会配置shiro的过滤器
2. 会自定义shiro过滤器

面试题

你们项目为什么shiro框架? shiro框架的作用有哪些? shiro框架底层是基于什么实现的?

1. 当前比较流行的框架有两个: Apache的shiro和spring的spring Security, shiro相对于spring Security来说配置比较简单, 使用更加方便,而且足以满足我们的项目需求
2. shiro是一个安全框架,主要的作用是: 认证,授权,加密及会话管理, 当然他也支持跟其他的组件进行集成
3. shiro框架底层主要是一系列过滤器在工作

说一下认证和授权的区别是什么

    认证的意思是 判断当前访问用户是不是本系统的人, 是就允许访问, 不是就跳转登录页面
    授权的意思是 当系统用户访问某个资源的时候, 判断下用户是否有对应资源的访问权限, 有就放行,没有提示无权限访问

shiro框架默认提供了几个过滤器? 你们项目中用到了几个? 他们几个在配置的时候有什么需要注意的吗? 如果顺序不会会出现什么情况?

1. 默认提供了10个过滤器,我们项目中主要用到了anno(未认证访问),authc(认证后访问),perms(指定权限后访问)几个
2. 他们配置的时候需要注意下顺序: anno--->perms--->authc, 如果配置顺序不对, 极有可能出现登录不了或者权限控制不住的情况

在项目中,一般哪些路径会配置为anno? 配置为了authc,会出现什么情况?

1. 在项目中,一般配置为anno的路径为:1) 静态资源;  2) login.jsp;  3) login.do 
2. 如果将静态资源或login.jsp配置为authc, 会导致资源访问不了;  如果将login.do配置为authc, 会导致提交登录请求的时候,直接进行认证过滤, 跳转回login.jsp页面

简单说一下shiro的核心组件,每个组件的作用是什么? 如果可以的话,你还知道其他组件吗?

shiro的核心组件: 
	SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;它是Shiro的核心,它负责与后边介绍的其他组件进行交互,我觉得可以把它看做SpringMVC中的DispatcherServlet前端控制器。
	Subject:主体,所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
	Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
	Authenticator:认证器,负责主体认证的,如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),说白了就是什么情况下算用户认证通过了。
	Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能。
	SessionManager:Session管理器,Session呢,通过SessionManager去管理它的生命周期,而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;所以呢,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据。
	SessionDAO:所谓DAO,数据访问对象,用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,通过如JDBC写到数据库;比如想把Session放到Memcached中,可以实现自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache进行缓存,以提高性能;
	CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。
	Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。

说一下shiro的认证流程? 再说一下shiro的授权流程?

1. shiro的认证流程:
	1. 当用户点击登录后,将用户名和密码封装成Token,然后调用Subject的login方法将Token传给SecurityManager
	2. 安全管理器拿到信息后,会调用Relam去数据库查询用户信息,然后Relam将查询到的信息返回给SecurityManager
	3. SecurityManager拿到数据后判断,如果为空就会抛出异常
	4. 不为空会通过内置的密码比对器对Token的信息与数据库中的密码比对,密码不一样,抛出异常,密码一样,登录成功,将用户信息写入回话中,
	5. 我们后台接收如果有异常,登录失败,没有则登录成功。
	6. 从Subject中提取用户信息。

2. shiro授权流程:
    1. 首先我们先在配置文件中定义好每个资源被访问需要的权限标识
    2. 当用户想要访问某一资源时,在用户访问资源之前,SecurityManager会调用Realm去数据库查询当前用户的现有权限
    3. 然后拿想要访问资源的权限跟查询到的权限做对比,如果有就放行,没有跳转到无权限页面。

shiro的授权数据可以缓存吗? 如何实现呢? 可以缓存到外部系统吗,比如说redis, 怎么实现?

1. 可以缓存,通过在xml中配置缓存管理器实现,配置一个缓存管理器,然后将缓存管理器交给SecurityManager管理,实现缓存
2. 可以使用redis,需要自定义一个缓存管理

什么是粗颗粒和细颗粒权限?你们系统中是如何实现这两种权限控制的?

1. 粗粒度权限:指的是控制到资源的类型级别,比如说张三只能管理部门, 不能管理用户
    细粒度权限:指的是控制到资源的数据级别,比如说张三只能管理1号部门,不能管理2号部门
2. 粗粒度权限的控制是基于shiro实现的,细粒度的权限控制是自己编写sql语句实现的
    粗粒度权限控制是因为我们这个平台主要是包含三类用户,
    	第一个是SaaS管理员,这个是属于我们SaaS系统的,主要责任是维护SaaS管理模块,
    	第二个是企业管理员,这个是具体属于某个企业的,主要责任是维护企业相关模块,
    	第三个是企业级的普通员工,也是属于某个企业的,主要责任是负责维护企业中某块信息的维护的。
	粗粒度权限大致分为两种情况,一种是SaaS管理员企业管理员,因为身份特殊性,我们会在具体的权限表中设置一个字段belong比如1代表SaaS管理员,2代表企业管理员来对应用户表中的一个相应字段degree,这样来控制相应的权限;第二种是企业的普通员工,这种因为不同部门普通员工又分为不同角色比如经理与职员,考虑到复杂性,我们是通过RBAC权限来管理控制的,也就是5表联查的一个操作。
	细粒度控制上比如说合同管理模块,总经理可以查看本部门及子部门的合同数据,部门经理能查看本部门的合同数据,普通员工只能查看自己的合同数据,具体实现是通过表中设置的字段degree,使用不同数值代表相应的职位,然后通过数值进行相应的判断,执行对应的sql语句。

第6天

技能

1. 能够了解系统演变的一个过程
2. 能够搭建基于的dubbo的分模块工程
3. 能够掌握dubbo配置中的几个基本配置项(超时时间 重试机制 启动检查  协议 端口  包扫描)

面试题

谈一下分布式和集群的概念的区别

	集群:多台服务器重复完成同一个任务,即同一个任务部署在多台服务器上
	分布式:多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务

什么是SOA架构? 它跟分布式架构的区别是什么?

	分布式架构
		狭义-javaweb应用的分布式架构就是指将服务层单独出来,并部署在tomcat上对外提供服务,在controller中可以通过远程调用访问服务层中的方法
		广义-多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务
	SOA架构
		分布式架构的优化版本,提供了一个服务治理中心来进行rpc调用的管理,解决了分布式架构在rpc中调用关系复杂,难维护的问题

画一下dubbo的架构图, 说一下dubbo架构图中的角色, 以及角色的调用关系

1. dubbo框架中的角色
	服务运行容器: 用于启动服务提供者
	服务提供者: 用于提供服务
	服务消费者: 用于消费服务
	注册中心: soa架构中的服务治理中心,我们使用的是zookeeper,存储服务者列表的地方
	监控中心: soa架构的的一个可视化工具
2. dubbo框架中角色之间的调用关系
	0) 服务提供方容器启动, 然后运行服务提供者
	1) 服务提供方启动时会向服务注册中心注册服务地址
	2) 服务消费方启动时会向服务注册中心订阅服务地址
	3) 服务注册中心返回服务地址给服务消费方,当服务地址有变更时主动推送给服务消费方
	4) 服务消费方从服务方地址列表中,基于负载均衡选择一台服务提供方进行调用,如果失败,再选一台
	5) 服务提供者和服务消费者定时发送调用次数和调用时间的相关统计数据到监控中心

dubbo架构中哪些地方用的是长连接,哪些地方用的是短连接

1. 长连接: 消费者,提供者,注册中心之间是基于长连接
2. 短连接: 监控中心,消费者,提供者之间是基于短连接

dubbo的注册中心如果宕掉了, 会不会影响服务之间的调用?

	这得根据情况而定,一般分为两种情况:
	一种是服务消费者已经向服务注册中心拉取了服务地址,这种情况即使注册中心宕掉了,也不会影响服务之间的调用
	另一种情况是服务中心并没有拿到服务地址就宕掉了,服务消费者没有拉取到服务地址,就会影响服务之间的调用

dubbo的注册中心和服务消费者之间是基于什么模式传递消息的?

	推拉相结合的模式
	1. 当服务消费者刚刚启动的时候, 会主动连接服务注册中心, 并从注册中心中拉取服务提供者的列表
	2. 当服务运行过程中, 一旦注册中心中的服务提供者的信息变化了, 注册中心就会将变化之后的列表主动推送给服务消费者

你们的系统为什么用dubbo?

	因为我们的项目设计还蛮复杂的,得有二三十个模块,包括货运模块,公司模块,基于系统的基础模块,统计分析等.
	这些模块之间的调用非常复杂,而且我们后期还得进行升级与维护,单体架构远远满足不了我们的需要,因而我们采取了目前主流的分布式架构,
	同时为了方便这些调用的统一管理,又采用了SOA的设计思想.因为现在dubbo还是比较主流嘛,实现框架还是选择的dubbo,用zookeeper作为注册中心.

Dubbo启动时如果依赖的服务不可用会怎样?

	dubbo的服务启动依赖检查,指的是当启动服者务时,如果存在不可用的依赖时,直接抛出异常,从而阻断spring初始化完成,以便在上线时发现问题
	我们可以通过在服务者的springmvc配置文件中将duboo的comsumer标签中的check属性设置为false解决这一问题,不让dubbo框架中的消费者启动依赖检查

你们公司的Dubbo使用的什么做注册中心? 还有别的选择吗?

	我们公司使用的:zookeeper(文件系统+监听机制)
	可供选择:mysql / redis

你们公司的Dubbo使用的是什么通信框架? 还有别的选择吗?

	消费者和服务者之间的通信框架: netty(基于自定义通信协议的web容器)-dubbo协议
	可供使用的通信协议框架-dubbo、rmi、hessian、http、webservice、rest、redis等

Dubbo有哪几种集群容错方案,默认是哪种?

	Failover Cluster 失败自动切换,自动重试其它服务器(默认)
	Failfast Cluster 快速失败,立即报错,只发起一次调用
	Failsafe Cluster 失败安全,出现异常时,直接忽略
	Failback Cluster 失败自动恢复,记录失败请求,定时重发
	Forking Cluster 并行调用多个服务器,只要一个成功即返回
	Broadcast Cluster 广播逐个调用所有提供者,任意一个报错则报错	

Dubbo有哪几种负载均衡策略,默认是哪种?

	Random LoadBalance-随机模式。按权重设置随机概率。在一个截面上碰撞的概率较高,但调用越大分布越均匀
	RoundRobin LoadBalance-轮询模式。按公约后的权重设置轮询比例。但存在响应慢的服务提供者会累积请求
	LeastAction LoadBalance-最少活跃调用数。响应快的提供者接受越多请求,响应慢的接受越少请求
	ConsistentHash LoadBalance-一致hash。根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者,若服务挂了,则会基于虚拟节点平摊到其他提供者

如果使用了dubbo之后,没有切换成阿里的@Service注解,会引发什么问题?

	无法将服务提供者暴露给注册中心,这样在消费者启动时:
		如果配置了检查, 会启动失败
		如果配置了不检查, 会启动会成功, 但是在服务调用的时候会保存,抛出一个找不到服务提供者的异常(No Provider)

如果使用了dubbo之后,没有切换成阿里的@Reference注解,会引发什么问题?

	在rpc时,无法在控制器进行远程服务对象注入,运行时会报空指针异常,即无法进行远程服务调用

第7天

技能

1. 会使用mybatis逆向工程生成对应的dao和domain代码
2. 会使用逆向工程代码进行条件查询\ 排序 \ 去重操作
3. 掌握第三方技术的使用基本步骤

面试题

说一下项目中购销合同的相关逻辑, 以及涉及到的表和表间关系

购销合同中涉及到对合同货物附件的修改会导致其他表也跟着改变。
例如 删除合同就需要删除合同下的货物以及附件
合同表和货物表是一对多的
合同表和附件表是一对多的
货物表和附件表也是一对多的

能够说出合同\货物\附件 在做增删改时 对其他表的影响

合同:增 不影响货物附件
	 删 需要删除合同下的货物与附件
	 改 不影响货物附件
货物:增 附件无影响 合同修改 总金额和货物数量
	 删 删除货物下的附件 合同修改 总金额和货物附件数量
	 改 附件无影响 合同总金额更改
附件:增 合同修改总金额和附件数量 货物无变化
	 删 合同修改总金额和附件数量 货物无变化
	 改 合同修改总金额  货物无变化

你们公司为什么选择七牛云存储? 为什么没有自己部署本地的文件存储服务器呢? 如果让你选择部署的话,你会选择哪种服务器?

1. 七牛云是云服务存储,我们公司对七牛云平台做了一些调研,他们安全性有保障,SDK也比较简单,是老牌的云服务平台,货物图片数据没有那么重要 公司高层就决定使用七牛云
2. 之所以没有部署自己的服务器
	1. 我们整个架构使用的是tomcat来运行的,它本身并发量不高,如果在加载图片就会占用我们的线程和并发,所有我们不会在tomcat上存java以外的代码;
	2.我们有考虑自己搭建图片服务器,但是搭建成本很高,也比较麻烦,同时有很多专业做云服务的平台可以满足我们的要求,可以直接使用平台存储货物图片		
3. 如果一定要自己部署的话, 我可能会选择HDFS

谈一下你们项目文件上传的一个流程以及这中间的注意事项?

     前端三要素:
     		1.from表单添加	enctype属性设置为:multipart/from-data
     		2.提交方式是post(get提交有大小限制,post没有)
     		3.表单中必须有文件上传项:file,并且文件项需要给定name值
     后台接收:
      		1.文件上传解析器(id)
      		2.后台接收文件参数类型:MultipartFile uploadFile
      		3.文件保存:
      				源文件上传到七牛云服务器
      				文件路径保存到数据库
     注意事项:
     		1.上传文件名和上传数据的中文乱码
     		2.上传文件应该放在外界无法直接访问的目录,保证服务器的安全
     		3.上传文件同名问题;使用uuid来解决,在每个文件前加uuid
     		4.一个目录中不能放过多的文件

第8天

技能


面试题


第9天

技能

1. 会使用POI技术进行报表的导入 导出(模板导出) 
2. 会使用easyPOI导出数据

面试题

聊一下你们公司那些地方用到的了POI的导入和导出

我们在做关于企业进出口的SaaS项目时,用到过POI技术,其中有合同中货物表单的导入导出,还有季度财务报表的导出,由于我们的项目面对的是一个群体,所以我们没有搞那些花哨的模板,而是选择了使用EasyPOI技术,界面简洁,清晰易懂。大多数人都能接受。

说一下POI技术的主要涉及的类

由于现在主流的文件格式是xlsx,所以在做POI导入和导出的时候,主要涉及到的类就是XSSF系列的类,分别有wookbook,sheet,row,cell

说一下POI导入的流程和导出的流程

导入数据:
	上传文件,读取文件,使用XSSF的四个对象,按照簿-表-行-格的顺序解析文件,并将读取到的数据保存入实体类对象中,最后执行保存方法,将实体类对象保存入数据库。
导出数据:建立在会计人员和管理人员的使用/查验方便基础上,我们的数据导出采用的是模板导出法。
	首先需要从会计or管理部门获取所需要的模板格式,读取这个模板xlsx文件,并且解析得到每个单元格的格式信息。
	然后查询需要输出的数据,遍历数据并且创建行/单元格,将数据以及读取到的格式写入到单元格中。
	工作簿对象利用字节输出流写出数据,最后使用DownLoadUtil工具将文件下载。

接触过百万数据的导入和导出吗? 说一下它底层的思想是什么?

	了解过百万级数据的导入与导出  他的底层用到了SXSSFWorkBook类, 底层是Sax解析模式,
	是逐条解析 ,逐条释放 ,这样的效率会低一些, 但是占用的内存会比较低; 
     对于大量的数据会处理起来比较合适 , 但是不能在表中防止过多格式。

第10天

技能

1. 可以完成报运单的新增和修改
2. 掌握webService两种规范的发布和请求

面试题

聊一下你们项目中货代的整体流程?这中间涉及到的表有哪些? 表间关系是什么?

我们平台的流程是这样的:签订购销合同->生成报运单->海关报运->(货物装箱->委托运输->发票催款->财务记账) 
涉及到了合同表,货物表,附件表,生产工厂表,报运单表,报运单货物表,报运单附件表
    合同表与货物表			一对多的关系
    合同表与附件表			一对多的关系
    货物表与附件表			一对多的关系
    货物表(附件表)与生产工厂表	多对一关系
    合同表与报运单表		多对一关系
    报运单表与报运单货物表		一对多关系
    报运单表与报运单附件表		一对多关系
    报运单货物表与报运附件表	一对多关系
    报运单表与装箱单表		多对一关系
    装箱单表-委托单表-发票催款通知表-财务表	一对一关系

聊一下你们公司为了提供数据的查询效率, 使用了哪些手段? 举1个例子说明,在那个地方用的?

我们主要用到了两个:
	1) 打断设计思想
			
	2) 反三范式

你们的项目在什么地方用到了webService技术? 如何实现的? 说一下webService技术的使用场景

1. 我们这个项目在出口报运时用到了webService技术
2. 实现过程: 
	根据海关要求封装报运单和报运单货物,发送海关报运,然后新建个定时器任务,来定时查询报运结果,
	如果报运通过就会返回报运结果,根据报运结果对我们的报运状态和货税等进行修改。
3. webService技术的使用场景:
	系统间的服务调用

webService和dubbo技术的区别是什么?

	webService是一个跨编程语言和跨操作系统平台的远程调用技术 webService不需要注册中心 效率与安全性低 一般用于系统之间的外部调用
	dubbo是一款跨平台而不跨编程语言的远程调用技术 必须需要一个注册中心 效率与安全性能高 一般用于系统内部模块之间的调用

webSerivce有几种规范? 分别是什么? 区别是什么? 你们项目中用的哪个? 为什么选择这个?

1. JAVA中共有三种WebService规范 分别是JAX-WS JAX-RS JAXM&SAAJ 其中的JAXM&SAAJ已经废弃
	JAX-WS 是早期出现的WebService规范 通过SOAP协议传输数据 通过http的形式发送标准格式的XML文件数据
	JAX-RS 是JAVA针对REST 风格制定的一套Web服务规范 既可以发送json数据也可以以http的形式发送标准格式的XML文件数据	
2. 我们的项目使用的是JAX-RS, 它的使用比较简单

webService的JAX-WS规范的三要素是什么? 他们分别是干什么用的?

JAX-WS的三要素有SOAP,WSDL,UDDI
	SOAP:是http+xml基于http协议,采用xml格式,用来传递信息的格式
	WSDL:是使用说明书 用来描述热河访问具体的服务
	UDDI:产品目录

第11天

技能

1. 可以基于Quartz编写定时任务, 可以配置Quartz
2. 掌握Echarts图标中的基本图形的使用:饼状图 柱状图 直线图

面试题

Quartz和Spring Task是什么? 你们的项目为什么选择Quartz? 它的优点有哪些? 使用场景说几个

	Spring Quartz特点:
		1.默认多线程异步执行 
		2.一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。 
		3.单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度 
		4.多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能 
		5.SchedulerFactoryBean不能使用注解来配置?还是我没找到注解的方法?
	Spring Task特点: 
		1.默认单线程同步执行 
		2.一个任务执行完上一次之后,才会执行下一次调度 
		3.多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务 
		4.多任务并行执行需要设置线程池 
		5.全程可以通过注解配置
	选用Quarta的原因:Quartz是一个完全由 Java 编写的开源任务调度框架,为在 Java 应用程序中进行任务调度提供了简单却强大的机制。
	使用场景
		(1)某些网站会定时发送优惠邮件
		(2)银行系统还款日信用卡催收款短信
		(3)某些应用的生日祝福短信等

Quartz的核心组件有哪些? 作用分别是什么?

	Job:需要执行的java类
	JobDetail:任务细节,用来指定java类和具体执行的方法
	Trigger:触发器,配置时间规则和JobDetail
	Scheduler:调度器,统一调度并管理所有的Trigger

了解Cron表达式吗? 说一说每个位置代表的意思? 说一下它的常用符号及代表的意义

1. cron表达式是用来配置Quartz中Trigger的时间规则: 秒 分 时 日 月 周 年
2. 常用的符号
	*:表示任意
	?:忽略
	/:间隔
    -:范围
    ,:枚举
    L:Last 最后
    W:Work 工作日(周一到周五)

Echarts在你们的项目中的使用场景是什么? 谈一谈你对他的了解

1. 我们项目中的统计分析模块用到了Echarts,生产厂家销售情况用到了饼形图,产品销售排行用到了柱形图,系统访问压力图用到了折线图
2. Ecarts是由百度开发的一款开源的基于js图形报表组件,可以流畅的运行在PC和移动设备商,兼容当前绝大部分浏览器,借助它,我们可以轻松的绘制各种图形

第12天

技能

1. 可以使用JavaMail发送邮件
2. 可以使用Spring + RabbitMQ + JavaMail发送邮件

面试题

你熟悉的消息队列有哪些? 本项目中用的是哪个?

1. 使用过的消息队列:
    ActiveMQ: 仅仅用于JAVA系统间通讯, 不能跨语言
    RabbitMQ: 基于AMQP协议, 跨语言
    RocketMQ: 一般用于电商项目
2. 本项目中用到的是 RabbitMQ

说一下你们公司是如何解决消息的丢失问题的?

	1)为了保障消息在中间件中的安全,对消息设置持久化
	2)为了保障消息一定要在消费者消费之后再删除, 可以采用手动消息回执机制。

说一下RabbitMQ支持的五种消息类型? 你们公司用的是哪一种? 在什么场景下使用的?

1. RabbitMQ五种消息类型
    点对点:
        Simple: 消费者的个数1个
        Work: 消费者的个数多个
            平均消费 和  竞争消费
    发布/订阅:
        Fanout:  一个生产者发布的消息同时被所有消费者消费
        Driect:  一个生产者发布的消息同时被指定的一部分消费者消费(但是可以自定义路由, 指定的一部分消费者消费)
        Topic :  一个生产者发布的消息同时被指定的一部分消费者消费(但是可以自定义路由, 指定的一部分消费者消费, 支持通配符 * #)
2. 我们公司用的是Topic
    当用户添加成功后, 分别给用户发送短信和邮件

第13天

技能

1. 可以使用Jasper制作pdf报表

面试题

1. Jaseper Report的生命周期   

整体

1. 简单的介绍下你们的项目
2. 说一下你们项目的周期\人员分配\情况
3. 说一下你们项目的表设计\模块建立情况
4. 用过UML建模工具吗? 用的什么工具? 用它来绘制的什么?
5. dubbo整合shiro的坑
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值