序 言
作为本书作者,我们在企业级Java 领域的经验都在十年以上。2016 年以来,我们一直在红帽共事。当时Java 微服务开发规范MicroProfile 正值初创之季,同期启动的还有作为运行时、实现这些规范的WildFly Swarm 项目(现在称为Thorntail)。
从那时起,Kubernetes 持续演进成一个容器编排平台。随着红帽在Kubernetes 及其企业级发行版OpenShift 上的持续投入,我们的工作也转变为把Thorntail 部署到Kubernetes 上。MicroProfile 社区也注意到Kubernetes 的兴起。我们双方紧密合作共同完善MicroProfile 规范,向其中添加让 Java 微服务部署到 Kubernetes 的支持。
我们能感受到Java 本身,以及像Thorntail 这样的运行时在部署到Kubernetes 时面临的一些限制,它们的微服务的每个实例都要占用数百兆字节的内存。在Kubernetes 集群这种共享的部署环境中,与Node.js 和Golang 等其他运行时相比,资源的利用率会成为Java 的巨大劣势。为了解决这一问题,红帽推出了超音速亚原子Java,也就是Quarkus!Quarkus 是一款与众不同的运行时。它能支持MicroProfile,以及众多行业领先的规范和框架,助力开发者迅速提高效率。Quarkus 将Kubernetes 作为首选部署平台,通过内置工具,将原生编译和Kubernetes 部署简化为一个命令。不得不说,在瑞士的纳沙泰尔,数十名红帽同事挤在一个会议室并肩作战,在我的职业生涯中,这绝对是令人印象深刻又收获满满的时光。
我们注意到,在MicroProfile、Kubernetes 以及近期的Quarkus 方面的图书已十分丰富。我们希望能写一本书,证明将这三者结合在一起使用,一定优于单独运用这三者的效用。我们不把面向Kubernetes 的部署作为额外的补充内容,而是嵌入每一章中。在本书整个讲解期间,我们都希望应用不仅要在本地开发,通过把应用以一系列微服务的方式部署到Kubernetes,我们希望能展示MicroProfile 开发的API 运行在Kubernetes 集群之后,如何与Prometheus、Grafana、Jaeger 和Kafka 等后端服务协同工作。在逐步展示基于MicroProfile 规范、Quarkus 实时编码风格的迭代式开发,以及搭配 JUnit 5、WireMock这些Quarkus API 对 MicroProfile 应用进行自动化测试之间,我们期望寻找一种平衡。
真正的挑战在于,在同一本书里,要结合运用Quarkus、MicroProfile 和Kubernetes开展微服务开发,并让体验尽可能接近实际情况。希望我们成功解决了这一挑战,读者也能像我们写作时学到的一样多。愿你开心阅读,开心编码!
前 言
过去几年来,Quarkus 作为一种微服务开发框架大为流行,而Eclipse MicroProfile 也持续演进成一组Java 微服务开发API。本书详细介绍如何基于MicroProfile 和Spring API新建、开发和调试Quarkus 微服务,并部署到Kubernetes 上。
除了微服务的开发和部署,本书还涵盖Kubernetes 微服务的其他方方面面,比如应用健康管理、监控、可观测性、安全性以及API 可视化。
本书读者对象
本书的目标受众包括,已有数年Java EE 和Jakarta EE 经验、具备一定微服务知识,正在探寻有关最佳实践和最新开发技术的开发者。开发者将能直观地学习Eclipse MicroProfile,了解如何借用Quarkus 使用这些API,以及如何把Quarkus 微服务部署到Kubernetes。
本书的内容组织:路线图
第1 章首先向读者介绍微服务和微服务架构的概念,以及我们为什么需要微服务相关的规范;接着介绍Eclipse MicroProfile、Quarkus 和Kubernetes。最后会提到一些Kubernetes 原生微服务的典型特性。
第2 章从创建新的Quarkus 项目开始,逐渐深入探讨Quarkus。该章介绍几个重要的话题,例如实时编码、编写测试、原生可执行程序,以及将Quarkus 应用打包和部署到Kubernetes 的过程。
第3 章首先介绍Quarkus 中基于Eclipse MicroProfile 的配置功能,包括如何设置并获取配置值;接着介绍如何运用ConfigSource 在Quarkus 中定义新的配置源。
第4 章介绍运用Panache 进行数据库交互。该章首先解释Quarkus 数据源的工作原理,然后讨论使用Panache 进行数据库访问的三种模式:JPA、活动记录和数据仓储;最后,解释如何在Kubernetes 中部署PostgreSQL 数据库。
第5 章介绍如何在Quarkus 中基于MicroProfile 消费外部服务:使用REST 客户端并为外部服务定义类型安全的表示形式。该章介绍REST 客户端的两种用法:CDI 和编程式API,以及如何模拟REST 客户端并开展测试。最后,该章讨论如何向客户端请求添加标头,介绍用于处理请求的额外过滤器与提供程序。
VI Kubernetes 原生微服务开发
第6 章介绍应用健康管理的概念,以及MicroProfile Health 规范与Kubernetes Pod 生命周期的集成方式。该章介绍如何将相似的检查组合为自定义分组,并从UI 便利地查看检查结果。
第7 章介绍MicroProfile Fault Tolerance 规范包含的所有韧性策略,包括舱壁、降级、重试和熔断器。该章还讨论如何通过配置属性覆写这些策略的设置。
第8 章介绍反应式流,解释反应式流的概念,以及它们在发布者、订阅者和处理者中的处理过程。该章接着解释如何在Quarkus 中利用Reactive Messaging 创建响应式流,并利用生成器将命令式代码与响应式代码桥接起来。最后讨论在Kubernetes 上部署Apache Kafka,以及一个反应式系统的过程,其中的反应式系统由数个微服务构成,微服务之间以Apache Kafka 作为相互联结的骨架。
第9 章讨论现有的Spring 开发者如何以极小的变动就可以把他们的应用转换为Quarkus 应用。接着讨论如何使用Spring 配置服务器作为Quarkus 的配置源。最后,该章详细介绍Spring 与Quarkus 之间,在Web 和数据访问方面不必修改代码就已具备的兼容性。
第10 章解释指标在应用监控领域(尤其是微服务架构体系)中的重要性。该章介绍如何运用 Prometheus 和Grafana 对指标进行可视化,包括MicroProfile Metrics 和Micrometer格式。
第11 章介绍运用 MicroProfile 和OpenTracing 跟踪微服务,解释如何在Kubernetes上部署Jaeger,从微服务向Jaeger 发送跟踪信息,并通过UI 查看这些跟踪信息。该章讨论如何自定义分段名称,以及通过注入跟踪器创建自定义分段。最后,该章还介绍如何跟踪数据库调用以及与Apache Kafka 之间的消息通信。
第12 章验证使用 MicroProfile OpenAPI 对API 进行可视化,并使用Swagger UI 查看所生成的 API 文档。接着讨论如何定制OpenAPI 文档,在REST 端点中体现应用信息、结构信息以及特定的操作详情。最后讨论设计先行模式,介绍存量OpenAPI 文档的使用方法。
第13 章解释微服务的认证和授权,首先讨论基于文件的认证,以及OpenID Connect和KeyCloak 的搭配使用。接着讨论对特定资源进行保护以及测试授权流程的方法。然后解释Json Web 令牌(JWT),以及从令牌各个部分获取的API。最后讨论如何利用JWT 为微服务添加安全保护,并在微服务之间传递令牌。
关于示例代码
本书包含大量的示例源代码,以带编号的代码清单或正文文本的形式出现。
很多情况下,原始的源代码可能会被重新排版;为了适配书页的版面,我们会添加一些换行符,并重新缩进。有些情况下,这样的处理还是不够,我们就会在代码清单里添加行延续符号(.)。此外,如果正文对代码进行了讲解,源代码中的注释通常就会被移除。很多代码清单都包含注解,以点明其中的重要信息。
书中的所有代码都可以在配书源代码中找到。读者可扫描封底二维码来下载完整的源代码。
关于封面插图
本书的封面画像题为Femme insulaire de Minorque,意为梅诺卡岛上的妇女。这幅画像来自Jacques Grasset de Saint-Sauveur(1757–1810)的画册Costumes civils actuels de tous lespeuples connus。该画册收集了身着各国服饰的人物画像,于1788 年在法国出版。其中的每幅画像都是手工精心绘制并着色而成的。Grasset de Saint-Sauveur 丰富多样的画集生动地向我们展示出200 年前,世界各地城镇与地区在文化上的巨大差异。由于彼此隔绝,人们说着不同的方言和语言。不管是在街上还是乡间,人们很容易通过衣着相互辨识住处、职业和地位。
自那以后,人们的着装风格和生活方式不断发生着变化,如此丰富的地区多样性也逐渐消失了。现在已经很难区分来自不同大陆的居民了,更不用说来自不同城镇、地区或国家的居民了。也许我们牺牲了文化多样性,换得了更加精彩纷呈的个人生活——当然,这是一种更加多样化和快节奏的科技生活。
在如今这个计算机图书同质化的时代,Manning 以反映两个世纪前丰富多样的地区生活的画像作为图书封面来颂扬计算机产业的独创性和主动性,让Jacques Grasset deSaint-Sauveur 的画作重现往日风采。