十三、项目相关
1、OA工作流Activiti
定义:业务过程部分或整体,在计算机应用环境下的自动化
主要解决:使在多个参与者之间,按照某种预定义的规则传递文档、信息或任务的过程”自动进行“,从而实现某个预期的业务目标,或者促使此目标的实现。
工作流管理系统:
一个完成工作量的定义和管理的软件系统。按照在系统中预先定义好的工作流规则进行工作流实例的执行。
(工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境)。
主要作用:
1、定义工作流:包括具体的活动、规则等。
2、执行工作流:按照流程定义的规则执行,并由多个参与者进行控制。
2、微信登录
1.AppID
应用ID,唯一标识(身份证号)
2.AppSecret
应用的密钥(密码)
3.code
授权的临时凭证(例如:临时身份证)
4. access_token
接口调用凭证(例如:真正的身份证,虎符,令牌)
3、微信支付
4、单点登录
5、并发量大的话如何处理?
1、数据库优化、分库分表、读写分离、消息队列肖锋
2、单体式架构:多线程
分布式微服务、集群、负载均衡熔断、反向代理
6、预计吞吐量
吞入量TPS:单位时间内处理请求的数量上线
QPS:秒为单位
RT:响应时间(一般为1-2秒)
7、文件上传如何处理断点续传?
断点续传:断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分。
整体思路:
拿到文件,保存文件唯一性标识,切割文件,分段上传,每次上传一段,根据唯一性标识判断文件上传进度,直到文件的全部片段上传完毕
8、redis分布式锁怎么实现的,当同时有多个······他是怎么处理的
1、秒杀案例需要达到的预期特性
版本一:
快速搭建一个简单的秒杀系统,只需要把你的商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。
版本二:
随着请求量的加大(比如从 1w/s 到了 10w/s 的量级),版本一的架构很快就遇到了瓶颈,因此需要做架构改造来提升系统性能。这些架构改造包括: 1)把秒杀系统独立出来打造一个单独的系统,这样可以有针对性的优化,例如减少淘宝店铺装修的功能,减少页面复杂度。 2)系统独立部署一个集群,这样秒杀的大流量不会影响到正常的商品购买集群的机器负载。 3)将热点数据单独放到一个缓存系统中,以提高读性能。 4)增加秒杀答题,防止有秒杀器。
版本三:
这个架构仍然支持不了超过 100w/s 的请求量,所以为了进一步提升秒杀系统的性能,我们又对架构做进一步升级。
1)对页面进行彻底的动静分离,使得用户秒杀时,不需要刷新整个页面,只需要点击抢宝按钮,借此把页面刷新的数据降到最少。 2)在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。 3)增加系统限流保护,防止最坏情况发生。 经过这些优化,系统架构变成了下图中的样子。在这里,我们对页面进行了进一步的静态化,秒杀过程中不需要刷新整个页面,而只需要向服务端请求很少的动态数据。而且,最关键的详情和交易系统都增加了本地缓存,来提前缓存秒杀商品的信息,热点数据库也做了独立部署等。
一个人进去,其他人阻塞进入等待,redis持久化数据-1,传递到消息队列到数据库。
1、实现分布式锁的思路
因为redis是单线程的,所以命令也就具备原子性,使用setnx命令实现锁,保存k-v
如果k不存在,保存(当前线程加锁),执行完成后,删除k表示释放锁
如果k已存在,阻塞线程执行,表示有锁
如果加锁成功,在执行业务代码的过程中出现异常,导致没有删除k(释放锁失败),那么就会造成死锁(后面的所有线程都无法执行)!
设置过期时间,例如10秒后,redis自动删除
高并发下,由于时间段等因素导致服务器压力过大或过小,每个线程执行的时间不同
第一个线程,执行需要13秒,执行到第10秒时,redis自动过期了k(释放锁)
第二个线程,执行需要7秒,加锁,执行第3秒(锁 被释放了,为什么,是被第一个线程的finally主动deleteKey释放掉了)
。。。连锁反应,当前线程刚加的锁,就被其他线程释放掉了,周而复始,导致锁会永久失效
给每个线程加上唯一的标识UUID随机生成,释放的时候判断是否是当前的标识即可
2、Redisson
Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,我没有说“最好”)的编程语言之一。
虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持。
相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。
而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。
Redisson 在 java.util 中常用接口的基础上,为我们提供了一系列具有分布式特性的工具类。
十四、Linux常用命令
文件与目录操作
查看文件内容
文本内容处理
查询操作
压缩、解压
yum安装器
网络相关
系统相关
十五、JavaWeb面试题
1、什么是Servlet
Servlet是一门用于开发动态web资源的技术,它是运行在服务器端的小程序。
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
作用:Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。
用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
编写一个Java类,实现Servlet接口。
把开发好的Java类部署到web服务器中。
2、什么是Servlet对象的生命周期
Servlet对象什么时候被创建。
Servlet对象什么时候被销毁。
Servlet对象创建了几个?
Servlet对象的生命周期表示:一个Servlet对象从出生在最后的死亡,整个过程是怎样的。
我们不需要在程序创建Servlet的对象,也没有去调用对象上的方法。Servlet对象的生命周期由web服务器负责
3、JSP九大内置对象
pageContext,页面上下文对象,相当于页面中所有功能的集合,通过它可以获取JSP页面的out、request、response、session、application对象。
request
response
session
application,应用程序对象,application实现了用户间数据的共享,可存放全局变量,它开始于服务器启动,知道服务器关闭。
page,就是JSP本身。
exception
out,out用于在web浏览器内输出信息,并且管理应用服务器上的输出缓冲区,作用域page。
config,取得服务器的配置信息。
4、JSP和Servlet的区别
(1)servlet是服务器端的Java程序,它担当客户端和服务端的中间层。
(2)JSP全名为Java server pages,中文名叫Java服务器页面,其本质是一个简化的servlet设计。JSP是一种动态页面设计,它的主要目的是将表示逻辑从servlet中分离出来。
(3)JVM只能识别Java代码,不能识别JSP,JSP编译后变成了servlet,web容器将JSP的代码编译成JVM能够识别的Java类(servlet)。
(4)JSP有内置对象、servlet没有内置对象。
5、转发和重定向的区别
重定向访问服务器两次,转发只访问服务器一次。
转发页面的URL不会改变,而重定向地址会改变
转发只能转发到自己的web应用内,重定向可以重定义到任意资源路径。
转发相当于服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页 共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和 request.getAttribute()。而重定向会产生一个新的request,不能共享request域信息与请求参数
由于转发相当于服务器内部方法调用,所以转发后面的代码仍然会执行(转发之后记得return);重定向代码执行之后是方法执行完成之后进行重定向操作,也就是访问第二个请求,如果是方法的最后一行进行重定向那就会马上进行重定向(重定向也需要return)。
无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中移除。
6、session 和 cookie 有什么区别?
(1)存储位置不同
cookie在客户端浏览器;
session在服务器;
(2)存储容量不同
cookie<=4K,一个站点最多保留20个cookie;
session没有上线,出于对服务器的保护,session内不可存过多东西,并且要设置session删除机制;
(3)存储方式不同
cookie只能保存ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据;
session中能存储任何类型的数据,包括并不局限于String、integer、list、map等;
(4)隐私策略不同
cookie对客户端是可见的,不安全;
session存储在服务器上,安全;
(5)有效期不同
开发可以通过设置cookie的属性,达到使cookie长期有效的效果;
session依赖于名为JESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session达不到长期有效的效果;
(6)跨域支持上不同
cookie支持跨域;
session不支持跨域;
7、get和post的区别
get请求参数是连接在url后面的,而post请求参数是存放在requestbody内的;
get请求因为浏览器对url长度有限制,所以参数个数有限制,而post请求参数个数没有限制;
因为get请求参数暴露在url上,所以安全方面post比get更加安全;
get请求只能进行url编码,而post请求可以支持多种编码方式;
get请求参数会保存在浏览器历史记录内,post请求并不会;
get请求浏览器会主动cache,post并不会,除非主动设置;
get请求产生1个tcp数据包,post请求产生2个tcp数据包;
在浏览器进行回退操作时,get请求是无害的,而post请求则会重新请求一次;
浏览器在发送get请求时会将header和data一起发送给服务器,服务器返回200状态码,而在发送post请求时,会先将header发送给服务器,服务器返回100,之后再将data发送给服务器,服务器返回200 OK;
8、说一下 session 的工作原理?
当客户端登录完成后,会在服务端产生一个session,此时服务端会将sessionid返回给客户端浏览器。客户端将sessionid储存在浏览器的cookie中,当用户再次登录时,会获得对应的sessionid,然后将sessionid发送到服务端请求登录,服务端在内存中找到对应的sessionid,完成登录,如果找不到,返回登录页面。
9、简述 TCP 和 UDP的区别?
TCP是传输控制协议,UDP是用户数据表协议;
TCP长连接,UDP无连接;
UDP程序结构较简单,只需发送,无须接收;
TCP可靠,保证数据正确性、顺序性;UDP不可靠,可能丢数据;
TCP适用于少量数据,UDP适用于大量数据传输;
TCP速度慢,UDP速度快;
10、什么是三次握手,四次挥手 ?
在客户机和服务器之间建立TCP连接时,首先会发送的一个信号。客户端在接受到SYN消息时,就会在自己的段内生成一个随机值X。
服务器收到SYN后,打开客户端连接,发送一个SYN-ACK作为答复。确认后设置为比接收到的序列号多一个,即X+1,服务器为数据包选择的序列号是另一个随机数Y。
确认字符,表示发来的数据已确认接收无误。最后,客户端将ACK发送给服务器。序列号被设置为所接收的确认值即Y+1。
举例
四次挥手
首先,客户端应用程序决定要终止连接(这里服务端也可以选择断开连接)。这会使客户端将FIN发送到服务器,并进入FIN_WAIT_1状态。当客户端处于FIN_WAIT_1状态时,它会等待来自服务器的ACK响应。
第二步,当服务器收到FIN消息时,服务器会立刻向客户端发送ACK确认消息。
当客户端收到服务器发送的ACK响应后,客户端就进入FIN_WAIT_2状态,然后等待来自服务器的FIN 消息
服务器发送ACK确认消息后,一段时间(可以进行关闭后)会发送FIN消息给客户端,告知客户端可以进行关闭。
当客户端收到从服务端发送的FIN消息时,客户端就会由FIN_WAIT_2状态变为TIME_WAIT状态。处于TIME_ WAIT 状态的客户端允许重新发送ACK到服务器为了防止信息丢失。客户端在TIME_ WAIT 状态下花费的时间取决于它的实现,在等待一段时间后,连接关闭,客户端上所有的资源. (包括端口号和缓冲区数据)都被释放。
举例
11、tcp 为什么要三次握手,两次不行吗?为什么?
因为客户端和服务端都要确认连接,①客户端请求连接服务端;②针对客户端的请求确认应答,并请求建立连接;③针对服务端的请求确认应答,建立连接;
两次无法确保A能收到B的数据;
十六、Git面试题
1、Git和SVN的区别
2、什么是Git
Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。
与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不依赖于中央服务器来存储项目文件的所有版本。
每个开发人员都可以“克隆”我在图中用“Local repository”标注的存储库的副本,并且在他的硬盘驱动器上具有项目的完整历史记录,因此当服务器中断时,你需要的所有恢复数据都在你队友的本地 Git 存储库中。
还有一个中央云存储库,开发人员可以向其提交更改,并与其他团队成员进行共享,如图所示,所有协作者都在提交更改“远程存储库”。
3、Git的工作流程
十七、Maven面试题
1、什么是maven?
Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行定义在生命周期阶段中插件目标的逻辑。当使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自于一组共享的(或自定义的)插件。
2、说说maven有什么优缺点?
优点
简化了项目依赖管理
易于上手,对于新手来说了解几个常用命令即可满足日常工作
便于与持续集成工具(jenkins)整合便于项目升级,无论是项目本身还是项目使用的依赖
maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等为什么使用Maven中的各点
缺点
Maven是一个庞大的构建系统,学习难度大。(很多都可以这样说,入门容易[优点]但是精通难[缺点])
Maven采用约定约定优于配置的策略,虽然上手容易但是一旦出现问题,难于调试中网络环境较差,很多repository无法访问
3、讲一下maven的生命周期
Maven的 生命周期:从我们的项目构建,一直到项目发布的这个过程。
4、说说你熟悉哪些maven命令?