高性能Java架构:核心原理与案例实战
  • 推荐0
  • 收藏0
  • 浏览341

高性能Java架构:核心原理与案例实战

张方兴 (作者) 

  • 书  号:978-7-121-37622-1
  • 出版日期:2021-08-13
  • 页  数:256
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:安娜
纸质版 ¥89.00
本书是按照程序设计与架构的顺序编写的,共13章。第1章介绍学习高性能Java应了解的核心知识,为前置内容。第2章和第3章讲解在编写代码之前,如何高效地为MySQL填充亿级数据,并对MySQL进行基准测试,以便在之后编程时有所比较。第4章讲解在编写代码的过程中如何优化代码,使代码更高效。第5章和第6章讲解在写好代码之后如何测试并优化场景响应速度。第7章和第8章讲解在程序上线执行一段时间之后如何对MySQL进行主从复制、分库分表。第9章讲解如何通过Prometheus和Grafana监控MySQL节点。第10章和第11章讲解如何通过堆内缓存、堆外缓存(MapDB)和磁盘缓存解决MySQL数据库性能不佳的问题。第12章讲解如何使用分布式锁Redisson解决实际应用中常见的数据一致性问题。第13章简要介绍Java中的常见架构与工具。
本书不仅适合Java初学者、刚入行的编程人员,也适合对高性能、高并发感兴趣的程序员。
1.结构清晰。带领读者统览高性能架构各个阶段遇到的问题、原理解析及解决方案,让读者知其然并知其所以然。
2.提供图书配套代码。提供作者亲自在线答疑的QQ群。
前言
为什么写这本书
市面上讲Java 框架的书很多,包括Sping Boot、Spring Cloud、Kafka 等,但这些书通常只会让
你技术的“量”增长,而“质”仍处于SSM 的阶段。而且互联网上并没有体系化、结构化的提升技
术的“质”的教材,于是我行动了起来,将我所学的架构思想与实现方式都放入本书中,将提升技
术的“质”的方式分享给大家。

本书特色
本书先系统总结出在程序设计过程中各个阶段会出现的问题,然后通过对问题的分析找出解决
方案,最后通过实战巩固学习成果。
通过阅读本书,读者不仅可以从架构的角度全方位地了解在Java 编程过程中各阶段会出现的典
型问题,从底层了解问题出现的原因,还可以跟着书中的解决方案和相关实战章节实现学习的闭环。
除此之外,本书还可以帮助读者养成在编写代码的过程中对代码进行测试的习惯,时刻观察CPU与内存,从而更加深入地了解系统,掌控自己编写的代码。本书内容会对普通程序员晋升中间件研发工程师、架构工程师、游戏服务器主程等有所帮助。

本书内容安排
本书是按照程序设计与架构的顺序编写的,具体如下。
1.在编写代码之前,应先创建表结构,然后填充亿级数据,做基准测试,即在还没开始编写代
码的时候了解当前设计的数据格式和表结构的性能基准是怎样的,以便在之后编程时有所比较,并且可以在此时优化设计的数据格式、表结构、MySQL 配置等内容。具体内容见第2 章和第3章。
2.在编写代码的过程中,程序中通常会有许多函数和接口,此时需要对函数和接口进行单元测
试,以便了解函数或接口的性能,并与函数基准或数据库基准的数据进行对比,知道差异大概有多少。当差异过大时,需要进行优化。除此之外,当函数的多种写法语义结果相同时,也可对比出哪种性能更好。具体内容见第4 章。
3.在写好代码之后,需要对场景进行性能测试,例如购买商品场景、登录场景、支付场景等。
之前在单元测试时,通常使用一个接口一项测试或一个函数一项测试的方式,但在场景中很可能会调用多个接口,例如,在登录场景中有账号和密码验证接口、用户数据接口、历史数据接口、短信提醒接口、信息推送接口等,此时需要对整体的场景进行测试。每个场景都有多个接口,并且很可能附带接口执行顺序、if-else 判断(true 与false 须执行不同函数)、for/while 循环(若调用失败则重新进行调用)等内容,此时JMH 已无法满足场景类性能测试的需要,需要通过JMeter 对场景进行性能测试。具体内容见第5 章。
4.在场景性能测试过程中,许多场景下的响应速度可能不如人意,此时既可以通过增加缓存提
升MySQL 执行效率的方式,也可以通过优化SQL 的方式,对场景性能测试的函数与接口进行优化,以缩短响应时间。具体内容见第6 章。
5.在程序上线并执行一段时间之后,随着用户量的逐渐增多,单台MySQL 服务器开始无法承
受所有的压力,为了承载更大的数据库并发,防止单台MySQL 服务器出现宕机且无法正常提供服务等问题,导致整体应用程序崩溃,需要使用MySQL 集群。具体内容见第7 章。
6.随着数据库存储的内容越来越多,通过MySQL 主从复制也无法存储更多的数据,此时就需
要切割表,把一张过大的表切割后分别存储在不同的MySQL 数据库中,这样就可以存储更多的内容。承载更多的用户。具体内容见第8 章。
7.在对MySQL 进行主从复制、分库分表等之后,MySQL 的节点数变得越来越多,此时可以使
用性能监控的方式查看MySQL 的实际使用情况。当MySQL 节点发生宕机、无法响应、CPU 内存过载、连接数突然过多等问题时,性能监控可及时将消息推送给相关管理人员,即可省时省力、掌控全局。具体内容见第9 章。
8.当数据库臃肿、性能不佳时,需要通过多层缓存的方式,在不同层级上设置缓存,减少数据
库的连接次数与查询次数。具体内容见第10 章和第11 章。
9.通常来说,秒杀系统在活动期间都需要极高的性能,为了防止超买或超卖,此时需要使用分
布式锁解决数据的一致性问题。具体内容见第12 章。
10.针对不同的场景需要用不同的架构,如高并发架构、负载均衡架构等。具体内容见第13 章。

本书读者对象
本书不仅适合Java 初学者、刚入行的编程人员,也适合对高性能、高并发感兴趣的程序员。
致谢
感谢我的领导杨仪,你给了我许多计算机思想和思路上的指导。
张方兴

目录

第1 章 高性能Java 核心知识概述 1
1.1 高性能 1
1.2 高并发 2
1.3 高可用 2
1.4 算法、GC 与诊断工具 . 3
1.4.1 算法 . 3
1.4.2 GC . 4
1.4.3 jvmtop 4
1.4.4 jstat 5
1.4.5 Arthas 6
1.5 分离术 8
1.6 基准测试 . 8
1.6.1 基准测试的概念 . 8
1.6.2 基准测试的实际用途 . 9
1.6.3 基准测试与一般性能测试的区别 . 9
1.7 性能测试 . 9
1.7.1 性能测试的目的 . 9
1.7.2 性能测试着重观察的指标 . 9
1.7.3 性能测试存在的误区 . 10
1.7.4 性能测试应涵盖的内容 . 11
1.8 业务测试 . 12
1.9 单元测试 . 12
1.9.1 等价类划分 . 13
1.9.2 边界值分析 . 14
1.9.3 错误推测法 . 15
1.10 数据库概述 . 15
1.10.1 数据库分类 . 16
1.10.2 数据库测试的具体内容 . 21
1.11 缓存的核心知识 . 22
1.11.1 缓存的命中率 . 23
1.11.2 缓存回收方式 . 23
1.11.3 缓存回收策略 . 23
1.11.4 缓存的设计模式 . 23
1.11.5 缓存测试应涵盖的内容 . 24
1.11.6 实战:秒杀系统设计方案 24
1.12 总结——业务、性能、编程、架构相辅相成 25

第2 章 为MySQL 填充亿级数据 27
2.1 问题描述 . 27
2.2 问题分析与解决方案 . 27
2.3 为MySQL 填充亿级数据实战 28
2.3.1 INSERT INTO SELECT 方案 . 28
2.3.2 存储过程方案 . 32
2.3.3 Loadfile 方案 . 33
2.3.4 第三方解决方案 . 34
2.4 最终结果 . 35

第3 章 MySQL 基准测试:sysbench 与mysqlslap 36
3.1 问题描述 . 36
3.2 问题分析与解决方案 . 36
3.2.1 解决方案:sysbench . 37
3.2.2 sysbench 的命令与参数 38
3.2.3 解决方案:mysqlslap . 40
3.2.4 mysqlslap 的命令与参数 41
3.3 sysbench 实战 42
3.3.1 使用sysbench 压测CPU、内存和磁盘I/O 42
3.3.2 初次使用sysbench 压测MySQL . 46
3.3.3 深度使用sysbench 压测MySQL . 49
3.4 mysqlslap 实战 51
3.5 其他基准压测工具 . 56

第4 章 代码单元的性能测试与优化 57
4.1 问题描述 . 57
4.2 问题分析与解决方案 . 57
4.3 JMH 实战 58
4.3.1 测试JMH 基准性能 . 58
4.3.2 测试i++基准性能 . 60
4.3.3 用JMH 执行多个函数的结果 62

第5 章 Web 性能测试解决方案:JMeter 67
5.1 问题描述 . 67
5.2 问题分析与解决方案 . 67
5.3 JMeter 的特点 . 68
5.4 深入理解JMeter . 68
5.4.1 JMeter 中的部分配置元件 . 68
5.4.2 JMeter 参数化的实现方式 . 69
5.4.3 JMeter 函数 . 70
5.4.4 通过JMeter 读取外部文件 72
5.4.5 通过JMeter 提取上一个接口返回值 . 73
5.5 JMeter 实战 . 74
5.5.1 初次使用JMeter 测试REST 接口 . 74
5.5.2 录制性能测试脚本 . 80

第6 章 SQL 优化与索引优化 83
6.1 问题描述 . 83
6.2 问题分析与解决方案 . 83
6.3 SQL 执行计划 . 84
6.4 SQL 优化与索引优化实战 . 91
6.4.1 SQL 索引优化 . 91
6.4.2 分页查询优化 . 95
6.4.3 慢SQL 日志分析工具mysqldumpslow . 96

第7 章 MySQL 主从复制 101
7.1 问题描述 . 101
7.2 问题分析与解决方案 . 101
7.3 MySQL 主从复制原理 . 101
7.4 深入理解MySQL 中的二进制日志. 103
7.4.1 查看MySQL 二进制日志状态 103
7.4.2 log_bin 和sql_log_bin 的区别 104
7.4.3 开启二进制日志 . 104
7.4.4 查看二进制日志文件的名称、大小和状态 108
7.4.5 删除某个日志之前的所有二进制日志文件 109
7.4.6 删除某个时间点以前的二进制日志文件 110
7.4.7 删除所有的二进制日志文件 . 111
7.4.8 查看二进制日志文件内容 . 111
7.4.9 通过二进制日志文件恢复MySQL . 116
7.5 MySQL 主从复制实战 . 117
7.5.1 构建MySQL 主从复制架构 117
7.5.2 使用Spring Boot 整合MySQL 主从复制架构 . 126

第8 章 MySQL 分库分表:MyCAT . 129
8.1 问题描述 . 129
8.2 问题分析与解决方案 . 129
8.3 MyCAT 实战 . 130
8.3.1 构建MyCAT 一主多从架构 130
8.3.2 构建MyCAT 双主多从环境 140
8.3.3 MyCAT 分库——垂直拆分 142
8.3.4 MyCAT 分表——水平拆分 144
8.3.5 构建HAProxy + MyCAT + MySQL 高可用架构 146

第9 章 MySQL 性能监控解决方案:Prometheus+Grafana 152
9.1 问题描述 . 152
9.2 问题分析与解决方案 . 152
9.3 Prometheus 概述与适用场景 152
9.4 时序数据库概述与适用场景 . 153
9.5 Grafana 概述与适用场景 154
9.6 构建Prometheus + Grafana 监控实战 154

第10 章 堆内缓存解决方案:Java 堆内缓存与Guava Cache 171
10.1 问题描述 . 171
10.2 问题分析与解决方案 . 171
10.3 Java 堆内缓存 . 172
10.3.1 Java 堆内缓存原理 . 172
10.3.2 Java 堆内缓存中的常见算法及实战 173
10.4 Guava Cache 实战 . 190
10.4.1 创建Google 的容器工厂 190
10.4.2 屏蔽NULL 值 . 191
10.4.3 管理字符串 . 192
10.4.4 操作Google 的Multiset 容器 . 192
10.4.5 操作Google 的Multimap 容器 193
10.4.6 操作Google 的BiMap 容器 . 194
10.4.7 操作Google 的Table 容器 . 194
10.4.8 操作Google 的classToInstanceMap 容器 196
10.4.9 操作Google 的RangeSet 容器 . 196
10.4.10 操作Google 的RangeMap 容器. 198
10.4.11 操作Google 的Guava Cache 198

第11 章 堆外缓存与磁盘缓存解决方案:MapDB 203
11.1 问题描述 . 203
11.2 问题分析与解决方案 . 203
11.2.1 堆外缓存 . 203
11.2.2 MapDB 204
11.2.3 实战:初次使用MapDB 205
11.3 MapDB 的构造原理 206
11.4 MapDB 的使用方法 208
11.5 MapDB 实战 210
11.5.1 MapDB 的序列化 210
11.5.2 MapDB 的事务 211
11.5.3 MapDB 的监听器与多级缓存 212

第12 章 基于Redis 的分布式锁解决方案:Redisson . 214
12.1 分布式锁与Redisson 原理 . 214
12.2 单机版超买或超卖问题描述及解决方案 216
12.3 分布式版超买或超卖问题描述及解决方案 218
12.4 多线程死锁问题描述及解决方案 . 219
12.5 Redisson 实战 223
12.5.1 Redisson 的可重入锁 223
12.5.2 Redisson 的公平锁 223
12.5.3 Redisson 的联锁 225
12.5.4 Redisson 的红锁 226
12.5.5 Redisson 的读写锁 227
12.5.6 Redisson 的信号量 229
12.5.7 Redisson 的分布式闭锁 230

第13 章 Java 中的常见架构与工具 . 233
13.1 自动化测试架构 . 233
13.2 自动化持续集成部署架构 . 233
13.3 高并发架构 . 234
13.4 响应式编程架构 . 236
13.5 负载均衡架构 . 238
13.6 监控工具与监控架构 . 239
13.7 其他工具与架构 . 241

读者评论

相关博文

  • 缓存核心知识小抄,面试必备,赶紧收藏!

    缓存核心知识小抄,面试必备,赶紧收藏!

    博文小编 2021-09-10

    缓存是为了减少数据库和服务器压力而产生的,在应用层编程时需主要考虑以下几种情况: 客户端缓存 服务端缓存 网络缓存(CDN缓存) 客户端缓存负责减轻服务端的存储和频繁的数据请求等压力。 例如,在QQ初始阶段,只有“...

    博文小编 2021-09-10
    240 0 0 0