Lưu dữ liệu vào bộ nhớ đệm từ ứng dụng Spring Boot bằng Memorystore

1. Tổng quan

Memorystore for Redis là một dịch vụ Redis được quản lý toàn diện dành cho Google Cloud. Các ứng dụng chạy trên Google Cloud có thể đạt được hiệu suất cực cao bằng cách tận dụng dịch vụ Redis bảo mật, có khả năng mở rộng cao và có thể sử dụng mà không phải chịu gánh nặng quản lý các hoạt động triển khai Redis phức tạp. Nó có thể được dùng làm phần phụ trợ cho việc lưu dữ liệu vào bộ nhớ đệm nhằm cải thiện hiệu suất của các ứng dụng Spring Boot. Lớp học lập trình giải thích cách thiết lập.

Kiến thức bạn sẽ học được

  • Cách sử dụng Memorystore làm phần phụ trợ bộ nhớ đệm cho ứng dụng Spring Boot.

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Google Chrome
  • Quen thuộc với các trình chỉnh sửa văn bản tiêu chuẩn của Linux như Vim, Emacs và GNU Nano

Bạn sẽ sử dụng lớp học lập trình này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID.

  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuyFP1RzVad_4nCa0Zszrz5LtwQZZ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Nếu trước đây chưa từng khởi động Cloud Shell, bạn sẽ được trình bày một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

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

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

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

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Thiết lập Memorystore cho thực thể Redis

Khởi động Cloud Shell.

Sau khi Cloud Shell chạy, hãy sử dụng dòng lệnh để bật API Memorystore và tạo một phiên bản Memorystore mới.

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

Sau khi thao tác này hoàn tất, thực thể của bạn sẽ sẵn sàng để sử dụng.

Lấy địa chỉ IP của máy chủ redis của thực thể bằng cách chạy lệnh sau. Bạn sẽ sử dụng lại trình cài đặt này sau khi định cấu hình ứng dụng Spring Boot.

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

Trong Google Cloud Console, hãy chuyển đến phần Databases (Cơ sở dữ liệu) > Memorystore > (Kho bộ nhớ) > Redis. Thực thể máy ảo của bạn phải ở trạng thái "sẵn sàng" trạng thái :

ee90b43f15a6dc1f.png

4. Thiết lập một phiên bản Compute Engine

Tạo một phiên bản Compute Engine trong cùng một khu vực.

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

Sau khi thao tác này hoàn tất, thực thể của bạn sẽ sẵn sàng để sử dụng.

Kết nối với thực thể máy ảo của bạn qua SSH bằng lệnh sau:

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

Hoặc, hãy chuyển đến phần Tính toán > Compute Engine > (Công cụ điện toán) > Thực thể máy ảo và nhấp vào SSH (Kết nối) trong cột Connect (Kết nối):

a87bd437a0c8c7b4.png

Trong shell thực thể của máy ảo (VM) (không phải Cloud Shell), hãy cài đặt các công cụ OpenJDK, Maven và Redis:

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

Hãy chờ quá trình cài đặt hoàn tất rồi chuyển sang bước tiếp theo.

5. Thiết lập ứng dụng Spring Boot

Tạo một dự án Spring Boot mới có các phần phụ thuộc web, rediscache:

$ 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

Chỉnh sửa tệp application.properties nhằm định cấu hình ứng dụng để dùng địa chỉ IP của thực thể Memorystore cho máy chủ Redis.

$ nano src/main/resources/application.properties

Thêm dòng sau vào Memorystore cho địa chỉ IP Redis của bạn (từ vài bước trước):

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

Sau đó, hãy thêm một dòng mới và tạo một lớp Java cho trình điều khiển REST:

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

Đặt nội dung sau vào tệp:

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;
 }
}

Chú giải @RequestMapping hiển thị phương thức dưới dạng một điểm cuối HTTP và ánh xạ một phần đường dẫn đến một tham số phương thức (như được chỉ định trong chú thích @PathVariable).

Chú giải @Cacheable("hello") cho biết quá trình thực thi phương thức sẽ được lưu vào bộ nhớ đệm và tên bộ nhớ đệm là "hello". Khoá này được dùng kết hợp với giá trị tham số làm khoá bộ nhớ đệm. Bạn sẽ xem ví dụ ở phần sau trong lớp học lập trình.

Tiếp theo, chúng ta sẽ bật tính năng lưu vào bộ nhớ đệm trong lớp ứng dụng Spring Boot. Chỉnh sửa DemoApplication.java:

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

Nhập org.springframework.cache.annotation.EnableCaching và chú thích lớp bằng chú thích này. Kết quả sẽ có dạng như sau:

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. Chạy ứng dụng và truy cập vào điểm cuối

Hãy đảm bảo bạn đã đặt JAVA_HOME thành phiên bản phù hợp:

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

Bây giờ, bạn đã sẵn sàng chạy ứng dụng!

$ mvn spring-boot:run

Mở một kết nối SSH khác cho phiên bản của bạn theo cách tương tự như cách bạn đã làm trước đó. Trong cửa sổ SSH mới, hãy truy cập vào điểm cuối /hello/ nhiều lần, truyền "bob" dưới dạng tên.

$ 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

Lưu ý rằng lần đầu tiên yêu cầu mất 5 giây, nhưng lần tiếp theo nhanh hơn đáng kể mặc dù bạn có Thread.sleep(5000)lệnh gọi trong phương thức này. Đó là vì phương thức thực tế chỉ được thực thi một lần và kết quả được đưa vào bộ nhớ đệm. Mỗi lệnh gọi tiếp theo sẽ trả về kết quả trực tiếp từ bộ nhớ đệm.

7. Xem lại các đối tượng được lưu vào bộ nhớ đệm

Bạn thực sự có thể thấy chính xác những gì ứng dụng lưu vào bộ nhớ đệm. Từ thiết bị đầu cuối mà bạn đã sử dụng ở bước trước, hãy kết nối với Memorystore dành cho máy chủ Redis bằng redis-cli:

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

Để xem danh sách các khoá bộ nhớ đệm, hãy dùng lệnh sau:

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

Như bạn có thể thấy, tên bộ nhớ đệm được dùng làm tiền tố cho khoá và giá trị tham số được dùng làm phần thứ hai.

Để truy xuất giá trị, hãy sử dụng lệnh GET:

:6379> GET hello::bob
   Hello bob!

Dùng lệnh exit để thoát.

8. Dọn dẹp

Để dọn dẹp, hãy xoá các thực thể Compute Engine và Memorystore khỏi Cloud Shell.

Xoá phiên bản điện toán:

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

Xoá Memorystore cho thực thể Redis:

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

9. Xin chúc mừng!

Bạn đã tạo Memorystore cho Redis và một phiên bản Compute Engine. Ngoài ra, bạn đã định cấu hình ứng dụng Spring Boot để dùng Memorystore với tính năng lưu vào bộ nhớ đệm Spring Boot!

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.