描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302676874
《Java应用开发关键技术与面试技巧》从架构师与面试官的双重视角出发,全面而系统地梳理了当前主流的Java应用开发关键技术及面试中可能涉及的核心知识点。内容覆盖基本概念、技术原理,直至项目实践和解决方案,为读者提供了详尽且实用的指导。此外,书中还收录了大量高频面试题,供候选人进行实战演练。
随着Java生态系统的迅速发展,企业在招聘过程中对候选人的专业能力提出了更高的要求。对于求职者而言,能否深入理解并掌握相关技术的广度与深度,往往成为决定其能否脱颖而出的关键因素之一。通过阅读《Java应用开发关键技术与面试技巧》,不仅能够帮助您提升自身的软件开发技能,还能让您在激烈的求职竞争环境中更好地了解行业需求,明确个人定位,解决困惑,从而最终赢得理想的工作机会。
《Java应用开发关键技术与面试技巧》全面介绍了现代Java应用开发核心技术和最佳实践,旨在帮助读者掌握企业级Java应用开发技术并能够成功地应对名企的面试和挑战。《Java应用开发关键技术与面试技巧》共19章,内容主要包括Spring框架、MyBatis与ORM、高并发处理、分布式协调服务、Dubbo框架、缓存技术、消息队列、数据库分片、分布式事务、NoSQL数据库、微服务架构、服务治理、容错机制、API网关。除每章章末提供的核心知识点和面试题外,《Java应用开发关键技术与面试技巧》还单独就面试列出一章“面试筹划”,从简历构造、面试攻略、面试心态、面试刷题、面试技巧、面试跟进以及面试总结,详尽地指导读者了解整个面试过程。
《Java应用开发关键技术与面试技巧》不仅覆盖Java应用开发的核心技术,还结合丰富的案例分析和面试指导,既适合想学习Java企业级开发的在校学生和程序员,也适合准备Java技术面试的求职者阅读。
第1篇 应用框架
第 1 章 Spring 2
1.1 Spring概述 2
1.1.1 Spring是什么 2
1.1.2 Spring的优点是什么 3
1.2 IoC 3
1.2.1 软件设计的七大原则分别是什么 4
1.2.2 依赖倒置原则与案例分析 5
1.2.3 控制反转与案例分析 6
1.2.4 Spring IoC的配置方式有哪些 11
1.2.5 BeanFactory是什么 18
1.2.6 FactoryBean及其应用案例 23
1.2.7 BeanDefinition是什么 34
1.2.8 ApplicationContext是什么 54
1.2.9 Spring IoC的启动过程是什么 60
1.3 AOP 82
1.3.1 AOP是什么 82
1.3.2 企业开发中常用的AOP技术 83
1.3.3 JDK动态代理使用案例 84
1.3.4 JDK动态代理的工作原理 87
1.3.5 CGLib动态代理使用案例 91
1.3.6 CGLib动态代理的工作原理 93
1.3.7 Spring AOP使用案例 104
1.3.8 Spring AOP代理方式的选择 107
1.4 Spring事务管理 108
1.4.1 事务的ACID特性 108
1.4.2 事务并发执行引发的问题 109
1.4.3 事务隔离级别及案例分析 109
1.4.4 Spring事务传播行为 115
1.4.5 Spring事务使用案例 116
1.4.6 Spring Boot自动事务配置 118
1.4.7 Spring事务管理原理 128
1.5 Spring Web MVC 146
1.5.1 Spring Boot搭建MVC案例 146
1.5.2 Spring MVC的工作原理及关键代码分析 148
1.6 Spring面试押题 165
1.6.1 Spring IoC的设计思想是什么 166
1.6.2 BeanFactory和FactoryBean有什么区别 166
1.6.3 BeanFactory和ApplicationContext有什么区别 166
1.6.4 Spring Bean的生命周期包含哪些过程 167
1.6.5 Spring Bean的作用域有哪几种 167
1.6.6 Spring如何解决循环依赖 168
1.6.7 Spring的自动装配是如何实现的 168
1.6.8 Spring框架中使用到哪些常用的设计模式 168
1.6.9 Spring框架中有哪些类型的事件 169
1.6.10 什么是AOP 169
1.6.11 引入AOP能解决什么问题 169
1.6.12 项目中使用AOP的场景 170
1.6.13 AOP中有哪些比较重要的概念 170
1.6.14 什么是JDK动态代理 170
1.6.15 什么是CGLib动态代理 171
1.6.16 JDK动态代理与CGLib动态代理有什么区别 171
1.6.17 Spring AOP中有哪些Advice类型 171
1.6.18 动态代理与静态代理的区别是什么 172
1.6.19 什么是事务,为什么需要事务 172
1.6.20 事务有哪些特性 172
1.6.21 MySQL支持哪些事务隔离级别 173
1.6.22 Spring中有哪些事务传播行为 173
1.6.23 Spring事务在什么场景下会失效 174
1.6.24 Spring事务管理遇到哪些异常不会回滚 174
1.6.25 什么是Spring MVC 174
1.6.26 Spring MVC的主要组件有哪些 174
1.6.27 DispatcherServlet是什么,它有什么作用 175
1.6.28 Spring MVC中的控制器是不是线程安全的 175
1.6.29 Spring MVC的工作流程 175
1.6.30 Spring MVC与Struts2有哪些异同点 176
第 2 章 MyBatis 177
2.1 MyBatis概述 177
2.2 Spring Boot集成MyBatis案例 178
2.3 使用MyBatis Generator案例分析 181
2.4 MyBatis缓存分为哪几种 184
2.5 MyBatis一级缓存有哪些特性 185
2.5.1 一级缓存默认是开启的 185
2.5.2 一级缓存可以优化查询效率 185
2.5.3 一级缓存会因修改而失效 186
2.5.4 一级缓存仅在会话内共享 188
2.6 MyBatis一级缓存的原理是什么 189
2.6.1 SqlSession分析 190
2.6.2 SqlSessionFactory分析 192
2.6.3 Executor分析 192
2.6.4 Cache分析 193
2.6.5 一级缓存执行原理分析 194
2.7 MyBatis二级缓存有哪些特性 200
2.7.1 二级缓存非默认开启 200
2.7.2 在事务提交前二级缓存不生效 201
2.7.3 在事务提交后二级缓存会生效 202
2.7.4 当发生更新时二级缓存会被刷新 204
2.8 MyBatis二级缓存的原理是什么 205
2.9 如何编写MyBatis插件 211
2.9.1 实现Interceptor接口 211
2.9.2 MyBatis插件植入 212
2.9.3 MyBatis插件执行逻辑 214
2.10 简述MyBatis执行SQL的过程 215
2.10.1 MyBatis创建代理对象分析 216
2.10.2 MyBatis代理对象逻辑分析 218
2.10.3 SQL语句执行过程分析 223
2.11 MyBatis面试押题 227
2.11.1 什么是MyBatis 227
2.11.2 MyBatis有哪些优缺点 227
2.11.3 MyBatis框架的适用场景有哪些 227
2.11.4 MyBatis与Hibernate有哪些异同点 228
2.11.5 MyBatis中的#{}和${}的区别是什么 228
2.11.6 Mapper接口的工作原理是什么 229
2.11.7 MyBatis分页插件的原理是什么 230
2.11.8 简述MyBatis缓存的工作原理 231
2.11.9 为什么MyBatis是半自动ORM框架 231
2.11.10 如何提升基于MyBatis开发的应用程序的性能 231
2.11.11 MyBatis如何实现数据库的读写分离 232
第2篇 分布式高并发
第 3 章 高并发分流 234
3.1 分布式架构概念解释 234
3.2 企业系统架构的演进历程 235
3.2.1 单机架构 235
3.2.2 第一次演进:Web服务器与数据库独立部署 236
3.2.3 第二次演进:引入本地缓存和分布式缓存 237
3.2.4 第三次演进:引入反向代理 237
3.2.5 第四次演进:引入数据库读写分离 238
3.2.6 第五次演进:引入按业务拆分数据库 238
3.2.7 第六次演进:引入分库分表 240
3.2.8 第七次演进:引入使用LVS或F5 240
3.2.9 第八次演进:通过DNS实现机房间的负载均衡 241
3.2.10 第九次演进:引入NoSQL/NewSQL等技术 242
3.2.11 第十次演进:应用拆分 243
3.2.12 第十一次演进:引入ESB架构 244
3.2.13 第十二次演进:微服务拆分 245
3.2.14 第十三次演进:引入容器化架构 246
3.2.15 第十四次演进:引入云平台架构 247
3.3 Nginx反向代理与负载均衡 248
3.3.1 正向代理 249
3.3.2 反向代理 249
3.4 Nginx配置详解 251
3.5 OpenResty 255
3.5.1 OpenResty的安装 255
3.5.2 OpenResty限流案例 256
3.6 高并发分流面试押题 258
3.6.1 什么是分布式架构 258
3.6.2 什么是面向服务的架构 258
3.6.3 什么是微服务架构 258
3.6.4 SOA架构和微服务架构的区别和联系 259
3.6.5 什么是容器化架构 259
3.6.6 正向代理与反向代理的区别是什么 260
3.6.7 微服务拆分的依据 260
3.6.8 OpenResty和Nginx的区别与联系 261
3.6.9 如何使用Nginx实现灰度发布 261
第 4 章 分布式协调服务 263
4.1 ZooKeeper的基础知识 263
4.1.1 什么是ZooKeeper 263
4.1.2 什么是CAP理论 263
4.1.3 ZooKeeper对CAP的支持 265
4.1.4 ZooKeeper与其他注册中心对比 265
4.2 ZooKeeper有哪些节点类型 265
4.3 ZooKeeper节点有哪几种角色 266
4.4 什么是ZooKeeper的Watch机制 267
4.5 什么是ZooKeeper ACL权限控制 268
4.6 Paxos算法的原理是什么 269
4.6.1 分布式系统面临的挑战 269
4.6.2 分布式系统难题的转换 270
4.6.3 Paxos算法的执行过程 271
4.6.4 Paxos算法示例 273
4.7 基于Paxos的优化算法有哪些 275
4.7.1 Multi Paxos算法 275
4.7.2 Fast Paxos算法 275
4.8 ZAB协议的原理是什么 276
4.8.1 原子广播 276
4.8.2 故障恢复 278
4.8.3 ZXID生成规则 279
4.9 ZooKeeper代码分析 279
4.9.1 ZooKeeper单机模式代码分析 281
4.9.2 ZooKeeper集群模式代码分析 284
4.9.3 ZooKeeper Leader选举代码分析 288
4.10 ZooKeeper面试押题 297
4.10.1 什么是ZooKeeper 297
4.10.2 ZooKeeper的节点类型有哪些 298
4.10.3 ZooKeeper保障的是CP还是AP机制 298
4.10.4 ZooKeeper是如何实现通知机制的 298
4.10.5 ZooKeeper的节点有哪几种角色 299
4.10.6 简述Paxos算法的原理 299
4.10.7 简述ZAB协议的原理 299
4.10.8 如何利用ZooKeeper实现分布式锁 300
4.10.9 ZooKeeper在哪些中间件中被使用 300
4.10.10 ZooKeeper脑裂问题及其处理办法 301
第 5 章 Dubbo 302
5.1 Dubbo架构解析 302
5.1.1 Dubbo组件架构 302
5.1.2 Dubbo分层架构 303
5.2 Dubbo如何实现集群容错 304
5.2.1 Failover Cluster 304
5.2.2 Failfast Cluster 304
5.2.3 Failsafe Cluster 304
5.2.4 Failback Cluster 304
5.2.5 Forking Cluster 304
5.2.6 Broadcast Cluster 305
5.2.7 Available Cluster 305
5.2.8 Mergeable Cluster 305
5.2.9 ZoneAware Cluster 305
5.2.10 Dubbo集群容错代码分析 305
5.3 Dubbo如何实现负载均衡 308
5.3.1 加权随机策略 308
5.3.2 加权轮询策略 308
5.3.3 加权最少活跃策略 309
5.3.4 加权最短响应策略 309
5.3.5 一致性哈希策略 309
5.4 Dubbo的线程模型是什么 312
5.4.1 IO线程 313
5.4.2 业务线程 314
5.5 Dubbo跨多注册中心的能力 314
5.6 Dubbo服务分组 319
5.7 Dubbo SPI机制的原理是什么 320
5.7.1 SPI和API的区别和联系 320
5.7.2 JDK SPI机制的实现 320
5.7.3 JDK SPI机制原理分析 322
5.7.4 Dubbo SPI机制的使用方式 327
5.7.5 Dubbo SPI机制原理分析 331
5.8 Dubbo面试押题 336
5.8.1 Dubbo的核心功能有哪些 336
5.8.2 Dubbo的核心组件有哪些 337
5.8.3 简述Dubbo服务注册与发现的流程 337
5.8.4 简述主流RPC框架的异同点 338
5.8.5 Dubbo支持哪些负载均衡策略 338
5.8.6 Dubbo负载均衡在客户端还是服务端实现 338
5.8.7 Dubbo支持的通信协议 338
5.8.8 简述Dubbo SPI与Java SPI的异同点 339
5.8.9 Dubbo如何实现服务提供方失效移除 339
5.8.10 如何合理地设置Dubbo超时时间 340
第 6 章 Redis 341
6.1 Redis常用的数据类型 341
6.1.1 String 341
6.1.2 List 342
6.1.3 Hash 342
6.1.4 Set 343
6.1.5 Zset 343
6.2 Redis支持哪些数据结构 343
6.2.1 简单动态字符串 344
6.2.2 链表 344
6.2.3 跳跃表 345
6.2.4 压缩列表 345
6.2.5 哈希表 346
6.2.6 整数集合 348
6.3 Redis如何实现持久化 349
6.3.1 RDB 349
6.3.2 AOF 351
6.4 Redis主从部署架构的原理是什么 352
6.5 Redis哨兵部署架构 353
6.5.1 Redis哨兵架构的工作流程 353
6.5.2 主观下线 354
6.5.3 客观下线 354
6.5.4 Redis哨兵仲裁 355
6.5.5 哨兵领导者选举规约 355
6.5.6 哨兵领导者选举过程 356
6.5.7 Redis哨兵架构故障转移 356
6.6 Redis集群部署架构 357
6.6.1 Redis集群架构的工作原理 357
6.6.2 Redis集群架构数据分片 358
6.6.3 Redis集群架构搭建 358
6.6.4 Redis集群架构扩容 362
6.6.5 Redis集群架构收缩 368
6.6.6 Redis集群架构选举 369
6.7 缓存一致性解决方案有哪些 369
6.7.1 方案一:先更新数据库后更新缓存 369
6.7.2 方案二:先更新缓存后更新数据库 370
6.7.3 方案三:先删除缓存后更新数据库 370
6.7.4 方案四:先更新数据库后删除缓存 371
6.7.5 方案五:缓存延时双删解决方案 372
6.7.6 方案六:监听数据库解决方案 374
6.8 缓存预热方案有哪些 374
6.9 缓存穿透及解决方案 375
6.10 缓存击穿及解决方案 377
6.11 缓存雪崩及解决方案 377
6.12 布隆过滤器及适用场景 378
6.13 热点缓存识别及解决方案 380
6.13.1 热点缓存识别 380
6.13.2 热点缓存解决方案 380
6.14 Redis面试押题 381
6.14.1 Redis是什么 381
6.14.2 简述企业开发中使用到Redis缓存的场景 381
6.14.3 Redis与Guava Cache有哪些异同点 382
6.14.4 Redis与Memcached相比有哪些异同点 383
6.14.5 Redis为什么能实现高性能 384
6.14.6 Redis支持哪些数据类型 384
6.14.7 Redis内部的数据结构有哪些 384
6.14.8 如何使用Redis实现计数器 384
6.14.9 如何使用Redis实现消息队列的发布订阅 384
6.14.10 如何使用Redis实现分布式锁 385
6.14.11 Redis支持的持久化机制有哪些 385
6.14.12 Redis过期键的删除策略有哪些 386
6.14.13 Redis的内存淘汰策略有哪些 386
6.14.14 Redis的线程模型是什么 386
6.14.15 Redis事务有哪些优缺点 387
6.14.16 Redis的部署架构有哪些 387
6.14.17 什么是缓存穿透 387
6.14.18 什么是缓存击穿 388
6.14.19 什么是缓存雪崩 388
6.14.20 Jedis与Redisson有哪些异同点 388
第 7 章 RocketMQ 389
7.1 核心概念 389
7.1.1 Producer 389
7.1.2 Consumer 390
7.1.3 Broker 390
7.1.4 Topic 390
7.1.5 Message Queue 391
7.1.6 Tag 391
7.1.7 NameServer 391
7.1.8 集群消费 391
7.1.9 广播消费 391
7.1.10 分区顺序消息 391
7.1.11 全局顺序消息 391
7.1.12 RocketMQ消息模型 392
7.2 RocketMQ如何实现事务消息 393
7.3 RocketMQ如何实现顺序消息 396
7.4 RocketMQ如何实现延迟消息 400
7.5 RocketMQ如何实现消息重试 404
7.5.1 生产者消息重试 404
7.5.2 消费者消息重试 404
7.5.3 消息幂等 405
7.6 RocketMQ如何实现死信消息 405
7.7 RocketMQ如何实现消息过滤 406
7.7.1 基于tag的消息过滤 406
7.7.2 基于SQL表达式的消息过滤 408
7.7.3 基于消费者端的消息过滤 410
7.8 RocketMQ如何实现消息负载均衡 410
7.8.1 生产者端负载均衡 410
7.8.2 消费者端负载均衡 411
7.9 如何解决消息积压问题 411
7.9.1 消息积压的场景 411
7.9.2 消息积压的解决方案 412
7.10 RocketMQ面试押题 412
7.10.1 企业开发中使用MQ的场景有哪些 412
7.10.2 简述RocketMQ的架构 413
7.10.3 RocketMQ如何实现消息过滤 413
7.10.4 如何保障RocketMQ的消息不重不丢 413
7.10.5 RocketMQ如何实现事务消息 413
7.10.6 什么是RocketMQ的半消息 413
7.10.7 RocketMQ的刷盘机制是什么 414
7.10.8 RocketMQ如何实现负载均衡 414
7.10.9 什么是RocketMQ的死信队列 414
7.10.10 什么是消息幂等 414
7.10.11 什么是RocketMQ的推模式和拉模式 415
7.10.12 RocketMQ如何实现顺序消息 415
7.10.13 RocketMQ如何实现延迟消息 415
7.10.14 简述RocketMQ、RabbitMQ和Kafka之间的异同点 415
第 8 章 Kafka 417
8.1 Kafka的核心概念 417
8.1.1 Kafka的基本概念 417
8.1.2 Kafka的核心API 418
8.2 Kafka消息处理原理 419
8.2.1 Kafka架构原理 419
8.2.2 Kafka的存储机制 420
8.2.3 Kafka副本机制 423
8.2.4 Kafka ISR机制 423
8.2.5 Kafka HW&LEO 424
8.3 Kafka有哪些消息语义 425
8.3.1 at most once 425
8.3.2 at least once 425
8.3.3 exactly once 426
8.4 Kafka消息丢失的场景有哪些 426
8.4.1 生产者消息丢失 426
8.4.2 Broker消息丢失 426
8.4.3 消费者消息丢失 427
8.5 Kafka控制器的选举流程是什么 427
8.6 Kafka分区副本的选举策略有哪些 430
8.7 Kafka的协调器有哪些 430
8.7.1 消费者协调器 431
8.7.2 组协调器 431
8.8 Kafka的分区重平衡机制有哪些 433
8.8.1 RangeAssignor 433
8.8.2 RoundRobinAssignor 434
8.8.3 StickyAssignor 434
8.9 Kafka消费者的提交方式有哪些 434
8.10 Kafka面试押题 435
8.10.1 Kafka是什么 435
8.10.2 Kafka Replicas是如何管理的 435
8.10.3 Kafka中如何确定当前应该读取什么消息 436
8.10.4 Kafka生产者发送消息有哪些模式 437
8.10.5 Kafka如何实现负载均衡 437
8.10.6 Kafka的Topic分区数越多越好吗 438
8.10.7 如何增强Kafka消费者的消费能力 439
8.10.8 Kafka控制器是什么 439
8.10.9 Kafka为什么高性能 440
8.10.10 Kafka如何使用零拷贝 441
第 9 章 ShardingSphere 442
9.1 ShardingSphere的组成 442
9.1.1 ShardingSphere-JDBC 442
9.1.2 ShardingSphere-Proxy 443
9.1.3 ShardingSphere-Sidecar 443
9.2 核心概念 444
9.2.1 分库 444
9.2.2 分表 445
9.2.3 垂直分片 445
9.2.4 水平分片 445
9.2.5 表 446
9.2.6 数据节点 447
9.2.7 分片算法 447
9.3 ShardingSphere如何实现分布式主键 448
9.4 ShardingSphere支持哪些类型的事务 449
9.4.1 LOCAL事务 449
9.4.2 XA事务 450
9.4.3 BASE事务 451
9.5 ShardingSphere如何实现读写分离 451
9.5.1 主库和从库 452
9.5.2 主从同步 452
9.5.3 ShardingSphere读写分离支持 452
9.6 ShardingSphere支持哪些数据分片算法 452
9.7 ShardingSphere-JDBC的工作原理是什么 453
9.7.1 SQL解析 453
9.7.2 SQL路由 454
9.7.3 SQL改写 454
9.7.4 SQL执行 454
9.7.5 结果归并 454
9.8 ShardingSphere面试押题 455
9.8.1 ShardingSphere是什么 455
9.8.2 ShardingSphere支持哪些数据库 455
9.8.3 企业开发中哪些场景会用到ShardingSphere 456
9.8.4 ShardingSphere的核心功能有哪些 456
9.8.5 ShardingSphere支持的数据分片技术有哪些 457
9.8.6 数据分片技术有哪些优缺点 457
9.8.7 ShardingSphere与Mycat有哪些异同点 458
9.8.8 数据分片技术和分布式数据库之间如何权衡 459
9.8.9 如何优化一张大数据量表的查询速度 459
第 10 章 分布式事务 461
10.1 什么是强一致性事务 461
10.2 分布式架构理论基础 462
10.2.1 什么是CAP理论 462
10.2.2 什么是BASE理论 463
10.2.3 什么是2PC 463
10.2.4 什么是3PC 464
10.3 Atomikos分布式事务 465
10.3.1 TransactionsEssentials 466
10.3.2 ExtremeTransactions 467
10.4 TCC分布式事务 468
10.4.1 2PC和3PC的缺点 468
10.4.2 TCC的原理 468
10.4.3 TCC的改进 469
10.5 Saga分布式事务 469
10.5.1 Saga编排模式 470
10.5.2 Saga控制模式 471
10.6 Seata分布式事务 473
10.6.1 AT一阶段 474
10.6.2 AT二阶段 475
10.6.3 AT写隔离 475
10.6.4 AT读隔离 477
10.7 基于MQ的分布式事务 478
10.7.1 可靠的消息生产和消费 478
10.7.2 非可靠的消息生产和消费 480
10.8 分布式事务面试押题 481
10.8.1 什么是分布式事务 481
10.8.2 企业开发中产生分布式事务的场景有哪些 481
10.8.3 强一致性、弱一致性和最终一致性的异同点 482
10.8.4 什么是CAP理论 482
10.8.5 什么是BASE理论 482
10.8.6 分布式事务常见的解决方案有哪些 483
10.8.7 简述工作中遇到的分布式事务场景及挑战 483
10.8.8 简述常见的中间件及其面临的分布式事务问题 484
第 11 章 MongoDB 485
11.1 MongoDB支持哪些数据类型 485
11.2 MongoDB的核心概念 486
11.2.1 数据库 486
11.2.2 集合 486
11.2.3 文档 487
11.2.4 数据字段/域 487
11.2.5 索引 487
11.2.6 主键 488
11.3 MongoDB支持的索引类型 488
11.3.1 单键索引 488
11.3.2 复合索引 489
11.3.3 多键索引 489
11.3.4 地理空间索引 489
11.3.5 全文索引 489
11.3.6 哈希索引 489
11.4 MongoDB的执行计划 490
11.5 MongoDB的索引原理是什么 494
11.6 MongoDB集群搭建 495
11.6.1 主从复制架构 495
11.6.2 副本集架构 496
11.6.3 分片集群架构 497
11.7 MongoDB面试押题 498
11.7.1 什么是MongoDB 498
11.7.2 简述MongoDB与传统关系数据库的异同点 499
11.7.3 简述MongoDB与MySQL数据库中的概念对比 500
11.7.4 简述MongoDB与CouchBase的异同点 500
11.7.5 MongoDB中的分析器有什么用途 501
11.7.6 MongoDB的主节点和从节点如何实现数据同步 501
11.7.7 MongoDB的ObjectId生成规则是什么 502
11.7.8 企业开发中使用MongoDB的场景有哪些 502
11.7.9 在MongoDB中如何处理事务 502
11.7.10 MongoDB的写关注是什么 503
第 12 章 Elasticsearch 504
12.1 Elasticsearch的特性有哪些 504
12.2 核心概念 504
12.2.1 索引 504
12.2.2 索引别名 505
12.2.3 类型 506
12.2.4 文档 506
12.2.5 分词 506
12.2.6 分词器 507
12.2.7 keyword 514
12.2.8 text 514
12.3 什么是倒排索引 514
12.3.1 正排索引 515
12.3.2 倒排索引 515
12.3.3 单词索引 516
12.3.4 FST 517
12.4 Elasticsearch如何实现集群发现 519
12.5 分片和副本 520
12.5.1 分片 520
12.5.2 副本 520
12.5.3 索引写入流程 520
12.6 Elasticsearch的存储原理是什么 521
12.6.1 Segment 521
12.6.2 文档写入 522
12.6.3 Refresh 523
12.6.4 Translog 523
12.6.5 Segment合并 525
12.7 Elasticsearch如何实现一致性 526
12.7.1 写一致性 526
12.7.2 读一致性 526
12.8 Elasticsearch面试押题 526
12.8.1 什么是Elasticsearch 526
12.8.2 什么是倒排索引 527
12.8.3 Elasticsearch与Solr有哪些异同点 527
12.8.4 Elasticsearch支持的分词器有哪些 528
12.8.5 Elasticsearch中的keyword和text有什么区别 529
12.8.6 Elasticsearch中的query和filter有什么区别 529
12.8.7 简述Elasticsearch的数据写入流程 530
12.8.8 Elasticsearch的数据是如何存储的 531
12.8.9 Elasticsearch如何保证读写一致性 531
12.8.10 简述Elasticsearch的分布式原理 532
12.8.11 如何使用Elasticsearch解决深分页问题 533
12.8.12 什么是Elasticsearch Bulk API 534
第3篇 微服务架构
第 13 章 微服务架构演进 536
13.1 单体架构 536
13.2 垂直架构 537
13.3 面向服务的架构 537
13.4 微服务架构 539
13.5 微服务架构演进面试押题 540
13.5.1 什么是微服务架构 540
13.5.2 微服务架构常用的RPC框架有哪些 540
13.5.3 微服务架构常用的注册中心框架有哪些 541
13.5.4 微服务架构常用的负载均衡框架有哪些 542
13.5.5 微服务架构常用的网关框架有哪些 543
13.5.6 微服务架构常用的流量管控框架有哪些 543
13.5.7 微服务架构常用的配置中心框架有哪些 544
13.5.8 简述企业开发中的微服务架构 544
第 14 章 Eureka 546
14.1 Eureka的核心概念 546
14.1.1 服务提供方 546
14.1.2 服务消费方 546
14.1.3 Eureka Server 546
14.1.4 Eureka Client 546
14.2 Eureka的工作流程是什么 547
14.3 Eureka的集群原理是什么 548
14.4 Eureka面试押题 548
14.4.1 什么是Eureka 548
14.4.2 Eureka中的服务消费方如何感知服务提供方 549
14.4.3 Eureka中的服务消费方如何选择服务提供方 549
14.4.4 Eureka中的服务消费方如何感知服务提供方下线 550
14.4.5 简述Eureka、Nacos和ZooKeeper的异同点 550
14.4.6 Eureka保证了CAP中的哪几点 551
第 15 章 Ribbon 552
15.1 Ribbon的工作原理是什么 552
15.2 Ribbon支持哪些负载均衡策略 553
15.2.1 RoundRobinRule 553
15.2.2 WeightedResponseTimeRule 554
15.2.3 RandomRule 555
15.2.4 BestAvailableRule 556
15.2.5 RetryRule 557
15.2.6 AvailabilityFilteringRule 558
15.2.7 ZoneAvoidanceRule 559
15.3 Ribbon面试押题 560
15.3.1 什么是Ribbon 560
15.3.2 Ribbon与Nginx有哪些异同点 560
15.3.3 Ribbon支持哪些负载均衡策略 562
15.3.4 如何实现自定义的Ribbon负载均衡策略 562
第 16 章 OpenFeign 563
16.1 OpenFeign与Feign有哪些异同点 563
16.2 OpenFeign的架构原理 564
16.3 OpenFeign的实现原理是什么 564
16.4 OpenFeign面试押题 567
16.4.1 什么是OpenFeign 567
16.4.2 OpenFeign与Feign有哪些异同点 568
16.4.3 OpenFeign的工作原理是什么 568
16.4.4 OpenFeign与Dubbo有哪些异同点 568
16.4.5 OpenFeign与RestTemplate有什么区别 569
第 17 章 Hystrix 571
17.1 Hystrix的核心概念 571
17.1.1 限流 571
17.1.2 隔离 571
17.1.3 降级 572
17.1.4 熔断 572
17.1.5 缓存 572
17.1.6 合并 573
17.2 Hystrix的工作流程是什么 573
17.3 Hystrix面试押题 574
17.3.1 什么是Hystrix 574
17.3.2 Hystrix的工作流程是什么 574
17.3.3 Hystrix如何实现请求缓存 575
17.3.4 Hystrix如何实现限流 575
17.3.5 Hystrix如何实现熔断 575
17.3.6 什么场景会触发Hystrix降级 576
17.3.7 简述Hystrix、Sentinel和Resilience4j之间的异同点 576
第 18 章 API网关 578
18.1 API网关概述 578
18.2 多种API网关对比 579
18.2.1 Nginx 579
18.2.2 Zuul 579
18.2.3 Kong 580
18.2.4 Gateway 581
18.3 API网关面试押题 583
18.3.1 什么是API网关 583
18.3.2 对比常见的API网关 583
18.3.3 如何在网关实现用户统一鉴权 583
18.3.4 如何在网关实现灰度发布 584
第4篇 面试技巧
第 19 章 面试筹划 586
19.1 简历构造 586
19.1.1 个人信息 586
19.1.2 个人优势 588
19.1.3 期望职位 588
19.1.4 工作经历 589
19.1.5 项目经历 589
19.1.6 教育经历 590
19.2 面试攻略 591
19.2.1 海投简历 591
19.2.2 小试牛刀 591
19.2.3 厚积薄发 592
19.3 面试心态 593
19.3.1 候选人分析 593
19.3.2 面试官分析 595
19.4 面试刷题 597
19.4.1 机试刷题 597
19.4.2 现场面试刷题 597
19.5 面试技巧 599
19.5.1 合格性面试 599
19.5.2 合适性面试 599
19.5.3 冰山模型 600
19.5.4 面试方法 601
19.6 面试跟进 603
19.7 面试总结 604
参考文献 607
随着Java生态系统的快速发展,软件开发行业对软件质量和性能等方面的诉求也在不断增加,这导致企业在招聘时对候选人的专业能力要求更为严格。如何在当前激烈的招聘竞争中脱颖而出,获得满意的Offer,这是每个求职者都非常关注的问题。
作为曾面试超过400多位应聘者的一个资深开发人,笔者写作本书的目的,一是帮助读者梳理Java企业级开发中用到的关键技术,以提升读者的技能水平;二是试图为读者提供一个了解行业需求的面试指南,以帮助读者获得满意的工作机会。
以下是笔者的一些想法。
【宏观视角】
你不应该只将自己定位成执行代码的机器,而应该主动培养自己的架构能力和全局视角,以实现向架构师的成功转型。
本书介绍并总结了目前行业主流的Java应用开发技术,包括概念、原理剖析、产品优缺点和技术选型等,旨在帮助读者构建全局的系统架构视角,使你在面试时可以站在架构师或团队Leader的视角与面试官就技术、架构、管理、团队和职场等方面进行深入交流。
例如本书第3章介绍高并发分流,笔者从20多年的Web 1.0时代开始讲起,逐步讲解企业系统架构的演进过程,分析为什么现在大多数企业都要采用分布式、为什么越来越多的面试题都跟高并发相关。
又如本书第9章介绍ShardingSphere,该技术并非现代企业的技术,因为很多企业的用户体量、数据规模还很小,还没有ShardingSphere的用武之地。笔者讲解了在什么样的业务场景、用户体量和数据规模下选择ShardingSphere是明智之举。
本书的定位不仅仅是为了使你可以应对日常工作,还为你自身的发展和未来有可能应对的高并发、海量数据场景做准备。
【微观洞察】
开源项目提供了透明度,使得开发者可以查看并学习技术组件的内部实现,从而更好地掌握和使用这些技术。但开源软件也有一定的弊端,如开源软件是技术爱好者利用业余时间兼职创作的,少不了有一些缺陷(bug)。为了帮助读者理解复杂系统的工作方式,在系统出现故障时快速分析和定位问题,本书对很多工具或技术进行了源码级别的分析,其意义在于:
(1)源码解读可以帮助你加深对编程语言、设计模式、算法和数据结构等专业知识的理解。
(2)在技术面试中展示对源码的熟悉和理解可以提高你的职业竞争力,增加获得理想工作的 机会。
(3)对源码的深入理解可以提升个人在团队中的技术领导力,使你能够更好地指导和带领团队。
(4)随着技术深度的提升,你将更有可能获得晋升机会,向架构师、技术经理等高级职位迈进。
(5)深入理解源码可以增强你的技术决策能力,帮助你在项目中做出更明智的技术选型。
例如本书第1章介绍Spring,笔者对Spring IoC、BeanFactory和FactoryBean等Spring的关键源码进行了分析,使读者可以更好地理解Spring,为日后学习和理解其他技术框架的源码打下基础(很多技术组件,如数据库连接池、MQ等技术都会用到第1章中分析的源代码)。
又如本书第2章介绍MyBatis,要知道很多企业系统中存在大量的慢SQL,这不仅会影响系统的性能,而且存在一定的安全隐患——随着时间的积累,企业系统中积累的数据越来越多,大量的慢SQL最终会导致系统崩溃。如果能够优雅地监控系统中的慢SQL,你需要懂得MyBatis插件机制的工作原理,这样才能开发出优雅的慢SQL监控插件,为团队产生额外的价值。
【面试预测】
仔细复习面试题不仅能够提高获得工作的机会,还能够促进个人技术成长、增强职业技能,并为未来的职业发展打下坚实的基础。面试题可以帮助你评估自己的技术水平,识别知识盲点,了解当前市场上的技术趋势和最新技术,促使你不断学习和更新知识。
本书介绍的每一种技术都配有高频面试题及答案,通过面试题的复习,读者可以更好地了解行业需求,帮助自己在市场上定位。
笔者还创建了免费的星球【IT职场说】,会在其中不断更新面试题及答案,欢迎读者的加入。
【面试洞察】
技术实力是基础,但在面试时的临门一脚同样至关重要。例如,面试官会考查你的职业热情(面试时的热情和对工作的兴趣可以感染面试官,展示你对职业的热爱)、文化契合度(面试官会通过你的言行举止来评估你是否符合公司文化)、职业规划(你如何谈论自己的职业规划和目标,可以反映你对未来的规划和期望)、诚信和专业(面试中的言行是否一致,可以体现你的诚信和专业性)、综合能力展示(面试是展示个人技术能力、问题解决能力、沟通能力等综合能力的机会)、沟通技巧(技术实力需要通过有效的沟通技巧来表达,这对于评估你是否适合团队环境很重要)、压力管理(面试时的临场发挥可以体现你在压力下工作和管理压力的能力)、个人潜力(面试官会通过面试时的临场表现来评估你的潜力)。
例如本书第19章的面试技巧中,笔者对简历编写、个人亮点塑造、投递简历的策略、可能遇到的面试形式、面试技巧和面试总结等方面做了总结,助你在面试前知己知彼,在面试中披荆斩棘,在面试后总结经验。
最后,感谢王金柱、王叶编辑的热情指导,感谢出版社其他人员的辛勤工作,感谢笔者的家人一直以来的支持,感谢各位师长的谆谆教导。没有他们的鼎力相助,本书就无法顺利完成。
如果你在阅读本书时遇到问题,请发邮件至[email protected]获得帮助,邮件标题为“Java应用开发关键技术与面试技巧”。
周冠亚
2024年8月
评论
还没有评论。