کش داده ها از یک برنامه Spring Boot با Memorystore

۱. مرور کلی

Memorystore for Redis یک سرویس Redis کاملاً مدیریت‌شده برای Google Cloud است. برنامه‌هایی که روی Google Cloud اجرا می‌شوند می‌توانند با بهره‌گیری از سرویس Redis بسیار مقیاس‌پذیر، در دسترس و امن، بدون نیاز به مدیریت پیاده‌سازی‌های پیچیده Redis، به عملکرد فوق‌العاده‌ای دست یابند. می‌توان از آن به عنوان یک backend برای ذخیره‌سازی داده‌ها برای بهبود عملکرد برنامه‌های Spring Boot استفاده کرد. codelab نحوه راه‌اندازی آن را توضیح می‌دهد.

آنچه یاد خواهید گرفت

  • نحوه استفاده از Memorystore به عنوان حافظه پنهان (cache backend) برای یک برنامه Spring Boot.

آنچه نیاز دارید

  • یک پروژه ابری گوگل
  • یک مرورگر، مثلاً گوگل کروم
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، Emacs و GNU Nano

چگونه از codelab استفاده خواهید کرد؟

فقط خواندنی تمرین‌ها را بخوانید و انجام دهید

تجربه خود را با خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا G Suite ندارید، باید یکی ایجاد کنید .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aTQz5GpG0T

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعمل‌های بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش می‌دهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-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

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی پایدار ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است.

  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].

۳. یک Memorystore برای نمونه Redis راه‌اندازی کنید

شروع پوسته ابری.

پس از راه‌اندازی Cloud Shell، از خط فرمان برای فعال کردن API Memorystore و ایجاد یک نمونه جدید Memorystore استفاده کنید.

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

پس از اتمام عملیات، نمونه شما آماده استفاده خواهد بود.

با اجرای دستور زیر، آدرس IP میزبان redis مربوط به نمونه را دریافت کنید. بعداً هنگام پیکربندی برنامه Spring Boot خود، دوباره از آن استفاده خواهید کرد.

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

در کنسول گوگل کلود، به مسیر Databases > Memorystore > Redis بروید. نمونه شما باید در حالت "آماده" باشد:

ee90b43f15a6dc1f.png

۴. یک نمونه موتور محاسباتی راه‌اندازی کنید

یک نمونه 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 instances بروید و در ستون Connect روی SSH کلیک کنید:

a87bd437a0c8c7b4.png

در پوسته نمونه ماشین مجازی (VM) (نه پوسته ابری)، ابزارهای OpenJDK، Maven و Redis را نصب کنید:

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

صبر کنید تا نصب کامل شود و سپس به مرحله بعدی بروید.

۵. یک برنامه Spring Boot راه‌اندازی کنید

یک پروژه Spring Boot جدید با وابستگی‌های web ، redis و cache ایجاد کنید:

$ 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 را ویرایش کنید تا برنامه را طوری پیکربندی کنید که از آدرس IP نمونه Memorystore برای میزبان Redis استفاده کند.

$ nano src/main/resources/application.properties

خط زیر را به همراه آدرس IP مربوط به Memorystore برای Redis (از چند مرحله قبل) اضافه کنید:

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

بعد از آن یک خط جدید اضافه کنید و یک کلاس جاوا برای کنترلر REST ایجاد کنید:

$ 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 " است. این نام در ترکیب با مقدار پارامتر به عنوان کلید حافظه پنهان استفاده می‌شود. مثالی از آن را بعداً در آزمایشگاه کد خواهید دید.

در مرحله بعد، قابلیت ذخیره‌سازی (caching) را در کلاس برنامه 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);
 }
}

۶. برنامه را اجرا کنید و به نقطه پایانی دسترسی پیدا کنید

مطمئن شوید که 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

توجه داشته باشید که اولین درخواست پنج ثانیه طول کشید، اما با وجود اینکه فراخوانی Thread.sleep(5000) را در متد دارید، درخواست بعدی به طور قابل توجهی سریع‌تر بود. دلیل این امر این است که متد اصلی فقط یک بار اجرا شده و نتیجه در حافظه پنهان قرار گرفته است. هر فراخوانی بعدی نتیجه را مستقیماً از حافظه پنهان برمی‌گرداند.

۷. بررسی اشیاء ذخیره شده در حافظه پنهان (cache)

شما می‌توانید دقیقاً ببینید که برنامه چه چیزی را ذخیره کرده است. از همان ترمینالی که در مرحله قبل استفاده کردید، با استفاده از redis-cli به Memorystore برای میزبان Redis متصل شوید:

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

برای مشاهده لیست کلیدهای کش، از دستور زیر استفاده کنید:

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

همانطور که می‌بینید، نام حافظه پنهان به عنوان پیشوند کلید و مقدار پارامتر به عنوان بخش دوم استفاده شده است.

برای بازیابی مقدار، از دستور GET استفاده کنید:

:6379> GET hello::bob
   Hello bob!

برای خروج از دستور exit استفاده کنید.

۸. تمیز کردن

برای پاکسازی، نمونه‌های Compute Engine و Memorystore را از Cloud Shell حذف کنید.

نمونه محاسبه را حذف کنید:

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

نمونه Memorystore مربوط به Redis را حذف کنید:

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

۹. تبریک می‌گویم!

شما Memorystore را برای Redis و یک نمونه Compute Engine ایجاد کردید. همچنین، یک برنامه Spring Boot را برای استفاده از Memorystore با قابلیت ذخیره‌سازی Spring Boot پیکربندی کردید!

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.