简答题1. 如何理解RabbitMQ的Dead Letter Pattern(死信模式)与Dead Letter Queue(死信队列)?
死信模式指的是,当消费者不能处理接收到的消息时,将这个消息重新发布到另外一个队列中,等待重试或者人工干预。这个过程中的Exchange和Queue就是所谓的DeadLetter Exchange和Queue。
来自一个队列的消息可以被当做死信,即被重新发布到另外一个Exchange去,这样的情况有:
消息被拒绝(basic.reject or basic.nack)且带requeue=false参数。
消息的TTL-存活时间已经过期。
队列长度限制被超越(队列已满)。
死信队列可用于排查Message被reject(拒绝)或undeliver(未送达)的原因。
[考点] 消息队列综合
2. 什么是视图?视图的作用是什么?
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条select语句,结果集被赋予一个名字,即视图名字。视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
视图所对应的子查询种类分为以下几种类型。
select语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数,叫作简单视图,此时视图是基表的子集。
select语句同样是基于单表,但包含了单行函数、表达式、分组函数或group by子句,叫作复杂视图。
select语句是基于多个表的,叫作连接视图。
视图的作用:如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,这样就能简化复杂查询。视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及的列,对基表中的其他列起到安全和保密的作用,这样可以起到限制数据访问的作用。
[考点] 关系型数据库知识
3. 什么是JPA的二级缓存?
JPA2.0增加了对二级缓存的支持,二级缓存是全局缓存,需要显式配置。如果二级缓存激活,JPA会先从一级缓存寻找实体,未找到再从二级缓存中寻找,当二级缓存有效时,就不能依靠事务来保护并发的数据,而是依靠锁策略,如在确认修改后,需要手工处理乐观锁失败等。可以在EntityManagerFactory中使用JPA2.0提供的新API。
二级缓存适用于经常被读但很少被修改或不修改的数据,使用二级缓存能提高性能,但使用二级缓存也可能会导致提取到“陈旧”数据,也会出现并发写的问题。
同时需要注意的是,二级缓存只能缓存通过EntityManager的find或getReference查询到的实体,以及通过实体的getter方法获取到的关联实体;而通过JPQL查询获得的数据缓存需要配置。
[考点] Hibernate与JPA
4. DOCTYPE的作用是什么?严格模式与混杂模式各有什么区别?
<! Doctype>声明位于文档中的最前面,处于<Html>标签之前,它不是HTML标签。作用是告知浏览器的解析器,用什么文档类型规范来解析这个文档。DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
严格模式也称标准模式,浏览器会按照W3C的标准来解析代码。
混杂模式也称为怪异模式或者兼容模式。在混杂模式中,页面不严格按照标准执行,浏览器会按照自己的方式去解析执行代码,用此种模式会影响HTML的排版。混杂模式主要用来兼容旧的浏览器,此时页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。
[考点] HTML5与Web编程综合
5. 减少页面加载时间的方法有哪些?
推荐以下几种方法。
1)减少DOM操作,尽可能用变量替代不必要的DOM操作。
2)合并JS、CSS文件,减少HTTP请求。
3)外部JS、CSS文件放在页面最底下。
4)压缩CSS、JS文件。
[考点] HTML5与Web编程综合
6. MySQL数据表中timestamp类型字段如何设置相关属性?
timestamp类型字段可以以下面三种方式来设置属性。
1)timestamp default current_timestamp on update current_timestamp,在新增记录和修改现有记录时都对这个数据列自动刷新,设置为当前服务器时间。
2)timestamp default current_timestamp,在新增记录时把这个字段设置为当前服务器时间,但以后修改时,不会自动刷新它。
3)timestamp on update current_timestamp,在新增记录时把这个字段值设置为0,如果设置了default null,则新增记录时这个字段值为null,以后修改时刷新它,设置为当前服务器时间。
需要说明的是,如果新增或修改的SQL中明确给这个字段赋值,则字段值为所赋值。只有在SQL中没有明确赋值的情况下,上述属性设置才会得到执行。
[考点] MySQL数据库
7. Redis的同步机制是怎样的?
Redis的主从同步分为部分同步(也叫增量同步)和全量同步。下面介绍一下Redis的同步策略。
Redis会先尝试进行增量同步,如不成功,则Slave进行全量同步。如果有需要,Slave在任何时候都可以发起全量同步。
Redis增量同步是指Slave初始化后开始正常工作时,主服务器发生的写操作同步到从服务器的过程。增量同步的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis全量同步一般发生在Slave初始化阶段,这时Slave需要对Master上的所有数据做全量同步。全同步结束后,也就是配置好主从后,Slave连接到Master,Slave都会发送PSYNC(即增量同步)命令到Master。
如果是重新连接,且满足增量同步的条件,那么Redis会将内存缓存队列中的命令发给Slave,完成增量同步。否则进行全量同步。
[考点] Redis
8. 什么是对称加密算法?
对称加密算法就是用同一个密钥进行信息的加密和解密的算法。算法公开,加密速度快,但是密钥管理比较烦琐,使用者双方需要交换密钥,其中有一方泄露了密钥,则会出现安全问题,安全性相对比较低。这里介绍几种常用的单向加密算法。
●DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
●AES(Advanced Encryption Standard):高级加密标准,是新一代的加密算法标准,它是用来替代DES算法的,目前已成为对称加密算法中最流行的算法之一。速度快、易用、灵活、安全级别高,支持128、192、256、512位密钥的加密,比DES算法加密强度更高,更加安全。
●3DES(Triple DES):基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
[考点] 软件安全知识
9. RocketMQ消费者消费模式有几种?
RocketMQ消费者消费模式有两种:集群消费和广播消费。
1)集群消费:消费者的一种消费模式。一个Consumer Group中的各个Consumer实例分摊去消费消息,即一条消息只会投递到一个Consumer Group下面的一个实例。
2)广播消费:消息将对一个Consumer Group下的所有Consumer实例都投递一次。消息也会被Consumer Group中的每个Consumer都消费一次。
[考点] 消息队列综合
10. 在什么情况下适合用到iQuery中的Delegate()函数?
在以下两个情况下适合使用delegate():
1)当有一个父元素,需要给其下的子元素添加事件,这时可以使用delegate(),示例代码如下:
$("ul").delegate("li","click",function(){
$(this).hide();
});
2)当元素在当前页面中不可用时,可以使用delegate()。
[考点] AJAX与Javascript
11. 远程调用框架有哪些?
有很多优秀的远程调用框架,如Dubbo、DubboX、Hessian、Thrift、Avro、gRPC等。Dubbo、DubboX前面已有介绍。下面简单介绍一下其他的远程框架。
Hessian是一个轻量级的Remoting on HTTP工具,采用的是Binary RPC协议,基于HTTP协议,采用二进制编解码。Hessian一般是通过Web应用来提供服务,通过Servlet提供远程服务。
Thrift是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C++、C#、Java、Python、PHP和Ruby。Thrift允许用户定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
Avro和Thrift有点相似,是跨语言、基于二进制、高性能的通信中间件。也都提供了数据序列化的功能和RPC服务。Avro在Thrift基础上增加了对Schema动态的支持且性能上不输于Thrift。更适用于搭建数据交换及存储的通用工具和平台。Thrift的优势在于支持更多的语言和相对成熟。
gRPC是Google开源的一个高性能RPC框架,采用了ProtoBuf(Protocol Buffer)来做数据的序列化与反序列化,用HTTP2作为数据传输协议。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面,压缩和传输效率高,语法简单,表达力强。gRPC提供了一种简单的方法来定义服务,同时客户端可以充分利用HTTP2 Stream的特性,有助于节省带宽、降低TCP的连接次数、节省CPU的使用等。同时gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。
[考点] 网络编程与远程调用
12. 注册了多个同样的服务,如何测试指定的某一个服务呢?
在开发和测试环境中,可能会经常遇到这种情况,这时可以配置点对点直连,绕过注册中心,将服务以接口为单位,忽略注册中心的提供者列表。某一接口配置点对点,不影响其他接口从注册表获取列表。下面介绍一下如何配置点对点直连的几种方式。
1)使用XML配置:在消费者端的<dubbo: reference>配置中指定服务提供者URL,绕过注册表,多个地址用分号分隔,配置如下:
<dubbo: reference id="demoService" interface="com.dubbo.DemoService" url="dubbo://localhost:20890"/>
2)配置-D参数,将-D参数映射服务地址添加到JVM启动参数,示例如下:
java -Dcom.dubbo.DemoService=dubbo://localhost:20890
3)配置.properties文件:如果有更多服务,也可以使用文件映射来指定映射文件路径-Ddubbo.resolve.file,此配置优先于配置<dubbo: reference>,如下所示:
java -Ddubbo.resolve.file=dubbo.properties
然后在映射文件dubbo.properties中添加配置,其中Key是服务名称,value是服务提供者URL:com.dubbo.DemoService=dubbo://localhost:20890
[考点] Dubbo框架
13. 如何在自定义端口上运行Spring Boot应用程序?
为了在自定义端口上运行Spring Boot应用程序,可以在application.properties中指定端口:server.port=8090。也可以在启动命令中通过参数指定。命令示例如下:
java·jar*.jar --server.port=8090
当server.port=0时,将随机分配任何可用的端口。
[考点] Spring Boot
14. 什么是CAP原理?
CAP原理就是:一个分布式系统不可能同时满足一致性(Consistency),可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求,最多只能同时满足其中的两个,关于这三个特性简单总结如下。
●一致性(C):在分布式系统中的所有数据备份,能保持严格的一致性。如果写入某个数据成功,之后读取,读到的都是新写入的数据;如果写入失败,读到的都不是写入失败的数据。
●可用性(A):指系统提供的服务必须一直处于可用的状态,即合集群中一部分节点故障后,集群整体还能正确响应客户端的读写请求。
●分区容错性(P):即分布式系统在遇到某个节点或网络分区故障时,仍然能够对外提供满足一致性和可用性的服务。在分布式系统中,不同的节点分布在不同的子网络中,由于一些特殊的原因,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。系统如果不能在通信时限内达成数据一致性,就意味着发生了分区的情况,系统必须就当前操作在C和A之间做出选择。
[考点] 分布式软件系统相关知识
15. Spring加载ApplicationContext的XML配置文件的几种方式是什么?
以下是三种较常见的ApplicationContext的实现方式。
1)ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。代码如下:
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
2)FileSystemXmlApplicationContext:由文件系统中的XML配置文件读取上下文。代码如下:
ApplicationContext context=new FileSystemXmlApplicationContext ("bean.xml");
3)XmlWebApplicationContext:由Web应用的XML文件读取上下文,是专为Web工程定制的。代码如下:
ServletContext sct=Request.getSession().getServletContext();
ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(sct);
[考点] Spring基础
16. 注册JDBC驱动程序有哪三种方式?
Class.forName("com.mysql.jdbc.Driver");此方式由于参数为字符串,因此很容易修改,移植性强。是最常见的注册方式,也是推荐的方式。
2)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");可以同时导入多个JDBC驱动,中间用冒号":"分开。
3)new com.mysql.jdbc.Driver():这里需要创建一个类的实例。创建类的实例就需要在Java文件中将该类通过import导入,否则就会报错,即采用这种方式,程序在编译的时候不能脱离驱动类包。
第一种与第二种方法可以脱离JDBC的驱动进行编译,第三种方法不可以的,它一定要有JDBC的驱动才可以通过编译,这样对我们的程序就有很多的不好之处,为程序换数据库会带来麻烦。
[考点] JDBC相关
17. 在Struts2中如何自定义系统常量?
自定义系统常量有两种方式:
1)在struts.xml文件中自定义:
<constant name="struts.i18n.encoding" value="UTF-8"/>
2)在struts.properties中自定义:
struts.i18n.encoding=UTF-8
[考点] Struts2
18. 什么是Struts1框架?
通常说的Struts默认是指Struts1,它是最早的MVC框架之一,曾经也是最流行的一款MVC框架。
Struts是较早的MVC框架,它的优点包含前面所说的MVC模式的优点,在它出现之前,Java项目是以纯JSP或JSP+Servlet+JavaBean的方式开发,代码层次不分明,比较难维护,移植性也比较差。所以Struts便应运而生并广泛流行。它的缺点是相对于后来出现的MVC框架来说,如Struts2、SpringMVC。二者有后发优势,尤其是SpringMVC,依托Spring的无缝集成,现在占据优势地位。
Struts的优点如下。
1)提供了五个标签库,Struts提供的标签库能大大提高开发效率。
2)Validator验证框架。
3)提供Exception处理机制。
4)支持I18N。
下面介绍一下Struts1框架的工作流程。
Web应用程序启动时会加载并初始化ActionServlet。前端提交表单时,相应的ActionForm对象被创建,并被填入表单相应的数据。ActionServlet根据Struts-config.xml中的配置参数决定是否表单验证,如果需要就调用ActionForm的Validate()验证,然后将请求发送到对应的Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的JSP页面,JSP页面将数据渲染呈现。
[考点] 综合
19. 什么是中台系统?
中台缘于2015年阿里提出的大中台小前台模式。中台的核心就是通过对企业进行核心能力的沉淀,实现共性服务与资源的有效复用,减少重复建设的运营和维护成本,可以快速进行服务能力迭代,高效支撑前端业务变化。
什么情况下可以创建中台?个人认为,公司的业务达到一定的规模,有较多共性的业务需求时,可以开发自己的中台系统,快速灵敏地支撑业务前台的多样性需要。
关于中台,比较热门的有业务中台、数据中台、权限中台和技术中台等。
[考点] 分布式软件系统相关知识
20. Nginx的nginx.conf配置文件结构及常用配置参数有哪些?
Nginx默认的配置文件为conf/nginx.conf。文件结构主要包括:全局作用域块、event作用域块、HTTP(所有Nginx指令在nginx.conf都是小写,这里保持一致)指令作用域块、server指令作用域块、location指令作用域块。常用配置参数如下:
user: nginx服务的用户
worker_processes:工作进程数
worker_cpu_affinity:工作进程数为多个时,指定进程使用的CPU。单进程无须此参数
worker_connections:每个进程的最大连接数
gzip:是否开启压缩
keepalive_timeout: keepalive的超时时间,单位是s
server:系统级配置,可以配置多个server
listen:server服务的本地监听端口
server_name:虚拟主机名或域名
access_log访问日志目录
error_page错误页面
location:监听的服务uri地址
root:项目根目录
index:默认主页
proxy_pass:代理的服务器地址
upstream:基于proxy_pass设定后端服务器,配置多个server时就是负载均衡配置了rewrite:重定向配置
[考点] Nginx