Mengirim Pesan dengan Spring Integration dan Google Cloud Pub/Sub

1. Ringkasan

Integrasi Spring memberi Anda mekanisme pesan untuk bertukar Messages melalui MessageChannels. Menggunakan adaptor saluran untuk berkomunikasi dengan sistem eksternal.

Dalam latihan ini, kita akan membuat dua aplikasi yang berkomunikasi menggunakan adaptor saluran Spring Integration yang disediakan oleh Spring Cloud GCP. Adaptor ini membuat Spring Integration menggunakan Google Cloud Pub/Sub sebagai backend pertukaran pesan.

Anda akan mempelajari cara menggunakan Cloud Shell dan perintah gcloud Cloud SDK.

Tutorial ini menggunakan kode contoh dari Panduan Memulai Spring Boot.

Yang akan Anda pelajari

  • Cara bertukar pesan antar-aplikasi dengan Google Cloud Pub/Sub menggunakan Spring Integration dan Spring Cloud GCP

Yang Anda butuhkan

  • Project Google Cloud Platform
  • Browser, seperti Chrome atau Firefox
  • Pemahaman tentang editor teks Linux standar seperti Vim, EMACs, atau Nano

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman Anda membuat aplikasi web HTML/CSS?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Google Cloud Shell

Meskipun Google Cloud dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.pngS.

55efc1aaa7a4d3ad.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

9c92662c6a846a5c.pngS

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Menyediakan resource Pub/Sub

Buka halaman topik Google Cloud Pub/Sub.

Klik Buat Topik.

4c938409dc7169a6.pngS

Ketik exampleTopic sebagai nama topik, lalu klik Buat.

e2daeec91537f672.png

Setelah topik dibuat, tetap berada di halaman Topik. Cari topik yang baru saja Anda buat, tekan tiga titik vertikal di akhir baris dan klik Langganan Baru.

975efa26e5054936.pngS

Ketik exampleSubscription di kotak teks nama langganan dan klik Buat.

f7a91d9e1cb48009.png

4. Melakukan inisialisasi Aplikasi Spring Boot

Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk membuat dua aplikasi Spring Boot baru dengan Spring Initializr:

$ 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. Membuat Aplikasi untuk Mengirim Pesan

Sekarang mari kita buat aplikasi pengirim pesan. Ubah ke direktori aplikasi pengirim.

$ cd spring-integration-sender

Kita ingin aplikasi menulis pesan ke saluran. Setelah berada dalam saluran, pesan akan diambil oleh adaptor saluran keluar, yang mengubahnya dari pesan Spring umum menjadi pesan Google Cloud Pub/Sub dan memublikasikannya ke topik Google Cloud Pub/Sub.

Agar aplikasi dapat menulis ke saluran, kita dapat menggunakan gateway pesan Integrasi Spring. Dengan menggunakan editor teks dari vim, emacs, atau nano, deklarasikan antarmuka PubsubOutboundGateway di dalam class DemoApplication.

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

Sekarang kita memiliki mekanisme untuk mengirim pesan ke channel, tetapi ke mana pesan itu akan dikirim setelah ada di channel?

Kita memerlukan adaptor saluran keluar agar dapat menggunakan pesan baru di saluran dan memublikasikannya ke topik Google Cloud Pub/Sub.

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

Anotasi @ServiceActivator menyebabkan MessageHandler ini diterapkan ke pesan baru di inputChannel. Dalam hal ini, kita memanggil adaptor saluran keluar, PubSubMessageHandler, untuk memublikasikan pesan ke topik exampleTopic Google Cloud Pub/Sub.

Dengan memasang adaptor saluran, sekarang kita dapat menghubungkan objek PubsubOutboundGateway secara otomatis dan menggunakannya untuk menulis pesan ke saluran.

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("/");
  }
}

Karena anotasi @PostMapping, sekarang kita memiliki endpoint yang memproses permintaan POST HTTP, tetapi tidak tanpa menambahkan anotasi @RestController ke class DemoApplication untuk menandainya sebagai pengontrol REST.

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

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

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

Pastikan JAVA_HOME disetel ke versi yang tepat.

export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Jalankan aplikasi pengirim.

# Set the Project ID in environmental variable
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`

$ ./mvnw spring-boot:run

Aplikasi memproses permintaan POST yang berisi pesan pada port 8080 dan endpoint /postMessage, tetapi kita akan membahasnya nanti.

6. Membuat Aplikasi untuk Menerima Pesan

Kita baru saja membuat aplikasi yang mengirimkan pesan melalui Google Cloud Pub/Sub. Sekarang, kita akan membuat aplikasi lain yang menerima pesan tersebut dan memprosesnya.

Klik + untuk membuka sesi Cloud Shell baru.

9799bee5fea95aa6.pngS

Kemudian, pada sesi Cloud Shell yang baru, ubah direktori ke direktori aplikasi penerima:

$ cd spring-integration-receiver

Di aplikasi sebelumnya, deklarasi gateway pesan membuat saluran keluar untuk kita. Karena kita tidak menggunakan gateway pesan untuk menerima pesan, kita perlu mendeklarasikan MessageChannel kita sendiri tempat pesan masuk akan diterima.

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

Kita memerlukan adaptor saluran masuk untuk menerima pesan dari Google Cloud Pub/Sub dan menyampaikannya ke pubsubInputChannel.

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

Adaptor ini mengikat dirinya sendiri ke pubsubInputChannel dan memproses pesan baru dari langganan exampleSubscription Google Cloud Pub/Sub.

Kita memiliki channel tempat pesan masuk diposting, tetapi apa yang harus dilakukan dengan pesan tersebut?

Mari kita proses dengan @ServiceActivator yang dipicu saat pesan baru sampai di pubsubInputChannel. Dalam hal ini, kita hanya akan mencatat {i>payload<i} pesan.

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

Pastikan JAVA_HOME disetel ke versi yang tepat.

export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Jalankan aplikasi penerima.

$ ./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

Sekarang, setiap pesan yang Anda kirim ke aplikasi pengirim akan dicatat di aplikasi penerima. Untuk mengujinya, buka sesi Cloud Shell baru dan buat permintaan HTTP POST ke aplikasi pengirim.

$ curl --data "message=Hello world!" localhost:8080/postMessage

Kemudian, verifikasi bahwa aplikasi penerima mencatat pesan yang Anda kirim.

INFO: Message arrived! Payload: Hello world!

7. Pembersihan

Hapus langganan dan topik yang dibuat sebagai bagian dari latihan ini.

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

8. Ringkasan

Anda menyiapkan dua aplikasi Spring Boot yang menggunakan Adaptor Saluran Integrasi Spring untuk Google Cloud Pub/Sub. Mereka saling bertukar pesan tanpa pernah berinteraksi dengan Google Cloud Pub/Sub API.

9. Selamat!

Anda telah mempelajari cara menggunakan Adaptor Saluran Integrasi Spring untuk Google Cloud Pub/Sub.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.