1. Genel Bakış
Spring Entegrasyonu, Messages
ile MessageChannels
üzerinden alışveriş yapabilmeniz için bir mesajlaşma mekanizması sağlar. Harici sistemlerle iletişim kurmak için kanal bağdaştırıcılarını kullanır.
Bu alıştırmada, Spring Cloud GCP tarafından sağlanan Spring Integration kanal bağdaştırıcılarını kullanarak iletişim kuran iki uygulama oluşturacağız. Bu bağdaştırıcılar, Spring Integration'ın mesaj alışverişi arka ucu olarak Google Cloud Pub/Sub'ı kullanmasını sağlar.
Cloud Shell ve Google Cloud SDK gcloud komutunu kullanmayı öğreneceksiniz.
Bu eğiticide, Spring Boot Başlangıç kılavuzundaki örnek kod kullanılmaktadır.
Neler öğreneceksiniz?
- Spring Integration ve Spring Cloud GCP'yi kullanarak Google Cloud Pub/Sub ile uygulamalar arasında mesaj alışverişi yapma
Gerekenler
- Bir Google Cloud Platform Projesi
- Chrome veya Firefox gibi bir tarayıcı
- Vim, EMAC veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi
Bu eğiticiden nasıl yararlanacaksınız?
HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
Google Cloud Platform hizmetlerinin kullanımıyla ilgili deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle
PROJECT_ID
olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır. - Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Google Cloud Shell
Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.
Cloud Shell'i etkinleştirme
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.
- Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Pub/Sub kaynaklarının temel hazırlığını yapma
Google Cloud Pub/Sub konuları sayfasına gidin.
Konu Oluştur'u tıklayın.
Konu adı olarak exampleTopic
yazın ve ardından Oluştur'u tıklayın.
Konu oluşturulduktan sonra Konular sayfasında kalın. Yeni oluşturduğunuz konuyu bulun, satırın sonundaki üç dikey noktaya basın ve Yeni Abonelik'i tıklayın.
Abonelik adı metin kutusuna exampleSubscription
yazıp Oluştur'u tıklayın.
4. Spring Boot Uygulamalarını Başlatma
Cloud Shell başlatıldıktan sonra, Spring Initializr ile iki yeni Spring Boot uygulaması oluşturmak için komut satırını kullanabilirsiniz:
$ curl https://start.spring.io/starter.tgz \
-d bootVersion=3.0.5 \
-d dependencies=web,integration,cloud-gcp-pubsub \
-d type=maven-project \
-d baseDir=spring-integration-sender | tar -xzvf -
$ curl https://start.spring.io/starter.tgz \
-d bootVersion=3.0.5 \
-d dependencies=web,integration,cloud-gcp-pubsub \
-d type=maven-project \
-d baseDir=spring-integration-receiver | tar -xzvf -
5. Mesaj göndermek için uygulama oluşturma
Şimdi mesaj gönderme uygulamamızı oluşturalım. Gönderen uygulamanın dizinine geçin.
$ cd spring-integration-sender
Uygulamamızın bir kanala mesaj yazmasını istiyoruz. Kanala bir mesaj gönderildikten sonra giden kanal bağdaştırıcısı tarafından alınır. Bu bağdaştırıcı, bunu genel bir Spring mesajından Google Cloud Pub/Sub mesajına dönüştürür ve bir Google Cloud Pub/Sub konusuna yayınlar.
Uygulamamızın bir kanala yazması için bir Spring Integration mesajlaşma ağ geçidi kullanabiliriz. Bir vim
, emacs
veya nano
metin düzenleyicisini kullanarak, DemoApplication
sınıfı içinde bir PubsubOutboundGateway
arayüzü bildirin.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.integration.annotation.MessagingGateway;
@SpringBootApplication
public class DemoApplication {
...
@MessagingGateway(defaultRequestChannel = "pubsubOutputChannel")
public interface PubsubOutboundGateway {
void sendToPubsub(String text);
}
}
Artık kanallara mesaj göndermek için kullanabileceğimiz bir mekanizmamız var, ancak bu mesajlar kanala ulaştıktan sonra nereye gönderiliyor?
Kanaldaki yeni mesajları almak ve bunları Google Cloud Pub/Sub konusuna yayınlamak için giden kanal bağdaştırıcısına ihtiyacımız vardır.
src/main/java/com/example/demo/DemoApplication.java
...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.outbound.PubSubMessageHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHandler;
@SpringBootApplication
public class DemoApplication {
...
@Bean
@ServiceActivator(inputChannel = "pubsubOutputChannel")
public MessageHandler messageSender(PubSubTemplate pubsubTemplate) {
return new PubSubMessageHandler(pubsubTemplate, "exampleTopic");
}
}
@ServiceActivator
ek açıklaması, bu MessageHandler
öğesinin inputChannel
etiketindeki tüm yeni iletilere uygulanmasına neden olur. Bu durumda, giden kanal bağdaştırıcımızı (PubSubMessageHandler
) çağırarak mesajı Google Cloud Pub/Sub'ın exampleTopic
konusuna yayınlayacağız.
Kanal bağdaştırıcısı yerleştirildiğinde, artık bir PubsubOutboundGateway
nesnesini otomatik olarak kabloyla bağlayabilir ve kanala mesaj yazmak için kullanabiliriz.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.RedirectView;
@SpringBootApplication
public class DemoApplication {
...
@Autowired
private PubsubOutboundGateway messagingGateway;
@PostMapping("/postMessage")
public RedirectView postMessage(@RequestParam("message") String message) {
this.messagingGateway.sendToPubsub(message);
return new RedirectView("/");
}
}
@PostMapping
ek açıklaması nedeniyle, artık HTTP POST isteklerini dinleyen bir uç noktamız var. Ancak, bunu REST denetleyicisi olarak işaretlemek için DemoApplication
sınıfına bir @RestController
ek açıklaması da eklemedik.
src/main/java/com/example/demo/DemoApplication.java
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
...
}
JAVA_HOME
öğesinin doğru sürüme ayarlandığından emin olun.
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Gönderen uygulamasını çalıştırın.
# Set the Project ID in environmental variable
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw spring-boot:run
Uygulama, 8080 numaralı bağlantı noktasında ve /postMessage
uç noktasında bir mesaj içeren POST isteklerini dinliyor, ancak bu konuyu daha sonra ele alacağız.
6. Mesaj Almak İçin Uygulama Oluşturma
Google Cloud Pub/Sub üzerinden mesaj gönderen bir uygulama oluşturduk. Şimdi, bu mesajları alan ve işleyen başka bir uygulama oluşturacağız.
Yeni bir Cloud Shell oturumu açmak için + simgesini tıklayın.
Ardından, yeni Cloud Shell oturumunda dizinleri, alıcı uygulamanın dizinine değiştirin:
$ cd spring-integration-receiver
Önceki uygulamada, mesajlaşma ağ geçidi bildirimi bizim için giden kanalı oluşturuyordu. İletileri almak için mesajlaşma ağ geçidi kullanmadığımızdan, gelen iletilerin gönderileceği MessageChannel
kendimizi bildirmemiz gerekir.
src/main/java/com/example/demo/DemoApplication.java
...
import org.springframework.context.annotation.Bean;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.messaging.MessageChannel;
@SpringBootApplication
public class DemoApplication {
...
@Bean
public MessageChannel pubsubInputChannel() {
return new DirectChannel();
}
}
Google Cloud Pub/Sub'dan mesajları almak ve pubsubInputChannel
hizmetine geçirmek için gelen kanal bağdaştırıcısına ihtiyacımız olacak.
src/main/java/com/example/demo/DemoApplication.java
...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter;
import org.springframework.beans.factory.annotation.Qualifier;
@SpringBootApplication
public class DemoApplication {
...
@Bean
public PubSubInboundChannelAdapter messageChannelAdapter(
@Qualifier("pubsubInputChannel") MessageChannel inputChannel,
PubSubTemplate pubSubTemplate) {
PubSubInboundChannelAdapter adapter =
new PubSubInboundChannelAdapter(pubSubTemplate, "exampleSubscription");
adapter.setOutputChannel(inputChannel);
return adapter;
}
}
Bu bağdaştırıcı kendisini pubsubInputChannel
cihazına bağlar ve Google Cloud Pub/Sub exampleSubscription
aboneliğinden gelen yeni mesajları dinler.
Gelen mesajların yayınlandığı bir kanalımız var. Peki bu mesajları nasıl ele alacağız?
Bunları, pubsubInputChannel
hedefine yeni iletiler geldiğinde tetiklenen bir @ServiceActivator
ile işleyelim. Bu örnekte, yalnızca mesaj yükünü günlüğe kaydetmiş olacağız.
src/main/java/com/example/demo/DemoApplication.java
...
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.annotation.ServiceActivator;
@SpringBootApplication
public class DemoApplication {
...
private static final Log LOGGER = LogFactory.getLog(DemoApplication.class);
@ServiceActivator(inputChannel = "pubsubInputChannel")
public void messageReceiver(String payload) {
LOGGER.info("Message arrived! Payload: " + payload);
}
}
JAVA_HOME
öğesinin doğru sürüme ayarlandığından emin olun.
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Alıcı uygulamayı çalıştırın.
$ ./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
Artık gönderen uygulamasına gönderdiğiniz tüm mesajlar alıcı uygulamada günlüğe kaydedilir. Bunu test etmek için yeni bir Cloud Shell oturumu açın ve gönderen uygulamasına bir HTTP POST isteği yapın.
$ curl --data "message=Hello world!" localhost:8080/postMessage
Ardından, alıcı uygulamanın gönderdiğiniz mesajı günlüğe kaydettiğini doğrulayın.
INFO: Message arrived! Payload: Hello world!
7. Temizleme
Bu alıştırma kapsamında oluşturulan aboneliği ve konuyu silin.
$ gcloud pubsub subscriptions delete exampleSubscription
$ gcloud pubsub topics delete exampleTopic
8. Özet
Google Cloud Pub/Sub için Spring Integration Kanal Bağdaştırıcıları kullanan iki Spring Boot uygulaması oluşturursunuz. Google Cloud Pub/Sub API ile etkileşime girmeden kendi aralarında mesaj alışverişi yapıyorlar.
9. Tebrikler!
Google Cloud Pub/Sub için Spring Entegrasyon Kanal Bağdaştırıcılarını kullanmayı öğrendiniz.
Daha Fazla Bilgi
- Google Cloud Pub/Sub: https://cloud.google.com/pubsub/
- GCP projesinde ilkbahar: http://cloud.spring.io/spring-cloud-gcp/
- Spring'de GCP GitHub deposu: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Google Cloud Platform'da Java: https://cloud.google.com/java/
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.