Spring Boot uygulamasındaki verileri Memorystore ile önbelleğe alma

Restore için Storage, Google Cloud için tümüyle yönetilen bir Redis hizmetidir. Google Cloud'da çalışan uygulamalar, karmaşık Redis dağıtımlarını yönetme yükü olmadan yüksek oranda ölçeklenebilir, kullanılabilir ve güvenli Redis hizmetinden yararlanarak ek performans elde edebilir. Spring Boot uygulamalarının performansını artırmak için veri önbelleğe alma için arka uç olarak kullanılabilir. Codelab'de ayarların nasıl yapılacağı açıklanmaktadır.

Neler öğreneceksiniz?

  • Spring Boot uygulaması için Memorystore önbelleği olarak nasıl kullanılır?

Gerekenler

  • Bir Google Cloud projesi
  • Google Chrome gibi bir tarayıcı
  • Vim, Emacs ve GNU Nano gibi standart Linux metin düzenleyicilerini kullanma

codelab'i nasıl kullanacaksınız?

Salt okuma Alıştırmaları okuma ve tamamlama

Google Cloud hizmetleriyle ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yetkili

Bağımsız tempolu ortam kurulumu

Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform Console'da (console.cloud.google.com) oturum açın ve yeni bir proje oluşturun:

Ekran görüntüsü: 10.02.2016 12:45:26.png

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Bu, daha sonra bu codelab'de PROJECT_ID olarak adlandırılacaktır.

Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i gözden geçirmek için çalışmanın birkaç dolardan fazla maliyeti olmayacak. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bunları çalışır durumda bırakırsanız (bu belgenin sonundaki "temizlik" bölümüne bakın) daha yüksek maliyetli olabilir.

Yeni Google Cloud Platform kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Google Cloud Shell'i etkinleştir

GCP Console'dan, sağ üstteki araç çubuğu üzerinde Cloud Shell simgesini tıklayın:

Ardından "Cloud Shell'i Başlat"ı tıklayın:

Ortamın temel hazırlığı ve bağlantı kurması yalnızca birkaç dakika sürer:

Bu sanal makine, ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamı tarayıcı veya Google Chromebook ile yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu görmeniz gerekir.

Kimliğinizin doğrulanmasını sağlamak için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Ayarlanmamışsa şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Cloud Shell'i başlatın.

Cloud Shell başlatıldıktan sonra yeni bir Memorystore örneği oluşturmak için komut satırını kullanabilirsiniz.

$ gcloud redis instances create myinstance --size=1 --region=us-central1

Memorystore API etkinleştirilmemişse bu API'yi etkinleştirmek isteyip istemediğiniz sorulur. y yanıtını verin.

API [redis.googleapis.com] not enabled on project [204466653457].
Would you like to enable and retry (this will take a few minutes)?
(y/N)?  y
Enabling service redis.googleapis.com on project 204166153457...
Waiting for async operation operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 to complete...
Operation finished successfully. The following command can describe the Operation details:
 gcloud services operations describe operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416
Create request issued for: [myinstance]
Waiting for operation [operation-1538645026454-57763b937ad39-2564ab37-3fea7701] to complete...done.
Created instance [myinstance].

İşlem tamamlandıktan sonra örneğiniz kullanıma hazır olur.

Aşağıdaki komutu çalıştırarak örneğin redis host ip-address'ini alın. Daha sonra Spring Boot uygulamanızı yapılandırırken tekrar kullanırsınız.

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

Google Cloud Console'da Depolama > Bellek Mağazası'na giderseniz örneğinizi "hazır" durumunda görebilirsiniz :

Aynı bölgede bir Compute Engine örneği oluşturun.

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

İşlem tamamlandıktan sonra örneğiniz kullanıma hazır olur.

Compute > Compute Engine > Sanal makine örnekleri'ne giderek SSH üzerinden örneğinize bağlanıp Connect (Bağlan) sütununda SSH'yi tıklayın:

Sanal makine (VM) örnek kabuğunda (Cloud Shell'in değil) OpenJDK, Maven, telnet uygulamasını yükleyin:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

Yüklemenin tamamlanmasını bekleyip bir sonraki adıma geçin.

web, redis ve cache bağımlılarıyla yeni bir Spring Boot projesi oluşturun:

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

application.properties dosyasını düzenleyerek uygulamayı Redis ana makinesi için Memorystore örneğinin IP adresini kullanacak şekilde yapılandırın.

$ nano src/main/resources/application.properties

Memorystore for Redis IP adresinizle (aşağıdaki adımları ekleyin) aşağıdaki satırı ekleyin:

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

Bunun ardından yeni bir satır ekleyin ve REST denetleyici Java sınıfı oluşturun:

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

Dosyaya aşağıdaki içeriği yerleştirin:

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 ek açıklaması, yöntemi bir HTTP uç noktası olarak açığa çıkarır ve yolun bir kısmını bir yöntem parametresiyle (@PathVariable ek açıklaması ile belirtildiği şekilde) eşler.

@Cacheable("hello") ek açıklaması, yöntem çalıştırmanın önbelleğe alınması gerektiğini ve önbellek adının "hello" olduğunu gösterir. Önbellek anahtarı olarak parametre değeriyle birlikte kullanılır. Daha sonra kod laboratuvarında bir örnek görürsünüz.

Ayrıca, Spring Boot uygulama sınıfında önbelleğe almayı etkinleştirmeniz gerekir.

Düzenle: DemoApplication.java

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

Bu ek açıklamayla org.springframework.cache.annotation.EnableCaching içe aktarın ve sınıfa not ekleyin. Sonuç şöyle görünmelidir:

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

Artık uygulamayı çalıştırmaya hazırsınız.

$ mvn spring-boot:run

Örneğinizle aynı şekilde başka bir SSH bağlantısı açın. Yeni SSH penceresinde /hello/ uç noktasına birden fazla kez erişip ad olarak 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

İstek ilk kez beş saniye sürmüştür ancak bir sonraki istek, yöntemde Thread.sleep(5000) çağrılı olsa bile çok daha hızlıdır. Bunun nedeni, gerçek yöntemin yalnızca bir kez yürütülmesi ve sonucun önbelleğe alınmasıdır. Sonraki her çağrı, sonucu doğrudan önbellekten döndürür.

Uygulamanın tam olarak neleri önbelleğe aldığını görebilirsiniz. Önceki adımda kullandığınız terminalden telnet kullanarak Memorystore for Redis ana makinesine bağlanın:

$ telnet <memorystore-host-ip-address> 6379

Önbellek anahtarlarının listesini görmek için aşağıdaki komutu kullanın:

KEYS *
hello::bob

Görebileceğiniz gibi, önbellek adı anahtar için ön ek olarak, parametre değeri ise ikinci bölüm olarak kullanılmaktadır.

Değeri almak için GET komutunu kullanın:

$ GET hello::bob
   Hello bob!

Çıkmak için QUIT komutunu kullanın.

Temizlemek için Compute Engine ve Memorystore örneklerini Cloud Shell'den silin.

Compute örneğini silin:

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

Memorystore for Redis örneğini silin:

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

Memorystore for Redis ve bir Compute Engine örneği oluşturdunuz. Ayrıca, Spring Boot önbelleğe alma ile Memorystore'u kullanmak için bir Spring Boot uygulaması yapılandırdınız.

Daha Fazla Bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.