Java持续交付
Daniel Bryant, Abraham Marín-Pérez
张若飞 译
出版时间:2019年10月
页数:404
持续交付为业务的持续发展和整个软件的交付周期增加了巨大的价值,但是掌握这项技术就意味着普通开发人员要跳出舒适区,学习很多新技能。本书以实践为基础,作者Daniel Bryant和Abraham Marín-Pérez通过大量的实践指导,帮助Java开发人员掌握针对不同平台的架构设计、自动化质量保证,以及打包和部署的技巧。
● 你将获得一些理解核心概念的帮助,以及有助于向持续交付迁移的指导意见。
● 你将学会如何设计能在不同平台上持续交付Java应用程序的架构。
● 你将学会如何构建应用程序构件,包括胖JAR文件、虚拟机镜像,以及操作系统容器(Docker)镜像。
● 你将学会如何使用Jenkins、PMD和FindSecBug等持续集成工具自动化地进行代码质量检查。
● 你将学会如何创建一个复杂的构建管道,以及如何设计独立的部署和发布流程。
● 你将了解为什么功能测试和系统质量属性测试对于开发和交付非常重要。
● 你将学会如何在本地有效地构建和测试应用程序,以及监控生产环境中运行的应用程序。
  1. 第1章 持续交付:为什么需要持续交付,什么是持续交付
  2. 入门知识
  3. 赋能开发者:为什么我们要持续交付
  4. 快速反馈会减少上下文切换
  5. 自动化的、可重复的以及可靠的发布
  6. 定义“完成”的概念
  7. 什么是构建管道
  8. 核心的构建管道阶段
  9. 容器技术的影响
  10. 对当前架构的影响
  11. 总结
  12. 第2章 Java开发的演化
  13. 现代Java应用程序的需求
  14. 对业务增长速度和稳定性的要求
  15. API经济的崛起
  16. 云计算的机会和成本
  17. 模块化归来:拥抱更小的服务
  18. 对持续交付的影响
  19. Java部署平台的演化
  20. WAR和EAR:应用服务器统治的年代
  21. 可执行的胖JAR文件:十二要素风格应用的出现
  22. 容器镜像:不断增加的可移植性(以及复杂性)
  23. 函数即服务:“无服务器”架构的出现
  24. 平台对持续交付的影响
  25. DevOps、SRE和发布工程
  26. 研发和运维
  27. 站点可靠性工程
  28. 发布工程
  29. 共享责任、指标和可观察性
  30. 总结
  31. 第3章 设计持续交付的架构
  32. 优秀架构的基础
  33. 松耦合
  34. 高内聚
  35. 耦合、内聚和持续交付
  36. 面向业务敏捷的架构
  37. 不好的架构会限制业务的发展
  38. 复杂性和变更成本
  39. API驱动的应用程序的最佳实践
  40. “自上而下”构建API
  41. 良好的API有助于持续测试和集成
  42. 部署平台和架构
  43. 设计符合“十二要素”的云原生应用程序
  44. 培养机械同理心
  45. 面向失败的设计和持续测试
  46. 越来越小的服务
  47. 交付单体应用程序的挑战
  48. 微服务:当SOA遇到领域驱动设计
  49. 函数、lambda表达式和纳米服务(Nanoservices)
  50. 架构:“难以改变的东西”
  51. 总结
  52. 第4章 Java应用的部署平台、基础设施以及持续交付
  53. 由平台提供的功能性
  54. 基本的开发流程
  55. 传统的基础设施平台
  56. 传统的平台组件
  57. 传统基础设施平台面临的挑战
  58. 传统基础设施的好处
  59. 传统基础设施平台上的CI/CD
  60. 云平台
  61. 深入云计算
  62. 云计算面临的挑战
  63. 云计算的好处
  64. 云计算中的持续交付
  65. 平台即服务
  66. 简单了解PaaS的原理
  67. PaaS平台面临的挑战
  68. PaaS的好处
  69. CI/CD和PaaS
  70. 容器(Docker)
  71. 容器平台组件
  72. 容器面临的挑战
  73. 容器的好处
  74. 持续交付容器
  75. Kubernetes
  76. Kubernetes的核心概念
  77. Kubernetes面临的挑战
  78. Kubernetes的好处
  79. Kubernetes的持续交付
  80. 函数即服务/无服务器函数
  81. FaaS的概念
  82. FaaS面临的挑战
  83. FaaS的好处
  84. CI/CD和FaaS
  85. 使用基础设施即代码
  86. 总结
  87. 第5章 构建Java应用程序程
  88. 自动化构建过程
  89. 构建依赖
  90. 外部依赖
  91. 多模块项目
  92. 使用多代码库还是单代码库
  93. 插件
  94. 发布和公开构件
  95. Java构建工具概述
  96. Ant
  97. Maven
  98. Gradle
  99. Bazel、Pants和Buck
  100. 其他JVM构建工具:SBT和Leiningen
  101. Make
  102. 如何选择一个构建工具
  103. 总结
  104. 第6章 其他构建工具和技巧
  105. Linux、Bash和基本的CLI命令
  106. 用户、权限和组
  107. 使用文件系统
  108. 查看和编辑文本
  109. 将所有东西连在一起:重定向、管道和过滤器
  110. 搜索和操作文本 :grep、awk和sed
  111. 诊断工具:top、ps、netstat和iostat
  112. HTTP调用和JSON操作
  113. curl
  114. HTTPie
  115. jq
  116. 编写基础脚本
  117. xargs
  118. 管道和过滤器
  119. 循环
  120. 条件
  121. 总结
  122. 第7章 打包应用程序
  123. 构建一个JAR文件 :循序渐进
  124. 构建一个可执行的胖JAR文件
  125. Maven Shade插件
  126. 构建Spring Boot Uber JAR文件
  127. 瘦 JAR 文件 — 为什么我们决定不使用胖JAR
  128. 构建WAR文件
  129. 在云平台上打包
  130. 将部署比作烹饪:烘焙式部署还是煎炸式部署
  131. 构建RPM和DEB OS包
  132. 其他构建OS包的工具(支持Windows)
  133. 使用Packer创建可在多个云平台部署的机器镜像
  134. 创建机器镜像的其他工具
  135. 构建容器
  136. 创建Docker容器镜像
  137. 使用fabric8制作Docker镜像
  138. 打包FaaS Java应用程序
  139. 总结
  140. 第8章 在本地环境中工作(就像在生产环境中一样)
  141. 本地开发面临的挑战
  142. mock、stub和服务虚拟化
  143. 模式#1:profile、mock和stub
  144. 使用Mockito进行mock
  145. 模式#2:服务虚拟化和API仿真
  146. 使用Hoverfly虚拟化服务
  147. 虚拟机:Vagrant和Packer
  148. 安装Vagrant
  149. 创建一个Vagrantfile
  150. 模式#3:生产环境镜像
  151. 容器:Kubernetes、minikube和Telepresence
  152. 介绍Docker Java Shop示例程序
  153. 构建Java应用程序和容器镜像
  154. 部署到Kubernetes平台
  155. 简单的冒烟测试
  156. 构建剩余的应用程序
  157. 在Kubernetes上部署整个Java应用程序
  158. 查看部署的应用程序
  159. Telepresence:在本地远程工作
  160. 模式#4:环境租赁
  161. FaaS:AWS Lamba和SAM Local
  162. 安装SAM Local
  163. AWS Lambda脚手架
  164. 测试AWS Lambda事件处理
  165. SAM Local冒烟测试
  166. FaaS: Azure Functions和VS Code
  167. 安装Azure Functions Core Tools
  168. 在本地构建和测试函数
  169. 使用 VS Code 进行本地和远程测试
  170. 总结
  171. 第9章 持续集成:创建构建管道的第一步
  172. 为什么要持续集成
  173. 如何实施CI
  174. 中心化与分布式的版本控制系统
  175. Git入门
  176. 核心的Git CLI命令
  177. Hub:一个Git和GitHub必备的工具
  178. 有效地使用DVCS
  179. 基于主干的开发
  180. 基于功能分支的开发
  181. Gitflow
  182. 没有万全之策:如何选择分支策略
  183. 代码审查
  184. 我们要寻找什么
  185. 代码审查自动化:PMD、Checkstyle和FindBugs
  186. 审查pull request
  187. 自动化构建
  188. Jenkins
  189. 发动你的团队
  190. 定期合并代码
  191. “停下来”:管理失败的构建
  192. 不要在测试上使用@Ignore
  193. 保持快速的构建过程
  194. 平台(基础设施即代码)的CI
  195. 总结
  196. 第10章 通过管道进行部署和发布
  197. 介绍Extended Java Shop应用程序
  198. 分离部署和发布
  199. 部署应用程序
  200. 创建一个容器镜像
  201. 部署机制
  202. 一切都开始于(并且结束于)健康检查
  203. 部署策略
  204. 使用非托管的集群
  205. 更改数据库
  206. 发布功能
  207. 功能开关
  208. 语义版本控制
  209. API的向后兼容性和版本
  210. 多阶段升级
  211. 管理配置和敏感信息
  212. “打包式”配置
  213. 外部配置
  214. 处理敏感信息
  215. 总结
  216. 第11章 功能性测试:正确和接受度
  217. 为什么要测试软件
  218. 测试什么?敏捷测试象限介绍
  219. 持续测试
  220. 构建正确的反馈循环
  221. 无尽的海龟
  222. 人为交易
  223. 端到端测试
  224. 验收测试
  225. 行为驱动开发
  226. stub或者虚拟化第三方服务
  227. 将所有这些整合在一起
  228. 消费者驱动的合约
  229. RESTful API合约
  230. 消息合约
  231. 组件测试
  232. 嵌入式数据存储
  233. 内存消息队列
  234. 测试替代
  235. 创建内部资源或接口
  236. 进程内和进程外
  237. 集成测试
  238. 验证外部交互
  239. 测试容错性
  240. 单元测试
  241. 交互型单元测试
  242. 独立型单元测试
  243. 处理不可预知的测试
  244. 数据
  245. 还未准备好的资源
  246. 不确定性事件
  247. 如果你什么都做不了
  248. 自上而下的测试和自下而上的测试
  249. 自上而下的测试
  250. 自下而上的测试
  251. 将所有内容都融入构建管道
  252. 多少测试才够
  253. 总结
  254. 第12章 系统质量属性测试:验证非功能性需求
  255. 为什么要测试非功能性需求
  256. 代码质量
  257. 架构质量
  258. ArchUnit:架构方面的单元测试
  259. 使用 JDepend 生成设计质量指标
  260. 性能和压力测试
  261. 使用 Apache Benchmark 进行基本的性能测试
  262. 使用 Gatling 进行压力测试
  263. 安全、漏洞和威胁
  264. 代码级别的安全验证
  265. 依赖项验证
  266. 与部署平台相关的安全问题
  267. 后续步骤:威胁建模
  268. 混乱测试
  269. 在生产环境中制造混乱(引入猴子)
  270. 在预发布环境中造成混乱
  271. 需要多少非功能性测试才够
  272. 总结
  273. 第13章 可观察性:监控、日志和跟踪
  274. 可观察性和持续交付
  275. 为什么要观察应用程序
  276. 我们希望监控:应用程序、网络和机器
  277. 如何观察:监控、日志和跟踪
  278. 报警
  279. 面向可观察性的系统设计
  280. 指标
  281. 指标的类型
  282. Dropwizard Metrics
  283. Spring Boot Actuator
  284. Micrometer
  285. 使用指标的最佳实践
  286. 日志
  287. 日志的形式
  288. SLF4J
  289. Log4j 2
  290. 日志的最佳实践
  291. 请求跟踪
  292. trace、span和 baggage
  293. Java跟踪工具:OpenZipkin、Spring Sleuth和OpenCensus
  294. 分布式跟踪的推荐实践
  295. 异常跟踪
  296. Airbrake
  297. 系统监控工具
  298. collectd
  299. rsyslog
  300. Sensu
  301. 收集和存储
  302. Prometheus
  303. Elastic-Logstash-Kibana
  304. 可视化
  305. 业务可视化
  306. 运维可视化
  307. 开发可视化
  308. 总结
  309. 第14章 迁移到持续交付
  310. 持续交付能力
  311. 选择你要迁移的项目
  312. 情景感知
  313. Cynefin框架和持续交付
  314. 所有模型都是错误的,有些是有用的
  315. 开展持续交付
  316. 测量持续交付
  317. 从小处开始,尝试、学习、分享,然后重复整个过程
  318. 增加推广范围:领导变革
  319. 其他的指导和提示
  320. 不良实践和常见的反模式
  321. 丑陋的架构:改还是不改
  322. 总结
  323. 第15章 持续交付和持续改进
  324. 从现在开始
  325. 建立扎实的技术基础
  326. 持续交付价值(最重要的目标)
  327. 增加软件的共享责任
  328. 促进快速反馈和实验
  329. 在组织中开展持续交付
  330. 持续改进
  331. 总结
书名:Java持续交付
译者:张若飞 译
国内出版社:电子工业出版社
出版时间:2019年10月
页数:404
书号:978-7-121-37442-5
原版书书名:Continuous Delivery in Java
原版书出版商:O'Reilly Media
Daniel Bryant
 
Daniel Bryant是Datawire的一名独立技术顾问及产品架构师。 他主要关注DevOps工具、云/容器平台,以及各种微服务实现。
 
 
Abraham Marín-Pérez
 
Abraham Marín-Pérez是一名独立的Java和Scala开发者,主要关注“数字化转型”领域,通过技术变革来帮助组织提升能力。
 
 
购买选项
定价:119.00元
书号:978-7-121-37442-5
出版社:电子工业出版社