1. Genel Bakış
Spring Integration, Messages ile MessageChannels arasında veri alışverişi yapabileceğiniz bir mesajlaşma mekanizması sunar. 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 değişimi arka ucu olarak Google Cloud Pub/Sub'ı kullanmasını sağlar.
Cloud Shell ve Cloud SDK gcloud komutunu kullanmayı öğreneceksiniz.
Bu eğitimde, Spring Boot'u kullanmaya başlama kılavuzundaki örnek kod kullanılmaktadır.
Neler öğreneceksiniz?
- Spring Integration ve Spring Cloud GCP kullanarak Google Cloud Pub/Sub ile uygulamalar arasında mesaj alışverişi yapma
Gerekenler
- Google Cloud Platform projesi
- Chrome veya Firefox gibi bir tarayıcı
- Vim, EMACs veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi sahibi olmanız gerekir.
Bu eğiticiden nasıl yararlanacaksınız?
HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- Google Cloud Console'da oturum açın ve 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Google Cloud Shell
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, bulutta ç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 'i
tıklayın.

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu 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 projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Pub/Sub kaynaklarını sağlama
Google Cloud Pub/Sub konuları sayfasına gidin.
Konu Oluştur'u tıklayın.

Konunun adı olarak exampleTopic yazın ve 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 noktayı tıklayın ve Yeni Abonelik'i seçin.

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önderme uygulamasının dizinine geçin.
$ cd spring-integration-sender
Uygulamamızın bir kanala mesaj yazmasını istiyoruz. Bir ileti kanala girdikten sonra, giden kanal bağdaştırıcısı tarafından alınır. Bu bağdaştırıcı, iletiyi genel bir Spring iletisinden Google Cloud Pub/Sub iletisine dönüştürür ve Google Cloud Pub/Sub konusunda yayınlar.
Uygulamamızın bir kanala yazabilmesi için Spring Integration mesajlaşma ağ geçidini kullanabiliriz. vim, emacs veya nano kaynaklı bir metin düzenleyici kullanarak DemoApplication sınıfının 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 kanala mesaj gönderme mekanizmamız var ancak kanala gönderilen mesajlar daha sonra nereye gidiyor?
Kanalda yeni mesajları kullanmak ve bunları Google Cloud Pub/Sub konusuna yayınlamak için giden kanal bağdaştırıcısına ihtiyacımız var.
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'nin inputChannel içindeki tüm yeni mesajlara uygulanmasına neden olur. Bu durumda, mesajı Google Cloud Pub/Sub'ın exampleTopic konusuna yayınlamak için giden kanal bağdaştırıcımızı, PubSubMessageHandler, çağırıyoruz.
Kanal bağdaştırıcısı yerindeyken artık bir PubsubOutboundGateway nesnesini otomatik olarak bağlayabilir ve bunu bir 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 notu sayesinde artık HTTP POST isteklerini dinleyen bir uç noktamız var. Ancak DemoApplication sınıfına @RestController notu ekleyerek bu sınıfı REST denetleyicisi olarak işaretlememiz gerekiyor.
src/main/java/com/example/demo/DemoApplication.java
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
...
}
JAVA_HOME cihazının 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 mesaj içeren POST isteklerini dinliyor ancak bu konuya daha sonra değineceğiz.
6. İleti 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 + işaretini tıklayın.

Ardından, yeni Cloud Shell oturumunda dizinleri alıcı uygulamasının diziniyle 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 ulaşacağı kendi MessageChannel değerimizi 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 mesaj almak ve bunları pubsubInputChannel'ya iletmek 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 adaptör, pubsubInputChannel öğesine bağlanır ve Google Cloud Pub/Sub exampleSubscription aboneliğinden gelen yeni mesajları dinler.
Gelen mesajların yayınlandığı bir kanalımız var ancak bu mesajlarla ne yapmalıyız?
Yeni mesajlar pubsubInputChannel adresine ulaştığında tetiklenen bir @ServiceActivator ile bu mesajları işleyelim. Bu durumda, yalnızca mesaj yükü günlüğe kaydedilir.
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 cihazının doğru sürüme ayarlandığından emin olun.
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Alıcı uygulamasını ç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ı uygulamasına kaydedilir. Bunu test etmek için yeni bir Cloud Shell oturumu açın ve gönderen uygulamasına bir HTTP POST isteği gönderin.
$ curl --data "message=Hello world!" localhost:8080/postMessage
Ardından, alıcı uygulamasının gönderdiğiniz mesajı 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 Channel Adapters'ı kullanan iki Spring Boot uygulaması oluşturursunuz. Google Cloud Pub/Sub API ile hiçbir zaman etkileşime girmeden kendi aralarında mesaj alışverişi yaparlar.
9. Tebrikler!
Google Cloud Pub/Sub için Spring Integration Channel Adapters'ı kullanmayı öğrendiniz.
Daha Fazla Bilgi
- Google Cloud Pub/Sub: https://cloud.google.com/pubsub/
- GCP'de Spring projesi: http://cloud.spring.io/spring-cloud-gcp/
- GCP'de Spring 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.