Memorystore ile Spring Boot uygulamasından veri önbelleğe alma

Redis için Memorystore, Google Cloud'a yönelik 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 üstün performans elde edebilir. Spring Boot uygulamalarının performansını artırmak için veri önbelleğe alma işleminin arka ucu olarak kullanılabilir. Bu codelab'de, nasıl ayarlayacağınız açıklanmaktadır.

Neler öğreneceksiniz?

  • Memorystore'u Spring Boot uygulaması için önbellek arka ucu olarak kullanma

Gerekenler

  • Google Cloud projesi
  • Google Chrome gibi bir tarayıcı
  • Vim, Emacs ve GNU Nano gibi standart Linux metin düzenleyicileri hakkında bilgi sahibi olmanız gerekir.

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

Yalnızca okuma Okuma ve alıştırmaları tamamlama

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

Başlangıç Orta İleri

Kendi hızınızda ortam kurulumu

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

Screenshot from 2016-02-10 12:45:26.png

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında 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 tamamlamak size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet daha yüksek olabilir (bu belgenin sonundaki "temizleme" bölümüne bakın).

Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme sürümünden yararlanabilir.

Google Cloud Shell'i etkinleştir

GCP Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

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

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Google Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulandığını ve projenin PROJECT_ID'nize göre ayarlandığını görürsünüz.

Kimliğinizin doğrulandığını onaylamak 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>

Değilse aşağıdaki 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 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 değerini alın. Bu kimliği daha sonra Spring Boot uygulamanızı yapılandırırken tekrar kullanacaksınız.

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

Google Cloud Console'da Depolama > Memorystore'a 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 > VM instances'a (Sanal makine örnekleri) gidip Connect (Bağlan) sütununda SSH'ı tıklayarak SSH üzerinden örneğinize bağlanın:

Sanal makine örneği kabuğunda (Cloud Shell değil) OpenJDK, Maven ve telnet'i yükleyin:

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

Yüklemenin tamamlanmasını bekleyin ve ardından sonraki adıma geçin.

web, redis ve cache bağımlılıkları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

Uygulamayı, Redis ana makinesi için Memorystore örneğinin IP adresini kullanacak şekilde yapılandırmak üzere application.properties dosyasını düzenleyin.

$ nano src/main/resources/application.properties

Aşağıdaki satırı, Memorystore for Redis IP adresinizle (birkaç adım önceki) birlikte ekleyin:

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

Bundan sonra yeni bir satır ekleyin ve bir REST denetleyicisi Java sınıfı oluşturun:

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

Dosyaya aşağıdaki içeriği ekleyin:

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 kullanıma sunar ve yolun bir bölümünü bir yöntem parametresiyle eşler (@PathVariable ek açıklamasıyla belirtildiği gibi).

@Cacheable("hello") notu, yöntem yürütmenin ö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. Örneği, ilerleyen bölümlerdeki kod laboratuvarında göreceksiniz.

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

DemoApplication.java öğesini düzenleyin:

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

İçe aktarın org.springframework.cache.annotation.EnableCaching ve bu ek açıklamayla sınıfa ek açıklama ekleyin. Sonuç şu şekilde 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

Daha önce yaptığınız gibi örneğinize başka bir SSH bağlantısı açın. Yeni SSH penceresinde, /hello/ uç noktasına birden çok kez erişerek ad olarak "bob" değerini iletin.

$ 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

İsteğin ilk seferde beş saniye sürdüğünü, ancak yöntemde Thread.sleep(5000)invocation olmasına rağmen bir sonraki isteğin önemli ölçüde daha hızlı olduğunu fark edin. Bunun nedeni, gerçek yöntemin yalnızca bir kez yürütülüp sonucun önbelleğe yerleştirilmesidir. Sonraki her çağrı, sonucu doğrudan önbellekten döndürür.

Uygulamanın tam olarak neyi önbelleğe aldığını görebilirsiniz. Önceki adımda kullandığınız terminalden telnet kullanarak Redis için Memorystore 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ördüğünüz gibi, anahtar için ön ek olarak önbellek adı, ikinci bölüm olarak ise parametre değeri kullanılı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

Redis için Memorystore ve bir Compute Engine örneği oluşturmuş olmanız gerekir. 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.