本书将帮助你使用Spring Boot和Kubernetes来设计、构建和部署云原生应用。它定义了一条通往生产的路线图,并讲授了有效的技术,你可以基于此立即尝试企业级应用的构建。它还带领你一步一步地从初始想法直到生产,展示云原生开发是如何在软件开发生命周期的每个阶段增加商业价值的。当开发一个在线书店系统时,你将学习如何使用Spring和Java生态系统中强大的库来构建和测试云原生应用。本书会逐章介绍REST API、数据持久化、反应式编程、API网关、函数、事件驱动架构、韧性、安全性、测试和可观测性。同时,本书阐述了如何将应用打包成容器镜像,如何配置像Kubernetes这样的云环境以便于部署,如何让应用为生产做好准备,以及如何利用持续交付和持续部署,设计从代码到生产的路径。
本书提供了一个以项目为导向的实践指南,帮助你总览日益复杂的云计算环境,并学习如何将模式和技术相结合,建立一个真正的云计算原生系统并将其投入生产。
本书的目标读者是那些想了解更多关于如何使用Spring Boot和Kubernetes来设计、构建和部署生产就绪的云原生应用的开发人员和架构师。
为了从本书中获得最大的收益,你需要具备熟练的Java编程技能、构建Web应用的经验,以及Spring核心特性的基本知识。我假设你已经熟悉Git、面向对象编程、分布式系统、数据库和测试。阅读本书不要求有Docker和Kubernetes的经验。
本书分为四部分,共计16章。
第一部分内容为从代码到生产的云原生之旅奠定基础,帮助你更好地理解本书其他部分所涉及的主题,并将它们正确定位在整个云原生的全景图中。
■ 第1章是对云原生全景的介绍,包括云原生的定义、云原生应用的基本属性,以及支撑它们的流程。
■ 第2章涵盖了云原生开发的原则,并指导你首次亲身体验构建一个最小的Spring Boot应用,并将其作为一个容器部署到Kubernetes中。
第二部分介绍了使用Spring Boot和Kubernetes构建生产就绪的云原生应用的主要实践和模式。
■ 第3章涵盖了启动一个新的云原生项目的基础知识,包括组织代码库、管理依赖关系和定义部署流水线的提交阶段的策略。你将学习如何使用Spring MVC和Spring Boot Test实现和测试REST API。
■ 第4章讨论了外部化配置的重要性,并介绍了Spring Boot应用的一些可用方案,包括属性文件、环境变量和Spring Cloud Config的配置服务。
■ 第5章主要介绍了云中的数据服务,并展示如何使用Spring Data JDBC向Spring Boot应用添加数据持久化功能。你将学习如何使用Flyway管理生产环境中的数据以及使用Testcontainers进行测试的策略。
■ 第6章是关于容器的,我们将学习关于Docker的更多知识,以及如何使用Dockerfile和Cloud Native Buildpacks将Spring Boot应用打包为容器镜像。
■ 第7章讨论了Kubernetes,包括服务发现、负载均衡、可扩展性和本地开发工作流程。你还会学习将Spring Boot应用部署到Kubernetes集群的更多知识。
第三部分涵盖了云中分布式系统的基本属性和模式,包括韧性、安全性、可扩展性和API网关。这部分还介绍了反应式编程和事件驱动架构。
■ 第8章介绍了反应式编程和Spring反应式技术栈(包括Spring WebFlux和Spring Data R2DBC)的主要特性,你还会学习如何使用Reactor项目使应用更具韧性。
■ 第9章涵盖了API网关模式以及如何使用Spring Cloud Gateway构建边缘服务。你将学习如何使用Spring Cloud和Resilience4J构建有韧性的应用,在这个过程中会使用重试、超时、回退、断路器和限流器等模式。
■ 第10章描述了事件驱动架构,并教你使用Spring Cloud Function、Spring Cloud Stream和RabbitMQ来实现该架构。
■ 第11章是关于安全的,向你展示了如何使用Spring Security、OAuth2、OpenID Connect和Keycloak在云原生系统中实现认证。它还描述了当系统使用单页应用时,如何解决安全问题,如CORS和CSRF。
■ 第12章继续安全之旅,涵盖了如何使用OAuth2和Spring Security在分布式系统中实现委托访问、保护API和数据,并根据用户的角色进行授权。
第四部分指导你完成最后几个步骤,使你的云原生应用为生产做好准备,解决了可观测性、配置管理、Secret管理和部署策略等问题。它还涵盖了Serverless和原生镜像。
■ 第13章介绍了如何利用Spring Boot Actuator、OpenTelemetry和Grafana可观测性技术栈以使你的云原生应用支持可观测性。你将学习如何配置Spring Boot应用,以产生重要的遥测数据,如日志、健康状况、度量、跟踪等。
■ 第14章涉及高级配置和Secret管理策略,包括Kubernetes原生方案(如ConfigMap和Secret)以及Kustomize。
■ 第15章指导你完成云原生之旅的最后一个步骤,并讲解如何配置Spring Boot的生产环境。然后,我们将会为应用设置持续部署,采用GitOps策略将它们部署到公有云的Kubernetes集群中。
■ 第16章涉及Serverless架构以及基于Spring Native和Spring Cloud Function的函数。你还会了解Knative及其强大的功能,它在Kubernetes之上提供了卓越的开发者体验。
一般来说,我建议从第1章开始,按顺序阅读每一章。如果你喜欢根据自己的兴趣以不同的顺序阅读各章,请确保先阅读完第1~3章,以便更好地理解全书使用的术语、模式和策略。然而,因为每一章都建立在前一章的基础之上,所以如果你决定不按顺序阅读,可能会缺少一些背景知识。
本书给予读者基于实践和项目驱动的体验。从第2章开始,我们将为一个虚拟的在线书店建立由多个云原生应用组成的系统。
书中项目开发的所有源代码都可以在GitHub(https://github.com/ThomasVitale/cloud-native- spring-in-action)上找到,并基于Apache许可证2.0进行授权。对于每一章,你都会发现有一个“begin”和一个“end”目录。每一章都建立在前一章的基础上,但即便你没有关注前面的章节,也始终可以把某一章的“begin”目录作为一个起点。“end”目录包含完成本章所有步骤后的最终结果,你可以将其与自己的解决方案进行对比。例如,你可以在Chapter03目录中找到第3章的源码,其中包含了“03-begin”和“03-end”目录。
本书开发的所有应用都是基于Java 17和Spring Boot 2.7,并使用Gradle构建的。这些项目可以导入任何支持Java、Gradle和Spring Boot的IDE中,如Visual Studio Code、IntelliJ IDEA或Eclipse。除此之外,你还需要安装Docker。第2章和附录A提供了更多的信息,以帮助你建立本地环境。
这些样例已经在macOS、Ubuntu和Windows上进行了测试。在Windows上,我建议使用Windows Subsystem for Linux来完成本书中描述的部署和配置任务。在macOS上,如果你使用Apple Silicon机器的话,你可以运行所有的例子,但可能会遇到一些工具性能问题,在编写本书时这些工具没有提供对ARM64架构的原生支持。在相关章节中,我会添加额外的背景信息。
前面提到的GitHub资源库(https://github.com/ThomasVitale/cloud-native-spring-in-action)在主分支中包含了本书的所有源代码。除此之外,我还计划维护一个sb-2-main分支,在该分支中我将根据Spring Boot 2.x的未来版本保持源代码的更新;以及一个sb-3-main分支,在该分支下我将根据Spring Boot 3.x的未来版本对源代码不断演进。
本书包含许多源代码样例,有的使用已编号的程序清单,有的则直接嵌入正文。在这两种情况下,源代码都使用固定宽度的字体进行排版,以便将其与普通文本区分开。有时也会用粗体字来突出显示与本章前文步骤相比有变化的代码,例如,将一个新的特性添加到现有代码行。
在许多情况下,原始源代码会重新格式化,我们添加了换行符和重新缩进,以适应书中可用的页面空间。在极少数情况下,这样做依然是不够的,在这种情况下程序清单会包括换行符(➥)。此外,如果在正文中已经描述过代码,源代码中的注释通常会被移除。许多程序清单会有代码注释,用来突出强调重要的概念。