پیام رسانی با Spring Integration و Google Cloud Pub/Sub

1. بررسی اجمالی

Spring Integration مکانیزمی برای تبادل Messages از طریق MessageChannels در اختیار شما قرار می دهد. از آداپتورهای کانال برای ارتباط با سیستم های خارجی استفاده می کند.

در این تمرین، دو برنامه ایجاد می کنیم که با استفاده از آداپتورهای کانال Spring Integration ارائه شده توسط Spring Cloud GCP با هم ارتباط برقرار می کنند. این آداپتورها باعث می‌شوند که Spring Integration از Google Cloud Pub/Sub به عنوان باطن تبادل پیام استفاده کند.

شما یاد خواهید گرفت که چگونه از Cloud Shell و دستور Cloud SDK gcloud استفاده کنید.

این آموزش از کد نمونه راهنمای شروع راه‌اندازی بهار استفاده می‌کند.

چیزی که یاد خواهید گرفت

  • نحوه تبادل پیام بین برنامه ها با Google Cloud Pub/Sub با استفاده از Spring Integration و Spring Cloud GCP

آنچه شما نیاز دارید

  • یک پروژه Google Cloud Platform
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با ساختن برنامه های وب HTML/CSS چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

تجربه خود را در استفاده از سرویس‌های پلتفرم ابری Google چگونه ارزیابی می‌کنید؟

تازه کار متوسط مسلط

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Google Cloud Shell

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

9c92662c6a846a5c.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  1. برای تایید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی فرمان

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی فرمان

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی فرمان

Updated property [core/project].

3. تامین منابع Pub/Sub

به صفحه موضوعات Google Cloud Pub/Sub بروید.

روی ایجاد موضوع کلیک کنید.

4c938409dc7169a6.png

exampleTopic را به عنوان نام موضوع تایپ کنید و سپس روی Create کلیک کنید.

e2daeec91537f672.png

پس از ایجاد موضوع، در صفحه Topics باقی بمانید. به دنبال موضوعی که ایجاد کردید بگردید، سه نقطه عمودی در انتهای خط را فشار دهید و روی اشتراک جدید کلیک کنید.

975efa26e5054936.png

در کادر متنی نام اشتراک، exampleSubscription را تایپ کنید و روی ایجاد کلیک کنید.

f7a91d9e1cb48009.png

4. برنامه های Spring Boot را راه اندازی کنید

پس از راه اندازی Cloud Shell، می توانید از خط فرمان برای ایجاد دو برنامه Spring Boot جدید با 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. یک برنامه کاربردی برای ارسال پیام ایجاد کنید

حالا بیایید برنامه ارسال پیام خود را ایجاد کنیم. به دایرکتوری برنامه ارسال کننده تغییر دهید.

$ cd spring-integration-sender

ما می خواهیم برنامه ما برای یک کانال پیام بنویسد. پس از اینکه یک پیام در کانال قرار گرفت، توسط آداپتور کانال خروجی دریافت می‌شود، که آن را از یک پیام عمومی Spring به یک پیام Google Cloud Pub/Sub تبدیل می‌کند و آن را به یک موضوع Google Cloud Pub/Sub منتشر می‌کند.

برای اینکه برنامه ما در یک کانال بنویسد، می‌توانیم از دروازه پیام‌رسانی Spring Integration استفاده کنیم. با استفاده از یک ویرایشگر متن از vim ، emacs یا nano ، یک رابط PubsubOutboundGateway را در کلاس 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);
  }
}

ما اکنون مکانیزمی برای ارسال پیام به یک کانال داریم، اما این پیام ها پس از قرار گرفتن در کانال به کجا می روند؟

ما به یک آداپتور کانال خروجی نیاز داریم تا پیام‌های جدید را در کانال مصرف کنیم و آنها را در یک موضوع 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");
  }
}

حاشیه‌نویسی @ServiceActivator باعث می‌شود که این MessageHandler برای هر پیام جدیدی در inputChannel اعمال شود. در این مورد، ما با آداپتور کانال خروجی خود، PubSubMessageHandler ، تماس می گیریم تا پیام را در موضوع exampleTopic Google Cloud Pub/Sub منتشر کنیم.

با وجود آداپتور کانال، اکنون می‌توانیم یک شی PubsubOutboundGateway را به صورت خودکار سیم‌کشی کنیم و از آن برای نوشتن پیام به کانال استفاده کنیم.

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 ، اکنون یک نقطه پایانی داریم که به درخواست‌های HTTP POST گوش می‌دهد، اما نه بدون اضافه کردن حاشیه‌نویسی @RestController به کلاس DemoApplication برای علامت‌گذاری آن به‌عنوان یک کنترل‌کننده REST.

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

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

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

مطمئن شوید که JAVA_HOME روی نسخه مناسب تنظیم شده است.

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

برنامه فرستنده را اجرا کنید.

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

$ ./mvnw spring-boot:run

برنامه در حال گوش دادن به درخواست‌های POST حاوی پیامی در پورت 8080 و نقطه پایانی /postMessage است، اما بعداً به این موضوع خواهیم رسید.

6. یک برنامه کاربردی برای دریافت پیام ایجاد کنید

ما به تازگی یک برنامه ایجاد کردیم که پیام ها را از طریق Google Cloud Pub/Sub ارسال می کند. اکنون برنامه دیگری ایجاد می کنیم که آن پیام ها را دریافت کرده و آنها را پردازش می کند.

برای باز کردن یک جلسه جدید Cloud Shell روی + کلیک کنید.

9799bee5fea95aa6.png

سپس، در جلسه جدید Cloud Shell، دایرکتوری ها را به دایرکتوری برنامه گیرنده تغییر دهید:

$ cd spring-integration-receiver

در برنامه قبلی، اعلان دروازه پیام، کانال خروجی را برای ما ایجاد کرد. از آنجایی که ما از دروازه پیام رسانی برای دریافت پیام ها استفاده نمی کنیم، باید MessageChannel خود را اعلام کنیم که پیام های دریافتی کجا می رسند.

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 و انتقال آنها به 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;
  }
}

این آداپتور خود را به pubsubInputChannel متصل می کند و به پیام های جدید از اشتراک Google Cloud Pub/Sub exampleSubscription گوش می دهد.

ما کانالی داریم که پیام های دریافتی در آن پست می شوند، اما با آن پیام ها چه باید کرد؟

بیایید آنها را با یک @ServiceActivator پردازش کنیم که با رسیدن پیام‌های جدید به pubsubInputChannel فعال می‌شود. در این مورد، ما فقط بار پیام را ثبت می کنیم.

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 روی نسخه مناسب تنظیم شده است.

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

برنامه گیرنده را اجرا کنید.

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

اکنون هر پیامی که به برنامه فرستنده ارسال می کنید در برنامه گیرنده ثبت می شود. برای آزمایش آن، یک جلسه Cloud Shell جدید باز کنید و یک درخواست HTTP POST به برنامه فرستنده ارسال کنید.

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

سپس، بررسی کنید که برنامه گیرنده پیامی را که ارسال کرده‌اید ثبت کرده باشد!

INFO: Message arrived! Payload: Hello world!

7. پاکسازی

اشتراک و موضوع ایجاد شده به عنوان بخشی از این تمرین را حذف کنید.

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

8. خلاصه

شما دو برنامه Spring Boot راه‌اندازی می‌کنید که از آداپتورهای کانال ادغام Spring برای Google Cloud Pub/Sub استفاده می‌کنند. آنها بدون اینکه با Google Cloud Pub/Sub API تعاملی داشته باشند، بین خود پیام رد و بدل می کنند.

9. تبریک!

شما یاد گرفتید که چگونه از آداپتورهای کانال ادغام Spring برای Google Cloud Pub/Sub استفاده کنید!

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.