Spring Entegrasyonu ve Google Cloud Pub/Sub ile Mesajlaşma

1. Genel Bakış

Spring Integration, MessageChannels üzerinden Messages değişimi 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 değişimi arka ucu olarak Google Cloud Pub/Sub'ı kullanmasını sağlar.

Cloud Shell ve Google Cloud SDK gcloud komutunu kullanmayı öğreneceksiniz.

Bu eğitimde, Spring Boot'u Kullanmaya Başlama Kılavuzu'ndaki ö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?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

  • 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. Dilediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console otomatik olarak benzersiz bir dize oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak 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.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak çok fazla zamanınızı almaz. 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

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 853e55310c205094.png tıklayın.

55efc1aaa7a4d3ad.png

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.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Bu sanal makine, ihtiyaç duyulan tüm geliştirme araçlarıyla birlikte yüklenir. 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.

  1. 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`
  1. 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>

Ayarlanmamışsa ş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.

4c938409dc7169a6.png

Konunun adı olarak exampleTopic yazın ve Oluştur'u tıklayın.

e2daeec91537f672.png

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.

975efa26e5054936.png

Abonelik adı metin kutusuna exampleSubscription yazıp Oluştur'u tıklayın.

f7a91d9e1cb48009.png

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 mesaj kanala girdikten sonra, giden kanal bağdaştırıcısı tarafından alınır. Bu bağdaştırıcı, mesajı genel bir Spring mesajından Google Cloud Pub/Sub mesajına 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ü tanımlayın.

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ö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ında doğru sürümün 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.

9799bee5fea95aa6.png

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 bir 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?

Bu iletileri, pubsubInputChannel adresine yeni iletiler geldiğinde tetiklenen bir @ServiceActivator ile 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ında doğru sürümün 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ı ayarlarsınız. 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

Lisans

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