👋欢迎来到使用 Java 和 DGS 缓存子图!
我们非常高兴您参加我们GraphQL和 Java 系列课程。
现在是探索提升我们的GraphQL 服务器性能的一种策略的时候了:缓存!在此课程中,我们将探讨缓存的工作原理,并将其应用到我们的 GraphQL 操作字符串——以及我们用于解决它们的实际数据。
让我们开始吧!
为什么要缓存?
当我们构建一个联邦架构时,我们从一开始就优先考虑性能:一个集中化路由器接收客户端请求,根据子图的责任将其拆分,并执行更小的请求来收集所需的所有数据。有了超图模式作为核心,我们的路由器已经了解如何询问每个子图服务器来只获取其负责的数据——仅此而已!这使我们的操作精简、高效且可组合。
通过在子图服务器端实现缓存,我们为整个图形提供了另一项小小的性能提升。
使用操作缓存,我们的子图服务器可以一次解析和验证某个操作——然后,服务器在未来收到相同的操作时可以更快速地执行该操作。
当我们缓存由 数据源方法返回的数据时,收益会进一步扩大;这使我们的 子图只需获取一次数据,然后在其再次被查询时直接从其缓存中提供结果。只需进行一点配置,我们就能启动一个新的缓存,该缓存使我们能够定义 什么应该被缓存以及 多长时间它应该保持被缓存的状态。而且我们使用 DGS、Spring Boot 以及名为 Caffeine的缓存库来实现这一切。
我们正在构建什么
当我们学习并实现这些概念时,我们将致力于我们的课程项目: Airlock。
Airlock 是一款星际旅行预订应用:这是我们能够利用的资源,用于在浩瀚的宇宙中找到很酷的下榻之所!我们已经在GraphQL 课程简介中构建了该房源服务器的起点。我们的项目还包括 dataloaders
目录,我们将在 数据加载器与 Java 和 DGS中详细介绍它。
在该课程中,我们将探讨 操作和数据缓存如何能够帮助 Airlock 以比以往任何时候都更快的速度提供房源。
项目设置
要跟上该课程的进度,你需要具备以下条件
先决条件
我们假设你熟悉 GraphQL概念,如类型、查询和 突变。如果你需要复习,请查看我们的 GraphQL 与 Java 和 DGS 课程简介。
我们的房源服务器是一个 子图,这意味着它是更大联邦图中的一个部分。要复习 GraphQL 联合,请查看我们的 Java 和 DGS 联合课程。
还应熟悉 Java 编程概念(此课程使用 JDK 17)和 Spring Boot的基本知识。
代码编辑器或 IDE
我们使用的是 IntelliJ IDEA(社区版)。
许多流行的 IDE 提供可启用 GraphQL语法高亮的插件。对于 IntelliJ,我们推荐使用 GraphQL 插件。
克隆代码库
我们先来了解一下代码设置。
打开一个终端到一个新目录并运行以下命令
git clone https://github.com/apollographql-education/odyssey-caching-dgs.git
以下是项目结构,重点关注 src
目录:
📦 odyssey-caching-dgs┣ 📂 src┃ ┣ 📂 main┃ ┃ ┣ 📂 java/com/example/listings┃ ┃ ┃ ┣ 📂 datafetchers┃ ┃ ┃ ┣ 📂 dataloaders┃ ┃ ┃ ┣ 📂 datasources┃ ┃ ┃ ┣ 📂 models┃ ┃ ┃ ┣ 📄 ListingsApplication.java┃ ┃ ┃ ┗ 📄 WebConfiguration.java┃ ┃ ┗ 📂 resources┃ ┃ ┃ ┣ 📂 schema┃ ┃ ┃ ┃ ┗ 📄 schema.graphql┃ ┃ ┃ ┗ 📄 application.properties┃ ┗ 📂 test/java/com/example/listings┗ 📄 ...other configuration files
注意:如果你在任何时候遇到问题,请查看 final
分支,以查看代码库的最终状态。
运行应用
最后,让我们启动并运行我们的服务器。
在 IDE 中打开该项目并导航到主 ListingsApplication
文件,该文件位于 com.example.listings
包中。这是我们应用的起点。
@SpringBootApplicationpublic class ListingsApplication {public static void main(String[] args) {SpringApplication.run(ListingsApplication.class, args);}}
在 IntelliJ 中,我们在 main
函数旁边的边距中有一个方便的绿色播放按钮,或者位于界面顶部的播放按钮。
或者,你可以打开一个新终端到你的项目根目录并运行以下命令
./gradlew bootRun
在 IDE 运行输出中,我们应该会看到我们的应用正在运行!
> Task :ListingsApplication.main(). ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v3.3.1)
测试查询
我们将使用 Sandbox Explorer对我们的服务器进行查询测试并衡量我们的性能改进。一旦你的应用启动并运行,请打开 Sandbox,并粘贴服务器的 GraphQL端点。
默认情况下,其值应如下所示。
https://127.0.0.1:8080/graphql
运行一些测试查询!通过 文档面板手动构建它们,或从下面的可折叠菜单中复制。
检查点
要点
- 我们将对 GraphQL 服务器的两个部分应用缓存:GraphQL 操作本身以及它们返回的数据
下一步
让我们深入了解我们的第一个主题:缓存 GraphQL 操作。
分享你对本课程的问题和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发帖。没有帐户? 改在我们的 Odyssey 论坛上发帖。