Spring Integration ve Google Cloud Pub/Sub ile mesajlaşma

Bahar Entegrasyonu size Messages ile MessageChannels arasında alışveriş yapmak 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 adaptörlerini kullanarak iletişim kuracak iki uygulama oluşturacağız. Bu adaptörler Spring Integration'ın, mesaj değişimi arka ucu olarak Google Cloud Pub/Sub'ı kullanmasını sağlar.

Cloud Shell'i ve Google Cloud SDK gcloud komutunu nasıl kullanacağınızı öğreneceksiniz.

Bu eğitim, Spring Boot Başlangıç kılavuzundaki örnek kodu kullanır.

Neler öğreneceksiniz?

  • Spring Integration ve Spring Cloud GCP kullanarak Google Cloud Pub/Sub ile uygulamalar arasında mesaj alışverişi

Gerekenler

  • Bir Google Cloud Platform Projesi
  • Chrome veya Firefox gibi bir Tarayıcı
  • Vim, EMACs veya Nano gibi standart Linux metin düzenleyicilerini kullanma

Bu eğitimi nasıl kullanacaksınız?

Sadece okuyun Okuyun ve alıştırmaları tamamlayın

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

Acemi Orta Yeterli

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

Acemi Orta Yetkili

Bağımsız tempolu ortam kurulumu

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

Ekran görüntüsü: 10.02.2016 12:45:26.png

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Bu, daha sonra bu codelab'de 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 gözden geçirmek için çalışmanın birkaç dolardan fazla maliyeti olmayacak. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bunları çalışır durumda bırakırsanız (bu belgenin sonundaki "temizlik" bölümüne bakın) daha yüksek maliyetli olabilir.

Yeni Google Cloud Platform 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ılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Google Cloud Shell'i etkinleştir

GCP Console'dan, sağ üstteki araç çubuğu üzerinde Cloud Shell simgesini tıklayın:

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

Ortamın temel hazırlığı ve bağlantı kurması yalnızca birkaç dakika sürer:

Bu sanal makine, ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamı tarayıcı veya Google Chromebook ile yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu görmeniz gerekir.

Kimliğinizin doğrulanmasını sağlamak 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>

Ayarlanmamışsa şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Google Cloud Pub/Sub konular sayfasına gidin ve API'yi etkinleştirin.

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 arayın, 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.

Cloud Shell açı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=2.0.6.RELEASE \
  -d dependencies=web \
  -d baseDir=spring-integration-sender | tar -xzvf -
$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=2.0.6.RELEASE \
  -d baseDir=spring-integration-receiver | tar -xzvf -

Ş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 gönderilen bir mesaj, giden kanal bağdaştırıcısı tarafından alınır. Bu mesaj, iletiyi genel bir Spring mesajından bir 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 Spring Integration mesajlaşma ağ geçidini kullanabiliriz. vim, emacs veya nano kaynaklı bir metin düzenleyiciyi kullanarak DemoApplication sınıfında 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 bir kanala ileti göndermek için mekanizmamız var, ancak bu iletiler kanala ulaştıktan sonra nereye gidiyor?

Kanaldaki yeni mesajları kullanmak ve bu mesajları bir Google Cloud Pub/Sub konusunda yayınlamak için giden kanal adaptörüne ihtiyacımız vardır.

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

...
import org.springframework.cloud.gcp.pubsub.core.PubSubTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.cloud.gcp.pubsub.integration.outbound.PubSubMessageHandler;
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 dahilindeki tüm yeni iletilere uygulanmasına neden olur. Bu örnekte, iletiyi Google Cloud Pub/Sub'ın exampleTopic konusunda yayınlamak için giden kanal adaptörümüz PubSubMessageHandler olarak adlandırıyoruz.

Kanal adaptörü uygulandığında, artık bir PubsubOutboundGateway nesnesini otomatik olarak kabloyla 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 ek açıklaması nedeniyle artık HTTP POST isteklerini dinleyen, ancak REST denetleyicisi olarak işaretlemek için DemoApplication sınıfına da @RestController ek açıklaması eklemeden bir uç noktamız var.

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

import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
  ...
}

Uygulamanın çalışması için yalnızca gerekli bağımlılıkları eklememiz gerekir.

pom.xml

<project>
  ...
  <!-- Add Spring Cloud GCP Dependency BOM -->
  <dependencyManagement>
        <dependencies>
                <dependency>
                        <groupId>org.springframework.cloud</groupId>
                        <artifactId>spring-cloud-gcp-dependencies</artifactId>
                        <version>1.0.0.RELEASE</version>
                        <type>pom</type>
                        <scope>import</scope>
                </dependency>
        </dependencies>
  </dependencyManagement>

  <dependencies>
        ...
        <!-- Add Pub/Sub Starter -->
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-pubsub</artifactId>
        </dependency>

        <!-- Add Spring Integration -->
        <dependency>
                <groupId>org.springframework.integration</groupId>
                <artifactId>spring-integration-core</artifactId>
        </dependency>

  </dependencies>

</project>

Gönderen uygulamayı ç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.

Kısa süre önce 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ı uygulama dizini olarak değiştirin:

$ cd spring-integration-receiver

Önceki uygulamada, mesajlaşma ağ geçidi beyanı bizim için giden kanalı oluşturuyordu. İletileri almak için mesajlaşma ağ geçidi kullanmadığımızdan, gelen iletilerin geleceği yerde kendi MessageChannel cihazınızı beyan etmemiz 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 bu mesajları pubsubInputChannel hesabına aktarmak için gelen kanal adaptörüne ihtiyacımız olacaktır.

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

...
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.gcp.pubsub.core.PubSubTemplate;
import org.springframework.cloud.gcp.pubsub.integration.inbound.PubSubInboundChannelAdapter;

@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ı?

Bunları, pubsubInputChannel hedefine yeni bir ileti geldiğinde tetiklenen bir @ServiceActivator ile işleme koyalım.

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);
        }
}

Bu durumda mesaj yükünü günlüğe kaydederiz.

Gerekli bağımlılıkları eklememiz gerekiyor.

pom.xml

<project>
  ...
  <!-- Add Spring Cloud GCP Dependency BOM -->
  <dependencyManagement>
        <dependencies>
                <dependency>
                        <groupId>org.springframework.cloud</groupId>
                        <artifactId>spring-cloud-gcp-dependencies</artifactId>
                        <version>1.0.0.RELEASE</version>
                        <type>pom</type>
                        <scope>import</scope>
                </dependency>
        </dependencies>
  </dependencyManagement>

  <dependencies>
        ...
        <!-- Add Pub/Sub Starter -->
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-pubsub</artifactId>
        </dependency>

        <!-- Add Spring Integration -->
        <dependency>
                <groupId>org.springframework.integration</groupId>
                <artifactId>spring-integration-core</artifactId>
        </dependency>

  </dependencies>

</project>

Alıcı uygulamayı çalıştırın.

$ ./mvnw spring-boot:run

Şimdi, gönderen uygulamasına gönderdiğiniz tüm mesajlar alıcı uygulamaya kaydedilir. 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ı uygulamanın gönderdiğiniz iletiyi günlüğe kaydettiğini doğrulayın.

INFO: Message arrived! Payload: Hello world!

Bu alıştırma kapsamında oluşturulmuş aboneliği ve konuyu silin.

$ gcloud beta pubsub subscriptions delete exampleSubscription
$ gcloud beta pubsub topics delete exampleTopic

Google Cloud Pub/Sub için Spring Integration Channel Connectors'ı kullanan iki Spring Boot uygulaması ayarlarsınız. Google Cloud Pub/Sub API ile etkileşime girmeden birbirleriyle mesaj alışverişinde bulunurlar.

Google Cloud Pub/Sub için Spring Integration Channel Adaptörlerini nasıl kullanacağınızı öğ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.