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. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Google Cloud Shell
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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`
- دستور زیر را در 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 بروید.
روی ایجاد موضوع کلیک کنید.
exampleTopic
را به عنوان نام موضوع تایپ کنید و سپس روی Create کلیک کنید.
پس از ایجاد موضوع، در صفحه Topics باقی بمانید. به دنبال موضوعی که ایجاد کردید بگردید، سه نقطه عمودی در انتهای خط را فشار دهید و روی اشتراک جدید کلیک کنید.
در کادر متنی نام اشتراک، exampleSubscription
را تایپ کنید و روی ایجاد کلیک کنید.
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 روی + کلیک کنید.
سپس، در جلسه جدید 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 استفاده کنید!
بیشتر بدانید
- Google Cloud Pub/Sub: https://cloud.google.com/pubsub/
- پروژه Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring در مخزن GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- جاوا در Google Cloud Platform: https://cloud.google.com/java/
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.