描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121386671
★ 《Offer来了:Java面试核心知识点精讲(原理篇)》作者全新力作
★ 目录细致,原理图和流程图直观形象
★ 提出4周5天3小时学习法,迅速掌握面试重点
★ 快速掌握Spring、Spring Cloud、Netty、ZooKeeper、Kafka、Hadoop的核心知识
★ 深度剖析HBase、Cassandra、ElasticSearch、Spark、Flink的重点难点
★ 实用性强,是一本面向Java开发者不可多得的面试指南
★ 一书在手,Offer我有!
本书是对Java程序员面试中常见的微服务、网络编程、分布式存储和分布式计算等必备知识点的总结,包括Spring原理及应用、Spring Cloud原理及应用、Netty网络编程原理及应用、ZooKeeper原理及应用、Kafka原理及应用、Hadoop原理及应用、HBase原理及应用、Cassandra原理及应用、ElasticSearch原理及应用、Spark原理及应用、Flink原理及应用。
本书共11章,第1章讲解Spring原理及应用,涉及Spring IoC原理、Spring AOP原理、Spring MVC原理、事务、MyBatis缓存等内容;第2章讲解Spring Cloud原理及应用,涉及Spring Boot、Spring Cloud Config、Eureka、Consul、Hystrix、Zuul和Spring Cloud链路监控等内容;第3章讲解Netty网络编程原理及应用;第4章讲解ZooKeeper原理及应用,涉及ZooKeeper选举机制、ZooKeeper数据模型和ZooKeeper应用场景等内容;第5章讲解Kafka原理及应用,涉及Kafka组成、Kafka数据存储设计、Kafka生产者并发设计、Kafka消费者并发设计,以及Kafka安装和应用等内容;第6章讲解Hadoop原理及应用,涉及HDFS、MapReduce、YARN等内容;第7章讲解HBase原理及应用,涉及HBase列式存储数据模型、HBase架构组成和HBase数据读写流程等内容;第8章讲解Cassandra原理及应用,涉及Cassandra数据模型、Gossip协议、NWR理论、一致性Hash、Cassandra数据副本策略和读写机制等内容;第9章讲解ElasticSearch原理及应用,涉及ElasticSearch数据模型、ElasticSearch分布式架构、ElasticSearch数据读写原理和段合并等内容;第10章讲解Spark原理及应用,涉及Spark特点、Spark模块组成、Spark运行机制,以及Spark RDD、Spark Streaming、Spark SQL、DataFrame、DataSet、Spark Structured Streaming的原理和使用等内容;第11章讲解Flink原理及应用,涉及Flink核心概念、Flink架构、Flink事件驱动模型、Flink数据分析应用和Flink基于状态的内存计算等内容。
本书可作为Java程序员的技术面试参考用书,也可作为Java程序员、大数据开发人员、技术经理和架构师的日常技术参考用书。
前 言
本书是对Java程序员面试中常见的微服务、网络编程、分布式存储和分布式计算等必备知识点的总结,包括Spring原理及应用、Spring Cloud原理及应用、Netty网络编程原理及应用、ZooKeeper原理及应用、Kafka原理及应用、Hadoop原理及应用、HBase原理及应用、Cassandra原理及应用、ElasticSearch原理及应用、Spark原理及应用、Flink原理及应用。希望读者能通过阅读本书对微服务、网络编程和分布式系统有更深入、系统和全面的理解。
面试官通常会在短短两小时内对面试者的知识结构进行全面了解,面试者在回答问题时如果拖泥带水且不能直击问题的本质,则很难充分表现自己,最终影响面试结果。针对这种情况,本书对Java分布式架构中常用的技术做了梳理和总结,在介绍知识点时重点介绍原理,同时辅以示例。本书在讲解知识点时不拖泥带水,力求精简,用115张原理图和流程图以非常直观的方式对Java程序员面试时常被问及的分布式架构核心知识点进行介绍。
章节架构
本书共11章,各章所讲内容如下。
第1章讲解Spring原理及应用,涉及Spring原理、Spring注解、Spring IoC原理、 Spring AOP原理、Spring MVC原理、事务、MyBatis缓存等内容。
第2章讲解Spring Cloud原理及应用,涉及Spring Boot、Spring Cloud Config、Eureka、Consul、Hystrix、Zuul和Spring Cloud链路监控等内容。
第3章讲解Netty网络编程原理及应用,涉及Reactor线程模型、Netty架构、Netty特性和Netty使用等内容。
第4章讲解ZooKeeper原理及应用,涉及ZooKeeper原理、ZooKeeper选举机制、ZooKeeper数据模型和ZooKeeper应用场景等内容。
第5章讲解Kafka原理及应用,涉及Kafka原理、Kafka组成、Kafka数据存储设计、Kafka生产者并发设计、Kafka消费者并发设计,以及Kafka安装和应用等内容。
第6章讲解Hadoop原理及应用,涉及HDFS、MapReduce、YARN等内容。
第7章讲解HBase原理及应用,涉及列式存储、HBase列式存储数据模型、HBase架构组成和HBase数据读写流程等内容。
第8章讲解Cassandra原理及应用,涉及Cassandra数据模型、Gossip协议、NWR理论、一致性Hash、Cassandra数据副本策略和读写机制等内容。
第9章讲解ElasticSearch原理及应用,涉及ElasticSearch数据模型、ElasticSearch分布式架构、ElasticSearch数据读写原理和段合并等内容。
第10章讲解Spark原理及应用,涉及Spark特点、Spark模块组成、Spark运行机制,以及Spark RDD、Spark Streaming、Spark SQL、DataFrame、DataSet、Spark Structured Streaming的原理和使用等内容。
第11章讲解Flink原理及应用,涉及Flink核心概念、Flink架构、Flink事件驱动模型、Flink数据分析应用和Flink基于状态的内存计算等内容。
阅读建议
本书目录细致,建议读者在阅读本书后以原理图和流程图为依据、以目录为参考温故而知新,达到融会贯通的目的。建议读者花4周进行细读,详细理解书中的知识点、代码和架构图,在每个章节阅读完成后都手绘原理图和流程图;在细读完成后再花5天进行复习,对照手绘的原理图回忆知识点,针对想不起来的知识点及时查漏补缺;在面试前再花3小时进行复习,以充分掌握本书知识点。这样,读者对书中每个知识点的广度和深度的理解就会更充分,在面试时可以胸有成竹、百战不殆。
致谢
感谢电子工业出版社博文视点的张国霞编辑,她的鼓励和引导对本书的写作和出版有很大的帮助,同时感谢李秀梅编辑对本书的细致编辑;感谢王晓东,是他关注并向编辑提出了本书的出版价值。
写技术书籍是很耗费精力的,笔者常常因为一行代码或者一张图能否准确表达含义而思考再三。出于工作的原因,笔者只能在晚上和周末写作,写作难度很大,所以十分感谢妻子张艳娇女士,没有她的鼓励和支持,本书很难顺利出版;也十分感谢家人和朋友在工作和生活中对笔者的关心和帮助。在这里,衷心地祝愿大家身体健康,万事如意。
本书主题虽然是Offer来了,但却对Java分布式架构的常用技术做了非常详细的梳理,并且结合了大量的原理图和流程图,让读者快速和学习了解这些常用技术,更以非常直观的方式对知识体系做了总结,方便读者在面试的时候有更全面的发挥,同时能够在工作中得到运用,非常值得大家购买和阅读。
《高可用可伸缩微服务架构》联合作者,《深入分布式缓存》联合作者 程超
微服务、网络编程、分布式系统等方面的知识,是每一个Java程序员都必须掌握的。本书深入浅出,使得读者们充分了解上述这些重要的知识点和底层逻辑,非常值得一读。
《漫画算法》作者,公众号“程序员小灰”运营者 魏梦舒
Java 程序员很大部分从事 Web 方向和大数据应用开发方向,对于后者来说,除了编程语言等基础知识,了解大数据组件也是一个重要的部分。本书涵盖了常用大数据组件的重要基础知识,对于相关从业人员是很好的读物。
奇安信资深研发工程师,《Elasticsearch源码解析与优化实战》作者 张超
1.8 事务
事务是Web应用中不可缺少的组件模型,它保证了用户操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily)。事务分本地事务和分布式事务两种。
1.8.1 本地事务
本地事务基于数据库资源实现,事务串行地在JDBC连接上执行,本地事务将事务处理局限在当前事务资源内。其特点是使用灵活但无法支持多数据源事务操作。在数据库连接中使用本地事务的代码示例如下。
public void transferAccount() {
Connection conn = null;
Statement stmt = null;
try{
conn = getDataSource().getConnection();
//step 1:将自动提交设置为false
//若设置为true,则数据库将会把每一次数据更新认定为一个事务并自动提交
conn.setAutoCommit(false);
stmt = conn.createStatement();
//step 2:操作A数据:将A账户中的金额减少500
stmt.execute(“update t_account set amount = amount – 500
where account_id = ‘A'”);
//step 3:操作B数据:将B账户中的金额增加500
stmt.execute(“update t_account set amount = amount 500
where account_id = ‘B'”);
//step 4:提交事务
conn.commit();
//转账的两步操作同时执行
System.out.printlinc(“transaction success”);
} catch(SQLException sqle){
//step 5:异常回滚:发生异常,回滚在本事务中的操作
conn.rollback();
//step 6:关闭并释放数据库资源
stmt.close();
conn.close();
}
}
在上述代码中,首先通过conn.setAutoCommit(false)设置数据库连接为非自动提交,然后分别提交了两条更新语句,最后通过conn.commit()提交事务。如果数据库操作成功,则事务完成;如果操作失败,则通过conn.rollback()回滚事务。
1.8.2 分布式事务
分布式事务(Distributed Transaction)提供了跨数据库的分布式事务操作的数据一致性,跨数据库的一致性包含同一类型数据库的多个数据库实例服务的一致性(例如多个MySQL的事务一致性)和多个不同类型数据库的数据一致性(例如MySQL和Oracle之间的事务一致性)两种情况。
Java事务编程接口(Java Transaction API,JTA)和Java事务服务(Java Transaction Service,JTS)为J2EE平台提供了分布式事务服务。分布式事务包括一个事务管理器(Transaction Manager)和一个或多个支持XA协议(XA协议是由X/Open组织提出的分布式事务的规范,XA规范主要定义了事务管理器和资源管理器之间的接口)的资源管理器(Resource Manager)。其中,事务管理器负责所有事务参与单元的协调与控制,资源管理器负责不同的数据库具体的事务执行操作。具体使用代码如下。
public void transferAccount() {
UserTransaction userTx = null;
//step 1:定义A、B数据库连接
Connection connA = null; Statement stmtA = null;
Connection connB = null; Statement stmtB = null;
try{
//step 2:获得Transaction管理对象
userTx = (UserTransaction)getContext().lookup(“java:comp/UserTransaction”);
connA = getDataSourceA().getConnection();//step 3.1:从数据库A中取得数据库连接
connB = getDataSourceB().getConnection();//step 3.2:从数据库B中取得数据库连接
userTx.begin(); //step 4:启动事务
stmtA = connA.createStatement();//step 5.1:操作A库数据:将A账户中的金额减少500
stmtA.execute(“update t_account set amount = amount – 500
where account_id = ‘A'”);
//step 5.2:操作B库数据:将B账户中的金额增加500
stmtB = connB.createStatement();
stmtB.execute(“update t_account set amount = amount 500
where account_id = ‘B'”);
userTx.commit();//step 6:提交事务
//提交事务:转账的两步操作同时执行(数据库A和数据库B中的数据被同时更新)
} catch(SQLException sqle){
//step 7:回滚事务,发生异常,回滚在本事务中的操作
userTx.rollback();//数据库A和数据库B中的数据更新被同时撤销
}
在上述代码中,首先定义了一个分布式事务管理器UserTransaction,然后定义了2个连接池connA和connB,接着通过userTx.begin()启动事务并向两个数据库连接提交2个更新请求,最后通过userTx.commit()统一提交事务。如果执行成功,则事务完成;如果失败,则通过userTx.rollback()回滚事务。
1.8.3 两阶段提交协议
两阶段提交协议用于保证分布式事务的原子性,即所有数据库节点要么全部都执行要么全部不执行,其执行过程主要分为两个阶段:第一阶段为准备阶段,第二阶段为提交阶段,数据库两阶段提交协议如图1-6所示。
图1-6 数据库两阶段提交协议
1.准备阶段
事务管理器(事务协调者)为每个资源管理器(事务参与者)都发送Prepare消息,每个参与者要么都直接返回失败(例如权限验证失败),要么都在本地执行事务,写本地的redo和undo日志但是不提交,以达到“万事俱备,只欠东风”的状态。
2.提交阶段
如果事务协调者收到了某个事务参与者的事务操作失败回复或等待事务参与者反馈超时,则事务协调者为每个事务参与者发送回滚(Rollback)消息,事务参与者再执行回滚本地事务操作;如果事务协调者在规定时间内收到了所有事务参与者的成功回复,则发送提交(Commit)消息,事务参与者在本地执行事务提交操作并执行事务。
两阶段提交的目的是尽可能晚地提交事务,在提交事务前尽可能确保每个数据库都正常运行,并确保该事务对应的SQL语句能够在每个数据库上都正常执行,同时将数据的写日志操作提前完成,防止事务执行过程中发生意外。事务的执行和释放是在JPA中基于锁来实现控制的。
评论
还没有评论。