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

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?

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

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

Yeni başlayan Orta düzey Uzman

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

a99b7ace416376c4.png

bd84a6d3004737c5.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. 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_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 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

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

  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>

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.

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

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

Lisans

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