简答题1. Kafka与传统消息系统的区别是什么?
Kafka与传统消息系统之间有如下区别。
1)Kafka持久化日志,这些日志可以被重复读取和长期保留。
2)Kafka是一个分布式系统,它以集群的方式运行,具有高扩展性,在内部通过复制数据提升容错能力和高可用性。
3)Kafka支持对数据的实时流式处理。
4)Kafka每秒消息处理速度达到十万级以上。其他消息系统远没有如此高的性能。
5)消息保留:传统的队列系统通常从队列末尾处理完成后删除消息。而Kafka中的消息即使在处理后仍然存在。这意味着Kafka中的消息不会因消费者收到消息而被删除。
6)基于逻辑的处理:传统队列系统不允许基于类似消息或事件处理逻辑。Apache Kafka允许基于类似消息或事件处理逻辑。
[考点] 消息队列综合
2. 如何处理可以让某个方法请求的参数中始终包含特定字符串如"my=dev"?
可以通过在方法的@RequestMapping注解中进行参数属性配置来实现,示例如下:
@RequestMapping(params="my=dev")
[考点] SpringMVC
3. Mongodb哪个命令可以切换、创建数据库?
Mongodb用use命令可以切换及创建数据库,命令格式:use数据库名称。如果不存在该数据库,use会创建一个新的数据库,如果该数据库存在,则切换到这个数据库,并返回这个数据库。
[考点] Mongodb
4. 请写出单例模式的具体Java代码实现。
单例模式总结起来有很多种写法,最简单、高效的是用枚举法,这里介绍6种写法,使用哪一种写法,读者朋友可以根据自己的需要来选择。
1)枚举实现。
public enum Singleton {
INSTANCE;
public void do() {}
}
2)用静态内部类来实现,保证了只会在调用时初始化,并且只会初始化一次。
public class Singleton {
private Singleton() {)
private static class SingletonCreator {
private static Singleton instance=new Singleton();
}
public static Singleton getInstance() {
return SingletonCreator.instance;
}
}
3)最简单的实现。不足是无论是否会用到都会创建这个对象。
public class Singleton {
private Singleton() {}
private static Singleton instance=new Singleton();
public static Singleton getInstance() {
return instance;
}
}
4)满足了使用时才创建实例的条件,但多线程访问时可能会产生创建多个实例问题。
public class Singleton {
private Singleton() {}
private static Singleton instance;
public static Singleton getInstance() {
if (instance==null) {
instance=new Singleton();
}
return instance;
}
}
5)解决了多线程的问题,但是会造成同步阻塞。降低了性能。
public class Singleton {
private Singleton() {}
private static Singleton instance;
public synchronized static Singleton getInstance() {
if (instance==null) {
instance=new Singleton();
}
return instance;
}
}
6)使用volatile关键字,并只有在判断实例为空真正创建对象时加用同步锁。
public class Singleton {
private Singleton() {}
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance==null) {
synchronized(Singleton.class) {
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
[考点] 关于设计模式
5. Spring中Bean有哪几种作用域?
Spring支持5种作用域。singleton与prototype是基本作用域,适用于所有Bean,singleton是Spring默认的作用域;Request、Session和globalSession是Web作用域,只有在Web应用中使用Spring时,这三个作用域才有效。现分别介绍如下。
1)singleton:单例模式,在Spring IoC容器中,使用singleton作用域的Bean将只有一个实例。
2)prototype:原型模式,每次注入,Spring IoC容器都将创建一个新的Bean实例。
3)request:对于每次HTTP请求,使用request作用域的Bean都会创建一个新实例,即每次HTTP请求将会产生不同的Bean实例。
4)session:对于每次HTTP Session,使用session作用域的Bean都会创建一个新实例。
5)globalSession:同一个全局的HTTP Session,只会创建一个新实例。典型情况下,仅在使用portlet context时有效。
比较常用的是singleton和prototype两种作用域。Spring默认使用singleton作用域,容器会管理Bean的整个生命周期。而使用prototype作用域时,容器创建实例交给调用组件后,将不再管理维护该实例。使用singleton作为作用域的好处是可以节省频繁创建与销毁实例的开销。但要注意,在单例模式下,Bean是线程不安全的。
[考点] Spring基础
6. 在Java开发中如何获取数据库的元信息?
数据库连接的getMetaData()方法可以取得数据库的元信息对象DatabaseMetaData, DatabaseMetaData中有很多方法,通过它们可以获取到数据库的产品名称、版本号、配置信息等。
[考点] JDBC相关
7. 在服务提供方可以配置的消费者端的属性有哪些?
有如下四个属性:
timeout:方法调用超时时间。
retries:调用失败重试次数,默认重试2次。
loadbalance:负载均衡策略,默认随机策略。
actives:消费者端最大并发调用限制。
[考点] Dubbo框架
8. 在Java中如何创建一个JDBC数据库连接?
创建连接,首先要注册目标数据库的驱动(Class.forName),然后通过DriverManager来创建并管理连接。DriverManager类是JDBC的管理类,该类负责加载、注册JDBC驱动程序,创建和管理数据库连接。获取连接方法:DriverManager.getConnection(String URL,String user,Stringpassword),有三个参数,后面是数据库的用户名和密码,URL是数据库连接字符串。
[考点] JDBC相关
9. JDBC中的CLOB和BLOB数据类型分别代表什么?
BLOB和CLOB都是大字段类型,BLOB是以二进制来存储的,CLOB可以直接存储文字。
[考点] JDBC相关
10. 如何使用iQuery设置一个属性值?
iQuery设置一个属性值也是用attr()方法。形如attr (name,value),它得有两个参数,前面为属性名,后面是属性值。假定有<img/>元素,id为imgid,示例代码为$('#imgid').attr('src','/img/test.jpg'),这样就给<img/>的src属性进行了赋值。
[考点] AJAX与JavaScript
11. Spring Boot自动配置原理是什么?
Spring Boot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。而自动配置的源码在spring-boot-autoconfigure-*.jar中。
1)开启自动配置的注解是@EnableAutoConfiguration,已包含在启动类的注解@SpringBootApplication中,所以Spring Boot默认已开启自动配置功能。
2)只要用户已经添加了相关jar依赖项,@EnableAutoConfiguration这个注解会“猜”用户将如何配置Spring。如果spring-boot-starter-web已经添加Tomcat和SpringMVC,这个注释就会自动假设用户在开发一个Web应用程序并添加相应的Spring配置,会自动去Maven依赖中读取每个starter中的spring.factories文件,该文件中配置了所有需要被创建的Spring容器中的Bean。
[考点] Spring Boot
12. 什么是CSRF攻击?如何防范CSRF攻击?
CSRF(Cross—Site RequestForgery),即跨站点请求伪造,攻击者通过跨站请求,在合法用户不知情的情况下,以合法用户的身份伪造请求进行非法操作。其核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份。
防范CSRF攻击的主要手段是识别请求者身份。这里推荐几种方法。
●表单提交Token验证。
●HTTP请求头的Referer域检查(Referer记录着请求来源,可以通过检查请求来源来验证请求是否合法,如很多网站用此方法来实现图片防盗链)。
●验证码验证。
[考点] 软件安全知识
13. $(document).ready()函数的作用是什么?
ready()函数仅能用于当前文档,它规定当ready事件发生时执行的代码。当DOM(文档对象模型)已经加载,并且页面(包括图像)已经完全呈现时,会发生ready事件。由于该事件在文档就绪后发生,因此把所有其他的iQuery事件和函数置于该事件中是非常好的做法。ready()函数有三种语法。
● $(document).ready(function).
● $().ready (function).
● $(function)。
[考点] AJAX与JavaScript
14. Spring JDBC如何把ResultSet对象中的数据映射为Java对象?
通过使用RowMapper可以做到。可使用接口实现类或匿名内部类(如果只使用一次)来实现RowMapper。示例如下:
//先创建实现t_users表与User对象映射的RowMapper实现类
public class UserRowMapper implements RowMapper<User> {
@Override
Public User mapRow(ResultSet rs,int rowNum) throws SQLException{
User user=new User();
user.setUserId(rs.getInt("id"));
user.setUserName(rs.getString("user_name"));
return user;
}
}
然后就可以使用Spring JDBC执行SQL查询了:
Stringsql="select* from t_users";
List<user> list=jdbcTemplate.query(sql, new UserRowMapper());
[考点] Spring JDBC框架
15. 什么是复制?
复制是将数据同步到多个服务器的过程,通过多个数据副本存储到多个服务器上,增加数据可用性。复制可以保障数据的安全性,灾难恢复,无须停机维护(如备份、重建索引、压缩),分布式读取数据。
[考点] MongoDB
16. Producer是否直接将数据发送到Broker的Leader?
Producer只需要将数据发送到Broker的Leader,为了帮助Producer做到这点,所有的Broker都可以及时的告知:哪些是活动的,目标Topic目标分区的Leader在哪。这样Producer就可以直接将消息发送到目的地了。
[考点] Kafka
17. 什么是TPS、QPS?
QPS和TPS是衡量网站性能和吞吐量的指标。
QPS(QueriesPerSecond),即每秒查询率是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。也就是最大吞吐能力。
TPS(TransactionsPerSecond),即每秒事务数。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出响应的过程,客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
QPS与TPS两者有所不同,一个TPS可能对应一个QPS,也可能对应多个QPS。对于一个页面的一次访问请求,形成一个TPS,但一次页面请求,如果发生多次对服务器的请求,那服务器完成的每一次请求,就是一个QPS。
[考点] 电商与互联网相关知识
18. Kafka的使用场景有哪些?
Kafka由于它的众多优点,有着广泛的应用场景。如下所述。
日志聚合:收集各种服务的日志写入Kafka的消息队列进行存储,各种日志处理应用通过Consumer订阅并获取队列中的消息进行处理。因为在生产环境中,为了监控日志,会有大量的日志需要传输存储检索(很多公司采用著名的日志系统ELK),在分布式应用中由于日志的数量级越来越大,存储起来对速度的要求也越来越高,这时使用消息队列作为中间件能解决大量日志传输的问题。
消息系统:由于其高吞吐量、高可靠性、高扩展性等特点,被广泛用作消息中间件。
网站活动跟踪:经常有互联网系统用Kafka来记录Web用户或App用户的各种活动数据,如浏览网页、搜索、点击等,将这些活动信息发布到Kafka的Topic中,然后Consumer通过订阅这些Topic来做实时处理或监控分析,或者加载到大数据系统做离线分析和数据挖掘。
运营指标监控:Kafka也适合用来记录生产运营监控数据。从各分布式应用中聚合数据然后集中处理。
系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作。如订单系统下单完成后给短信系统发送消息,订单系统只需要将消息发送到分布式消息队列即可。短信系统从消息队列获取消息后,根据消息内容给用户发送下单成功短信。短信系统与订单系统相互不直接耦合交互,甚至不需要知道对方系统的存在,都只单独与消息队列发生关系。这样就发挥了分布式系统的优点,从而提高了系统整体性能,也实现了应用系统之间的解耦合。同时,在消息队列两端,新增相关的业务系统也非常方便,对原有的系统和业务没有任何影响,也实现了整个系统的可扩展性。
流量削峰:一般用于秒杀或抢购活动中,在应用中加入Kafka或其他消息中间件缓存用户请求,来缓冲网站短时间内高流量带来的压力。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间崩溃,也不会影响主要业务的正常进行。
异步处理:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理,在需要的时候再去处理它们。
需要说明的是,Kafka的这些应用场景,通常也就是消息队列的应用场景(流式处理除外,流式处理常用于大数据处理,Kafka和大数据技术栈融合很紧密,其他消息队列极少与大数据生态融合)。
[考点] Kafka
19. 什么是Spring Bean?
Spring Bean是构成用户应用程序主干的Java对象。由Spring IoC容器管理,Spring Bean是基于用户提供给IoC容器的配置元数据创建、配置、装配和管理的,一个Spring Bean的定义包含容器所必需的所有配置元数据,包括如何创建一个Bean、Bean的生命周期详情及它的依赖。
[考点] Spring基础
20. AJAX的实现流程是怎样的?
实现流程如下。
1)创建XmlHttpRequest对象,也就是创建一个异步调用对象。
2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息。
3)设置响应HTTP请求状态变化的函数。
4)发送HTTP请求。
5)获取异步调用返回的数据。
6)使用JavaScript和DOM实现局部刷新。
[考点] AJAX与JavaScript