Java工程师修炼之道

更多详情


内容简介: Java开发一直是当前互联网领域最火热的开发技能之一,Java工程师也一直是需求量非常大的开发职位。本书主要针对一名合格的Java工程师的必备技能做了大纲性的总结和阐述。本书内容包括了工程化、常用开发框架、数据存储、数据传输、Java编程高级知识、性能优化、安全技术等内容,基本涵盖了Java工程师需要掌握的绝大部分技能点。

目录: 第1章 后端技术导言
1.1?后端基础设施
1.1.1?请求统一入口——API网关
1.1.2?业务应用和后端基础框架
1.1.3?缓存、数据库、搜索引擎、消息队列
1.1.4?文件存储
1.1.5?统一认证中心
1.1.6?单点登录系统
1.1.7?统一配置中心
1.1.8?服务治理框架
1.1.9?统一调度中心
1.1.10?统一日志服务
1.1.11?数据基础设施
1.1.12?故障监控
1.2?Java后端技术概览
1.2.1?软件开发的核心原则
1.2.2?软件开发的软件过程
1.2.3?日常开发常用工具
1.2.4?应用的运行环境
1.2.5?常用第三方服务
1.2.6?计算机基础科学知识
1.2.7?数据处理相关技能
1.2.8?Java编程知识
1.2.9?系统架构演化
1.2.10?典型的部署架构
1.3?如何学习后端技术
1.3.1?扎实的计算机基础知识
1.3.2?知其然更要知其所以然
1.3.3?动手实践
1.3.4?频繁练习
1.3.5?持续学习
1.3.6?自我总结
1.3.7?如何学习一门新技术
1.3.8?总结
第2章 Java项目与工程化
2.1?项目构建
2.1.1?传统构建工具——Ant
2.1.2?主流构建工具——Maven
2.1.3?新兴构建工具——Gradle
2.2?代码版本控制
2.2.1?集中式代码版本管理——SVN
2.2.2?分布式代码版本管理——Git
2.2.3?提交日志的规范
2.3?代码质量保证
2.3.1?使用单元测试保证代码质量
2.3.2?衡量单元测试的标准
2.3.3?开发规范与建议
第3章 开发框架
3.1?依赖注入
3.1.1?JSR-330依赖注入规范
3.1.2?Guice
3.1.3?PicoContainer
3.1.4?Dagger
3.1.5?Spring Framework
3.1.6?循环依赖问题
3.2?对象关系映射
3.2.1?表元数据的映射
3.2.2?CRUD以及属性的查询
3.2.3?查询缓存的使用
3.2.4?结果的映射
3.2.5?规范SQL书写的语句构建器
3.2.6?使用提示
3.3?日志
3.3.1?JDK Logging
3.3.2?Log4j
3.3.3?Log4j2
3.3.4?Logback
3.3.5?统一日志API的门面框架
3.3.6?统一日志框架的使用
3.4?Web MVC
3.4.1?为什么是Spring MVC
3.4.2?Spring MVC的请求处理流程
3.4.3?典型的配置方式
3.4.4?无XML的配置方式
3.4.5?对MVC应用做单元测试
3.4.6?验证Web请求的参数
3.4.7?使用异步Servlet
3.4.8?使用提示
第4章 Spring
4.1?Spring核心组件
4.1.1?Spring的双亲上下文机制
4.1.2?Spring中的事件机制
4.1.3?Bean的初始化和销毁
4.1.4?Bean的动态构造
4.1.5?注入集合、枚举、类的静态字段
4.1.6?面向方面编程——AOP
4.1.7?进阶XML的配置
4.1.8?无XML的配置方式
4.2?Spring数据操作框架
4.2.1?Spring JDBC
4.2.2?Spring Data Redis
4.2.3?Spring Data MongoDB
4.3?Spring Boot
4.3.1?Spring Boot使用示例
4.3.2?Spring Boot的运行原理
4.3.3?Spring Boot的组成模块
4.3.4?小结
4.4?Spring常用组件
4.4.1?表达式引擎——Spring Expression Language
4.4.2?远程过程访问的支持——Spring Remoting
4.4.3?Spring与JMX的集成
4.4.4?定时任务的支持——Spring Quartz
4.4.5?跨域请求的支持——Spring CORS
4.5?总结
第5章 数据存储
5.1?关系型数据库——MySQL
5.1.1?存储引擎
5.1.2?字符集和校对规则
5.1.3?索引的使用
5.1.4?查询缓存的使用
5.1.5?数据同步中的Binlog
5.1.6?事务机制
5.1.7?大表优化
5.1.8?高可用支持
5.1.9?使用提示
5.2?非关系型数据库
5.2.1?KV数据库
5.2.2?文档数据库——MongoDB
5.2.3?列数据库——HBase
5.3?缓存
5.3.1?本地缓存
5.3.2?分布式缓存——Redis
5.3.3?缓存设计的典型方案
5.4?搜索引擎——Elasticsearch
5.4.1?开源全文检索库——Apache Lucene
5.4.2?关键概念
5.4.3?查询的优化
5.4.4?内存的使用优化
5.4.5?开源日志管理方案——ELK
第6章 数据通信
6.1?RESTful架构风格
6.1.1?支持的操作
6.1.2?返回码
6.1.3?资源概念
6.1.4?数据的安全保障
6.1.5?请求的限流
6.1.6?超文本API
6.1.7?编写文档
6.1.8?RESTful API实现
6.2?远程过程调用——RPC
6.2.1?JDK自带的RPC——RMI
6.2.2?Hessian
6.2.3?Thrift
6.2.4?Dubbo
6.2.5?数据的序列化机制
6.2.6?使用提示
6.3?消息中间件
6.3.1?简单消息中间件——ActiveMQ
6.3.2?通用消息中间件——RabbitMQ
6.3.3?日志消息中间件——Kafka
6.3.4?本地消息队列
第7章 Java编程进阶
7.1?Java内存管理
7.1.1?JVM虚拟机内存
7.1.2?垃圾回收理论
7.1.3?常用垃圾回收器
7.2?Java网络编程
7.2.1?常见网络I/O模型
7.2.2?Java网络编程模型
7.3?Java并发编程
7.3.1?并发原理
7.3.2?并发思路
7.3.3?并发工具
7.3.4?并发编程建议
7.4?Java开发利器
7.4.1?Apache工具库——Apache Commons
7.4.2?Google工具库——Guava
7.4.3?最好用的时间库——Joda Time
7.4.4?高效JSON处理库——FastJson
7.4.5?高效Bean映射框架——Orika
7.5?Java新版本的特性
7.5.1?Java 7
7.5.2?Java 8
7.5.3?Java 9
7.6?总结
第8章 性能调优
8.1?调优准备
8.1.1?HotSpot虚拟机体系结构
8.1.2?操作系统的性能调优
8.1.3?系统常用诊断工具
8.1.4?JDK常用诊断工具
8.2?性能分析
8.2.1?CPU分析
8.2.2?内存分析
8.2.3?I/O分析
8.2.4?其他分析工具
8.3?性能调优
8.3.1?CPU调优
8.3.2?内存调优
8.3.3?I/O调优
8.3.4?其他优化建议
8.3.5?JVM参数配置
8.3.6?JVM性能增强
第9章 安全技术
9.1?Java加密
9.1.1?单向加密算法
9.1.2?对称加密算法
9.1.3?非对称加密算法
9.2?安全HTTP——HTTPS
9.2.1?安全协议——SSL/TLS
9.2.2?证书中心——CA
9.2.3?请求交互过程
9.2.4?性能优化
9.3?Web安全
9.3.1?跨站点脚本攻击
9.3.2?跨站点请求伪造
9.3.3?SQL注入攻击
9.3.4?基于约束条件的SQL攻击
9.3.5?分布式拒绝服务攻击——DDOS
9.3.6?会话固定攻击——Session fixation
附录A 代码构建常用命令
附录B Git常用命令
附录C MySQL常用命令
附录D MongoDB常用命令
附录E Java调优常用命令

前言: 推荐序一
Hey!新来的读者,为了吸引你的注意力我真是煞费苦心,但最终还是没能写出一句特别吸引眼球的话来,毕竟写序的我不是标题党出身。此刻我真的非常能理解你拿到新书之后那渴望知识的心情,所以你恨不得一个字的“序”也不要看到,直接到达“最有价值”的知识点。但作为一名资深转业码农(对!你没看错,是“转业”,不是“专业”)还是想说一句,你先看完序,5分钟后到达知识的战场,会更稳!
相信你已经在看“序”了,那么我们来说点正经事。
你的知识体系的养成有3个关键阶段:看山是山,看山不是山,看山还是山。本书的适用人群是“看山不是山”的那些人,如果你恰好处于这个阶段,恭喜你!书钱没白花。
Java是一门非常容易入门的语言,初学者经过初期的学习之后基本能掌握DEMO级别的编程应用。相信读者你已经度过了这个阶段,但是Java庞大的体系可能会把你绕晕,又或者你还没看到Java的生态系统有多么复杂。此时,你需要本书。从事程序员这个工作,到比较高阶的时候,其实是不挑语言的,语言只是工具,而你可以在纷繁复杂中游刃有余。但几乎每一位高手都是先深入一个领域,再横向发展的。你可以不用着急后续的横向发展,先坚定自己学习Java的信心!因为,从广泛的应用场景、顶级的开源生态、未来可期的薪水和职位来说,Java都是非常不错的选择。
敲黑板,画重点!下面来解释一下,为什么本书面向的是“看山不是山”的人群。在度过Java的入门期之后,会有一个烦恼,那就是面对Java这么庞大的体系,我们究竟应该学习什么?选择方向,往往比努力更重要!是使用J2SE编写桌面程序?是使用J2ME编写嵌入式应用?还是使用J2EE编写企业级应用?这些是我们那个泛黄的年代特有的烦恼。而现在的烦恼可能是学Android?还是学Java后端?即便大方向你已经十分坚定,而且选择了Java后端编程,但因为复杂的知识体系和Google发布的各种教程文档,眼前看到的已经不再是清晰的山脉,而是一片迷雾。此时,你需要本书,因为它给你指明了努力的方向。
本书的结构、阐述的方式和大部分的“指南”书籍有较大的区别,本书是以笔记和要点的形式进行呈现的,用现在的话说就是捞干货。本书涵盖的知识,是以现代工程实践中的实际案例出发来组织的,所以知识点范围非常广泛,每一个点都对最关键的“Best Practice”简明扼要地进行了说明。你在阅读本书的时候需要一些相关经验,不然无法跟上作者的节奏,建议在有一定的知识准备后再阅读本书,这样你会受益匪浅。从另外一个角度看,在你有了一定的基础积累之后,本书可以帮助你全面地了解一个现代化的最先进的工程实践是怎样的。本书讲述了目前行业中最常用的,经过了实践的工程方案,这将是你快速进阶的最佳指引。
——孙建,随身云(中华万年历)联合创始人& CEO
推荐序二
2013年,我和本书作者的接触是从基于网易的一个大型互联网应用合作开始的,我见证了从第一行代码到整个系统服务于亿级用户的过程,并且相信这种经历对开发者来说是一笔巨大的财富,其中大量的开发和实战经验都会在本书中得到充分的体现,相信读者能从书中直接领略到丰富的实战知识。在与本书作者的合作过程中,其对Java技术的热爱与追求,对问题刨根问底,直到理解透彻、灵活应用,这些都令我印象深刻。这些年,我与本书作者一直保持沟通交流、相互学习,他将近十年的实战经验沉淀于本书以实现对后端技术的探索、布道,非常值得开发者与近高窗卧听秋。
后端技术涉及内容非常广泛,Java语言也是互联网开发行业使用的主流语言,相信后续也将继续流行很长一段时间,而本书作者也一直从事Java后端开发工作。在本书中作者比较系统地从总体上描述了后端技术相关的理论知识,包括基础设施、网关服务及框架选型等基本原则,然后以实际经验进行示例说明,接着详细梳理了Java的后端技术,相信读者读完本书后会更全面地理解后端技术。互联网的业务建设需要不同角色的开发者共同协作完成,因此,系统工程化是开发者首先要共同遵守的规范或约定,包括代码规范、版本管理和代码质量检查等。
开发框架的选型进一步地为工程化提供了基础,也能加速推进互联网开发,尽管是否重复造轮子是一个恒久的话题,但是没有永远的银弹,只要在合适的时间里根据团队的能力选择合适的技术框架就好。一般来讲,目前常用的框架包括基本的依赖注入、AOP、事务管理、连接池管理、数据操作、日志服务等,在众多的框架中,本书作者选用目前在Java领域使用最广泛的Spring做深入的分析,详细地说明各组件的基础知识、基本原理和实际使用案例,最难得的是把较多开发者遇到的坑都用真实的示例进行了说明,可以帮助开发者快速地跳过这些伤心地带,同时也把最佳实践画龙点睛地带给开发者。
数据存储无疑是所有系统应用中非常重要的一环,应用的场景用例也和数据库的选型有着极其重要的关系,开发者选择关系型数据库还是非关系型数据库是需要根据软件成本与人力成本来进行权衡的,比如选择MySQL、Oracle等开源或商业的数据库。本书重点从数据库的基础知识、索引和表优化等方面以详尽的示例为更好地选择数据库的存储类型提供了更多的知识。
早期的关系型数据库一般能满足数据达到一定规模的企业的需求,而在互联网业务领域,特别是移动互联网领域内的元数据或者日志数据等,达到亿数量级别是很常见的,这时通常使用非关系型数据库,在非关系型数据库里使用非常多的有MongoDB、HBase等分布式数据库系统。作者在自身的企业开发实践中,得到了大量的使用经验和最佳实践。为了加速后端应用,缓存热数据是加速业务、提高业务性能、提升用户体验的重要手段,通过使用本地缓存、远程缓存进行数据加速、数据预热或提高数据的命中率,是开发者在应用开发的过程中常会遇到的场景。
“路漫漫其修远兮,吾将上下而求索”,后端技术每年都在不断发展,所用技术也有变化,近些年Java语言的发展速度不那么快了,但是总体是在不断前进发展的,本书作者带领的团队一直深耕此领域并希望通过本书为技术开发人员带来更多帮助。
——尧飘海,网易云基础服务(蜂巢)首席架构师
前言
目前互联网行业如火如荼,进入这个行业的技术人员也越来越多。对于研发来说,从工程角度其主要分为前端工程师、客户端工程师(又分为iOS和Android工程师)、后端工程师、算法工程师等职位。本书所说的Java工程师指的是以Java作为主要开发语言的后端工程师。
笔者从2008年还未毕业时做一些小的项目至今,做后端开发已经有差不多10年时间。经历过刚学Java时的迷茫,第一次写出Java程序时的激动,第一次写出一个Web系统的醍醐灌顶,一直到接触Java更底层的东西,总的来说对Java有了系统性的认识,对后端技术体系有了宏观的感受。这期间,笔者用过各种各样的编程语言,尝试过各种开源软件,挖过各种坑,也填过各种坑。针对后端技术来说,笔者认为自己的这些知识体系,还是有一定价值的。
此外,还记得当笔者毕业后进入第一家公司时,入职培训的课程虽然不难,但确实有种恍然大悟的感觉。业界的最佳实践和自己在学校里学到的、使用到的知识,差别还是非常大的。直到后来加入现在的这家公司,给新老员工做过一系列后端技术的培训课程,在校招的笔试和面试过程中深刻体会到学校与业界脱节之严重,在平时的社招中遇到很多对后端技术缺乏系统性认识、技能点不足的工程师,并且也经常被人问起如何学习Java后端技术,于是就打算将目前后端工程师一些比较主流、前沿的技术以及实际工作中会用到的技能串联起来,给刚上大学以后打算以Java后端为职业的学生、刚毕业入职的应届生以及初学者们一些入门的指引,使其少走弯路。另外也希望给一些有经验的工程师提供一个参考手册,将零散的知识点串起来,减少在解决某些实际问题时无头绪搜索带来的时间成本,同时也是对自己的一个阶段性总结和查漏补缺。需要注意的一点是,像数据结构、计算机网络等计算机科学基础知识以及Java SE的基本用法,笔者认为是从事程序开发工作的Java工程师应该必备的知识,因此并不包括在内。
本书会针对Java后端开发工作中经常用到的关键技能点做阐述,会尽量覆盖实际工作中需要的所有技能。但由于很多技能并非一两个章节就能完整讲述,因此本书仅做一些实践性的经验总结和阐述,更加详细和深入的学习则需要参考专门的书籍或者官方文档。
本书的大部分内容都来自笔者的博客以及平时工作、学习中的一些自我总结和笔记,记录了笔者进入这个行业以来的一些经验教训和思考。
面向读者
未入门或者刚入门的Java工程师
    包括未来以Java后端开发为职业方向的在校学生、刚毕业入职的Java工程师以及未形成知识体系的Java工程师。这类读者通过阅读本书能够对Java工程师的必备技能有一个全局认识,逐步形成自己的Java技术体系。
有经验的Java工程师
    有经验的Java工程师可以通过本书查漏补缺,巩固自己的开发技能,进一步完善自身的Java技术体系。
对Java后端开发感兴趣的非Java工程师
    非Java工程师可以通过本书了解Java工程师的技能体系,尤其对于其他语言的后端工程师来说,本书的很多内容也是通用的,并不局限于Java开发。
内容概览
第1章 后端技术导言
    本章主要从总体上描述后端技术的概念、组成、作用、需要的知识点,并给出了学习后端技术的建议。
第2章 Java项目与工程化
    本章主要讲述Java项目与工程化需要掌握的软件、技能等。
第3章 开发框架
    本章主要讲述Java后端开发中的一些主流框架的使用方法。
第4章 Spring
    本章主要讲述Spring核心、数据操作以及一些常用组件的使用。
第5章 数据存储
    本章主要讲述Java应用中数据存储上使用的一些软件、服务等。
第6章 数据通信
    本章主要讲述Java应用中数据传输、通信上使用的一些软件、服务等。
第7章 Java编程进阶
    本章主要介绍一些Java开发中的高级特性以及在Java开发中非

媒体评论: 扎实的基础理论知识是内功底子,丰富的实践经验是招式。如本书作者所说,精妙的招式决定了你的武功下限,而深厚的内功底蕴会承载你所能企及的高度。那么,在后端技术栈中,内功与招式之间如何关联起来,本书作者以其多年的钻研与实践结合心得,通过本书为你一一梳理。
——阙杭宁,网易云信CTO
作者是一位技术人,有多年的Java技术积累,是极少数真正热爱技术的人。在随身云的架构师工作让他有机会站在更高的层次进行系统架构相关工作,这些实践经验和平时感悟都沉淀在作者的著作和博客中,相信每位Java工程师都能从中获取帮助。
——秦绪震,十露盘科技联合创始人,技术负责人
扎实的基础理论知识是内功底子,丰富的实践经验是招式。如本书作者所说,精妙的招式决定了你的武功下限,而深厚的内功底蕴会承载你所能企及的高度。那么,在后端技术栈中,内功与招式之间如何关联起来,本书作者以其多年的钻研与实践结合心得,通过本书为你一一梳理。
——阙杭宁,网易云信CTO    
作者是一位技术人,有多年的Java技术积累,是极少数真正热爱技术的人。在随身云的架构师工作让他有机会站在更高的层次进行系统架构相关工作,这些实践经验和平时感悟都沉淀在作者的著作和博客中,相信每位Java工程师都能从中获取帮助。
——秦绪震,十露盘科技联合创始人,技术负责人
本书作者根据自身多年的Java后台开发经验,提纲挈领地总结了Java后台开发的各个关键技术点,这些知识点都是一名合格的Java工程师必须掌握的技能。它既可以作为新人的技术学习指南,也可以帮助老手对于自己的知识面进行查漏补缺,是一本非常好的技术图书。
——饶洵(蜚天),阿里巴巴技术专家
作为一名在后端摸爬多年的Java开发工程师,这本书让我温故而知新。书中介绍的Java相关知识技能树,不仅涵盖了我个人多年的Java开发技术知识点,也对我感到陌生的一些知识点进行了详解,让我突然有一种继续学习的冲动。
一名Java开发工程师,不仅要对Java语言及其特性有深层次的理解,而且需要掌握与Java相关的框架、生态及后端开发知识。这本书正是总结了后端开发工程师需要掌握的技能,对于提高开发能力很有帮助。
这本书,对于具有一定Java基础和后端开发知识的读者来说,不仅具有仔细学习的价值,同时也是一本可以经常翻阅的工具书,对于Java开发工程师的成长和进阶都有很好的指导作用。
一本好的技术书籍,不仅要仔细阅读、学习理解,还需要进行实践,从而加深知识点印象,形成永久的记忆和技能。希望各位读者能够通过学习和掌握书中的知识和技能,逐步成长为技术骨干和专家,从而创造更多的技术输出、产品输出,创造更多的财富。
——张小川,网易考拉海购架构师,供应链技术主管