1. 總覽
Memorystore for Redis 是適用於 Google Cloud 的全代管 Redis 服務。透過運用高擴充性、可用性和安全性的 Redis 服務,您無須費心管理複雜的 Redis 部署作業,可在 Google Cloud 中運作的應用程式發揮最佳效能。可做為資料快取的後端,提高 Spring Boot 應用程式的效能。本程式碼研究室會說明如何進行設定。
課程內容
- 瞭解如何使用 Memorystore 做為 Spring Boot 應用程式的快取後端。
軟硬體需求
- Google Cloud 專案
- 使用 Google Chrome 等瀏覽器
- 熟悉 Vim、Emacs 和 GNU Nano 等標準的 Linux 文字編輯器
您會如何使用本程式碼研究室?
針對使用 Google Cloud 服務的經驗,您會給予什麼評價?
2. 設定和需求
自修環境設定
提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID
。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟用 Cloud Shell
- 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 。
如果您從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:
佈建並連線至 Cloud Shell 只需幾分鐘的時間。
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可以透過瀏覽器或 Chromebook 完成。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。
- 在 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」Memorystore>Redis。執行個體應處於「已就緒」狀態州:
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」>Compute Engine >「VM 執行個體」,然後按一下「連線」欄中的「SSH」:
在虛擬機器 (VM) 執行個體殼層 (非 Cloud Shell) 中,安裝 OpenJDK、Maven 和 Redis 工具:
$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools
請等待安裝作業完成,再進行下一個步驟。
5. 設定 Spring Boot 應用程式
使用 web
、redis
和 cache
依附元件建立新的 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
」。與參數值作為快取鍵搭配使用。您稍後會在程式碼研究室中看到範例。
接下來,我們會在 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 應用程式,以便搭配 Spring Boot 快取使用 Memorystore!
瞭解詳情
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。