使用 Memorystore 缓存 Spring Boot 应用的数据

1. 概览

Memorystore for Redis 是 Google Cloud 的一种全代管式 Redis 服务。通过利用具有高扩缩能力、高可用性且高度安全的 Redis 服务,在 Google Cloud 上运行的应用可实现卓越性能,且不必管理复杂的 Redis 部署。它可以用作数据缓存的后端,以提高 Spring Boot 应用的性能。本 Codelab 会说明如何进行设置。

学习内容

  • 如何将 Memorystore 用作 Spring Boot 应用的缓存后端。

所需条件

  • Google Cloud 项目
  • 浏览器,例如 Google Chrome
  • 熟悉标准的 Linux 文本编辑器,例如 Vim、Emacs 和 GNU Nano

您将如何使用本 Codelab?

仅阅读 阅读并完成练习

您如何评价自己在 Google Cloud 服务方面的经验水平?

<ph type="x-smartling-placeholder"></ph> 新手 中级 熟练

2. 设置和要求

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 (如果您还没有 Gmail 或 G Suite 账号,则必须创建一个。)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID

  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分部分,其中会指导您如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud ShellH7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

如果您以前从未启动过 Cloud Shell,将看到一个中间屏幕(在折叠下面),描述它是什么。如果是这种情况,请点击继续(您将永远不会再看到它)。一次性屏幕如下所示:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

预配和连接到 Cloud Shell 只需花几分钟时间。

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 设置 Memorystore for Redis 实例

启动 Cloud Shell。

在 Cloud Shell 启动后,使用命令行启用 Memorystore API 并创建新的 Memorystore 实例。

$ gcloud services enable redis.googleapis.com
$ gcloud redis instances create myinstance --size=1 --region=us-central1

操作完成后,您的实例即准备就绪可供使用。

运行以下命令来获取实例的 redis 主机 IP 地址。稍后,您在配置 Spring Boot 应用时将再次使用它。

$ gcloud redis instances describe myinstance --region=us-central1 \
  | grep host
host: 10.0.0.4

在 Google Cloud 控制台中,前往数据库 >Memorystore >Redis。您的实例应处于“就绪”状态州:

ee90b43f15a6dc1f.png

4. 设置 Compute Engine 实例

在同一地区创建一个 Compute Engine 实例。

$ gcloud compute instances create instance-1 --zone us-central1-c

操作完成后,您的实例即准备就绪可供使用。

使用以下命令,通过 SSH 连接到您的实例:

$ gcloud compute ssh instance-1 --zone us-central1-c

或者,导航到计算 >Compute Engine >虚拟机实例,然后点击连接列中的 SSH

a87bd437a0c8c7b4.png

在虚拟机 (VM) 实例 shell(而不是 Cloud Shell)中,安装 OpenJDK、Maven 和 Redis 工具:

$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools

等待安装完成,然后继续执行下一步。

5. 设置 Spring Boot 应用

使用 webrediscache 依赖项创建一个新的 Spring Boot 项目:

$ curl https://start.spring.io/starter.tgz \
  -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \
  -d type=maven-project \
  | tar -xzvf - && cd cache-app

修改 application.properties 文件,将应用配置为使用 Memorystore for Redis 主机的 IP 地址。

$ nano src/main/resources/application.properties

添加以下行,使其具有您的 Memorystore for Redis IP 地址(由前面几个步骤得到):

spring.data.redis.host=<memorystore-host-ip-address> 

在后面添加新的一行,并创建 REST 控制器 Java 类:

$ nano src/main/java/com/example/demo/HelloWorldController.java

将以下内容粘贴到文件中:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
@Autowired
private StringRedisTemplate template;

@RequestMapping("/hello/{name}")
@Cacheable("hello")
public String hello(@PathVariable String name) throws InterruptedException {
  Thread.sleep(5000);
  return "Hello " + name;
 }
}

@RequestMapping 注释将该方法作为 HTTP 端点公开,并将路径的一部分映射到方法参数中(如 @PathVariable 注释所示)。

@Cacheable("hello") 注释用于指示应缓存方法执行,缓存名称为“hello”。它与参数值一起用作缓存键。稍后您会在 Codelab 中看到一个示例。

接下来,我们将在 Spring Boot 应用类中启用缓存。修改 DemoApplication.java

$ nano src/main/java/com/example/demo/DemoApplication.java

导入 org.springframework.cache.annotation.EnableCaching 并用对类添加此注释。结果应如下所示:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class DemoApplication {

public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }
}

6. 运行应用并访问端点

确保将 JAVA_HOME 设置为正确的版本:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

现在,您可以运行应用了!

$ mvn spring-boot:run

使用与之前相同的方式另外打开一个到实例的 SSH 连接。在新的 SSH 窗口中,多次访问 /hello/ 端点,并传递“bob”作为名称。

$ time curl http://localhost:8080/hello/bob
Hello bob!

real        0m5.408s
user        0m0.036s
sys        0m0.009s

$ time curl http://localhost:8080/hello/bob
Hello bob!

real        0m0.092s
user        0m0.021s
sys        0m0.027s

请注意,第一次请求需要 5 秒钟,但是下一次请求要快得多,尽管您在方法中调用了 Thread.sleep(5000)。这是因为实际方法仅执行了一次,并且结果被放入了缓存中。之后的每次调用都会直接从缓存中返回结果。

7. 查看缓存的对象

实际上,您可以准确查看应用缓存的内容。从您在上一步中使用的同一个终端,使用 redis-cli 连接到 Memorystore for Redis 主机:

$ redis-cli -h <memorystore-host-ip-address>

如需查看缓存键列表,请使用以下命令:

:6379> KEYS *
1) "hello::bob"

如您所见,缓存名称用作键的前缀,参数值用作第二部分。

如需检索值,请使用 GET 命令:

:6379> GET hello::bob
   Hello bob!

使用 exit 命令可退出。

8. 清理

如需清理,请从 Cloud Shell 中删除 Compute Engine 和 Memorystore 实例。

删除计算实例:

$ gcloud compute instances delete instance-1 --zone us-central1-c

删除 Memorystore for Redis 实例:

$ gcloud redis instances delete myinstance --region=us-central1

9. 恭喜!

您已创建 Memorystore for Redis 和 Compute Engine 实例。此外,您还将 Spring Boot 应用配置为将 Memorystore 与 Spring Boot 缓存结合使用!

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。