با Google Cloud Platform یک برنامه Kotlin Spring بسازید

۱. مقدمه

فریم‌ورک اسپرینگ ۵.۰ پشتیبانی اختصاصی از کاتلین را اضافه کرد که استفاده از اسپرینگ را برای توسعه‌دهندگان کاتلین آسان می‌کند. در نتیجه، این تغییرات به این معنی بود که ادغام‌های گوگل کلود که توسط Spring Cloud GCP ارائه می‌شوند، به طور یکپارچه در کاتلین نیز کار می‌کنند. در این آزمایشگاه کد خواهید دید که شروع استفاده از سرویس‌های گوگل کلود در برنامه‌های کاتلین شما چقدر آسان است!

این آزمایشگاه کد، راه‌اندازی یک برنامه ثبت‌نام ساده در کاتلین را آموزش می‌دهد که استفاده از سرویس‌های GCP از جمله Cloud Pub/Sub و Cloud SQL را نشان می‌دهد.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک برنامه Kotlin Spring Boot راه‌اندازی خواهید کرد که اطلاعات ثبت‌کننده را می‌پذیرد، آن را در یک Cloud Pub/Sub topic منتشر می‌کند و آن را در یک پایگاه داده Cloud MySQL ذخیره می‌کند.

آنچه یاد خواهید گرفت

نحوه ادغام سرویس‌های ابری گوگل در اپلیکیشن Kotlin Spring شما.

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

  • یک پروژه پلتفرم ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

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

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

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

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

۲. تنظیمات و الزامات

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

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aTQz5GpG0T

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعمل‌های بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش می‌دهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

پوسته ابری گوگل

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در زیر صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی پایدار ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

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

  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`
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. منابع میخانه/فرعی تأمین

ابتدا، باید یک موضوع Pub/Sub ابری و اشتراک راه‌اندازی کنیم. در این برنامه، اطلاعات ثبت‌نام را در یک موضوع Pub/Sub منتشر خواهیم کرد؛ سپس اطلاعات از این موضوع خوانده شده و در یک پایگاه داده ذخیره می‌شود.

در این آموزش، ما برای تأمین منابع خود به Cloud Shell متکی خواهیم بود. توجه داشته باشید که می‌توان منابع Pub/Sub را از طریق بخش Cloud Pub/Sub در Google Cloud Console نیز پیکربندی کرد.

در ترمینال Cloud Shell خود، ابتدا Pub/Sub API را فعال کنید.

$ gcloud services enable pubsub.googleapis.com

در مرحله بعد، یک تاپیک Pub/Sub با نام registrations برای این برنامه ایجاد خواهیم کرد. اطلاعات ثبت نام ارسال شده از طریق برنامه در این تاپیک منتشر خواهد شد.

$ gcloud pubsub topics create registrations

در نهایت، یک اشتراک برای موضوع ایجاد کنید. اشتراک Pub/Sub به شما امکان می‌دهد پیام‌های یک موضوع را دریافت کنید.

$ gcloud pubsub subscriptions create registrations-sub --topic=registrations

اکنون ایجاد یک موضوع Cloud Pub/Sub و اشتراک برای برنامه خود را تکمیل کرده‌اید.

۴. یک نمونه و پایگاه داده Cloud SQL (MySQL) ایجاد کنید

برای برنامه نمونه ما، ما همچنین باید یک نمونه پایگاه داده برای نگهداری اطلاعات ثبت کننده راه اندازی کنیم. این مرحله همچنین به ترمینال Cloud Shell برای تأمین منابع Cloud SQL متکی خواهد بود. توجه داشته باشید که می‌توانید نمونه‌های Cloud SQL خود را از طریق کنسول Google Cloud نیز مشاهده و پیکربندی کنید.

ابتدا، رابط برنامه‌نویسی کاربردی مدیریت Cloud SQL را فعال کنید.

$ gcloud services enable sqladmin.googleapis.com

در مرحله بعد، یک نمونه Cloud SQL (MySQL) ارائه خواهیم داد. این دستور ممکن است مدتی طول بکشد.

$ gcloud sql instances create codelab-instance --region=us-east1

پس از اینکه نمونه Cloud SQL خود را با موفقیت ایجاد کردید، یک پایگاه داده جدید در نمونه خود با نام registrants ایجاد کنید.

$ gcloud sql databases create registrants --instance codelab-instance

اکنون نمونه Cloud SQL و راه‌اندازی پایگاه داده برای برنامه خود را تکمیل کرده‌اید.

۵. مقداردهی اولیه یک برنامه Spring Boot

اکنون آماده‌ایم تا نوشتن برنامه را شروع کنیم. مراحل بعدی با استفاده از Cloud Shell که در مراحل راه‌اندازی توضیح داده شده است، ادامه خواهد یافت.

ابتدا، از Initializr برای تولید کد scaffolding برای پروژه استفاده خواهیم کرد. در پنجره Cloud Shell خود، دستور زیر را اجرا کنید:

$ cd ~
$ curl https://start.spring.io/starter.tgz \
  -d language=kotlin \
  -d bootVersion=2.4.0 \
  -d dependencies=web,data-jpa,integration,cloud-gcp-pubsub,thymeleaf \
  -d baseDir=registrations-codelab | tar -xzvf -
$ cd registrations-codelab

این دستور یک تنظیمات اولیه پروژه Maven و همچنین کد scaffolding برای برنامه شما در دایرکتوری registrations-codelab/ ایجاد می‌کند. بخش‌های زیر ویرایش‌های کد لازم برای تولید یک برنامه کاربردی را شرح می‌دهند.

ویرایشگر کد Cloud Shell

ساده‌ترین راه برای شروع تغییر و مشاهده کد در محیط Cloud Shell، استفاده از ویرایشگر کد داخلی Cloud Shell است.

پس از باز کردن یک نمونه Cloud Shell، روی نماد مداد کلیک کنید تا ویرایشگر کد باز شود. ویرایشگر باید به شما امکان دهد مستقیماً فایل‌های پروژه تولید شده توسط Initialzr را تغییر دهید.

cce293b40119c37b.png

۶. پیکربندی پایگاه داده

ابتدا، برنامه خود را طوری پیکربندی کنید که بتواند به پایگاه داده Cloud MySQL که راه‌اندازی کرده‌اید متصل شود. کتابخانه‌های Spring Cloud GCP یک شروع‌کننده Cloud MySQL ارائه می‌دهند که وابستگی‌های لازم برای اتصال به یک نمونه Cloud MySQL را فراهم می‌کند.

وابستگی spring-cloud-gcp-starter-sql-mysql را به پروژه pom.xml اضافه کنید:

ثبت نام-codelab/pom.xml

...
<dependencies>

  ... Other dependencies above ...

  <!-- Add the MySQL starter to the list of dependencies -->
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
  </dependency>
</dependencies>

علاوه بر این، شما باید فایل پیکربندی application.properties را برای توصیف پیکربندی پایگاه داده خود تغییر دهید. ویژگی‌های زیر را در فایل application.properties خود کپی کنید.

نام اتصال نمونه به پایگاه داده خود را پیدا کنید:

$ gcloud sql instances describe codelab-instance \
  --format 'value(connectionName)'

خروجی این دستور در فایل application.properties برای پیکربندی اطلاعات اتصال استفاده خواهد شد.

src/main/resources/application.properties

# Modify this property using the output from the previous command line.
spring.cloud.gcp.sql.instance-connection-name=INSTANCE_CONNECTION_NAME

# Your database name
spring.cloud.gcp.sql.database-name=registrants

# So app starts despite "table already exists" errors.
spring.datasource.continue-on-error=true

# Enforces database initialization
spring.datasource.initialization-mode=always

# Cloud SQL (MySQL) only supports InnoDB, not MyISAM
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
spring.jpa.hibernate.ddl-auto=create-drop

# This is used if you want to connect to a different database instance
# user other than root; not used in codelab.
# spring.datasource.username=root

# This is used to specify the password of the database user;
# not used in codelab.
# spring.datasource.password=password

تنها ویژگی که باید تغییر دهید، نام اتصال نمونه است. این مقدار باید به صورت یک مقدار جدا شده با دونقطه با فرم زیر قالب‌بندی شود: YOUR_GCP_PROJECT_ID:REGION:DATABASE_INSTANCE_NAME .

۷. ایجاد محتوای استاتیک

ابتدا، ما رابط کاربری (frontend) برنامه خود را ایجاد خواهیم کرد. برنامه باید دارای فرمی باشد که به افراد اجازه دهد افراد را ثبت نام کنند و همچنین نمایی (view) داشته باشد که تمام ثبت نام کنندگان موفق را نمایش دهد.

برای صفحه اصلی، یک index.html ایجاد کنید که شامل فرم ثبت نام باشد.

src/main/resources/static/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Registration Sample Application</title>
</head>
<body>

<h1>Registration</h1>

<div>
  <nav>
    <a href="/">Home</a><br>
    <a href="/registrants">Registered People</a><br>
  </nav>

  <p>
    This is a demo registration application which sends user information to a Pub/Sub topic and
    persists it into a MySQL database.
  </p>

  <h2>Register Person</h2>
  <div>
    <form action="/registerPerson" method="post">
      First Name: <input type="text" name="firstName" />
      Last Name: <input type="text" name="lastName" />
      Email: <input type="text" name="email" />
      <input type="submit" value="Submit"/>
    </form>
  </div>
</div>

</body>
</html>

در مرحله بعد، یک قالب Thymeleaf با نام registrants.html برای نمایش کاربران ثبت نام شده ایجاد خواهیم کرد. Thymeleaf یک چارچوب قالب‌بندی است که ما برای ساخت و ارائه HTML پویا از آن استفاده می‌کنیم. خواهید دید که این قالب شبیه HTML است، با این تفاوت که دارای عناصر markdown اضافی برای مدیریت محتوای پویا است. این قالب یک پارامتر واحد به نام personsList را می‌پذیرد که شامل تمام ثبت نام کنندگانی است که از طریق برنامه ثبت نام شده‌اند.

src/main/resources/templates/registrants.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>Registrants List</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h1>Registrants List</h1>
<p>
  This page displays all the people who were registered through the Pub/Sub topic.
  All results are retrieved from the MySQL database.
</p>
<table border="1">
  <tr>
    <th>First Name</th>
    <th>Last Name</th>
    <th>Email</th>
  </tr>
  <tr th:each="person : ${personsList}">
    <td>[[${person.firstName}]]</td>
    <td>[[${person.lastName}]]</td>
    <td>[[${person.email}]]</td>
  </tr>
</table>

</body>
</html>

در این مرحله، می‌توانید تأیید کنید که محتوای استاتیک ارائه می‌شود.

برنامه را با استفاده از Maven بسازید و اجرا کنید:

$ ./mvnw spring-boot:run

روی دکمه پیش‌نمایش در پنجره Cloud Shell کلیک کنید و تأیید کنید که صفحه اصلی رندر می‌شود. با این حال، هیچ یک از قابلیت‌های رابط کاربری کار نخواهند کرد زیرا ما یک کنترلر وب نداریم. این در مرحله بعدی اضافه خواهد شد.

5e38bb0d0e93002e.png

پس از مشاهده پیش‌نمایش برنامه، برای خاتمه دادن به برنامه، CTRL+C را فشار دهید.

۸. ارسال ثبت‌نام‌کنندگان به یک موضوع عمومی/فرعی

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

اضافه کردن کلاس‌های داده

ابتدا، چند کلاس داده کاتلین ایجاد خواهیم کرد؛ این‌ها موجودیت‌های JPA ما خواهند بود و همچنین به عنوان نماینده میانی ما از ثبت‌نام‌کنندگان ارسال‌شده از طریق فرم عمل می‌کنند.

در بسته آزمایشی، دو فایل جدید اضافه کنید: یک کلاس Person و یک Spring Data PersonRepository . این دو کلاس به ما امکان می‌دهند تا به راحتی ورودی‌های ثبت نام را از پایگاه داده MySQL خود با استفاده از Spring Data JPA ذخیره و بازیابی کنیم.

src/main/kotlin/com/example/demo/Person.kt

package com.example.demo

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Entity
data class Person(
    val firstName: String,
    val lastName: String,
    val email: String,
    @Id @GeneratedValue
    var id: Long? = 0)

src/main/kotlin/com/example/demo/PersonRepository.kt

package com.example.demo

import org.springframework.data.repository.CrudRepository

interface PersonRepository : CrudRepository<Person, Long>

اضافه کردن کنترلر وب

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

  • /registerPerson : نقطه پایانی POST که در آن اطلاعات ثبت‌کننده ارسال و سپس به موضوع Pub/Sub ارسال می‌شود. در تابع registerPerson(..) ، اطلاعات ثبت‌کننده با استفاده از PubSubTemplate به موضوع Pub/Sub ارسال می‌شود، یک کلاس مناسب از ادغام‌های Spring Cloud GCP Pub/Sub که کد تکراری مورد نیاز برای شروع تعامل با Cloud Pub/Sub را به حداقل می‌رساند.
  • /registrants : تمام ثبت نام کنندگانی که با موفقیت در پایگاه داده ثبت شده اند را نمایش می دهد. این اطلاعات از نمونه MySQL با استفاده از مخزن Spring Data که در مرحله قبل ایجاد کردیم، بازیابی می شود.

کلاس Controller زیر را در پکیج demo ایجاد کنید:

src/main/kotlin/com/example/demo/Controller.kt

package com.example.demo

import com.google.cloud.spring.pubsub.core.PubSubTemplate
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.view.RedirectView

@RestController
class Controller(val pubSubTemplate: PubSubTemplate, val personRepository: PersonRepository) {
  
  // The Pub/Sub topic name created earlier.
  val REGISTRATION_TOPIC = "registrations"

  @PostMapping("/registerPerson")
  fun registerPerson(
    @RequestParam("firstName") firstName: String,
    @RequestParam("lastName") lastName: String,
    @RequestParam("email") email: String): RedirectView {

    pubSubTemplate.publish(
        REGISTRATION_TOPIC,
        Person(firstName, lastName, email))
    return RedirectView("/")
  }

  @GetMapping("/registrants")
  fun getRegistrants(): ModelAndView {
    val personsList = personRepository.findAll().toList()
    return ModelAndView("registrants", mapOf("personsList" to personsList))
  }
}

کنترل‌کننده اطلاعات ثبت‌کننده ارسال‌شده از طریق فرم وب را می‌خواند و سپس اطلاعات را در موضوع Pub/Sub منتشر می‌کند.

افزودن JSON Object Mapper Bean

شاید در Controller متوجه شده باشید که ما یک شیء Person را به تاپیک Pub/Sub منتشر می‌کنیم و نه یک String. این امر به این دلیل امکان‌پذیر است که ما از پشتیبانی Spring Cloud GCP برای ارسال payloadهای JSON سفارشی به تاپیک‌ها بهره می‌بریم - کتابخانه‌ها به شما امکان می‌دهند اشیاء را به JSON سریالی کنید ، payloadهای JSON را به یک تاپیک ارسال کنید و payload را هنگام دریافت deserialize کنید.

برای استفاده از این ویژگی، باید یک ObjectMapper bean به متن برنامه خود اضافه کنیم. این ObjectMapper bean برای سریال‌سازی اشیاء به و از JSON هنگام ارسال و دریافت پیام‌ها توسط برنامه شما استفاده خواهد شد. در کلاس DemoApplication.kt ، JacksonPubSubMessageConverter Spring bean را اضافه کنید:

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

// new imports to add
import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.cloud.spring.pubsub.support.converter.JacksonPubSubMessageConverter

@SpringBootApplication
class DemoApplication {
  // This bean enables serialization/deserialization of
  // Java objects to JSON for Pub/Sub payloads
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = 
      JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

در این مرحله، می‌توانید با اجرای دستور زیر دوباره برنامه را اجرا کنید:

$ ./mvnw spring-boot:run

اکنون برنامه از طریق فرم وب موجود در صفحه اصلی، اطلاعات را به موضوع Pub/Sub که ایجاد کرده‌اید ارسال می‌کند. با این حال، هنوز هیچ کار مفیدی انجام نمی‌دهد زیرا ما هنوز باید از آن موضوع Pub/Sub اطلاعات را بخوانیم! این کار در مرحله بعدی انجام می‌شود.

۹. خواندن مطالب ثبت نام کنندگان از موضوع میخانه/زیرموضوع

در مرحله آخر، اطلاعات ثبت‌کننده را از مبحث Pub/Sub پردازش کرده و اطلاعات را در پایگاه داده Cloud MySQL ذخیره خواهیم کرد. این کار برنامه را تکمیل می‌کند و به شما امکان می‌دهد ثبت‌کننده‌های جدید را از طریق فرم ارسال کنید و تمام کاربران ثبت‌شده را از طریق نقطه پایانی /registrants مشاهده کنید.

این برنامه از Spring Integration بهره خواهد برد که انتزاع‌های مناسب بسیاری را برای مدیریت پیام‌رسانی ارائه می‌دهد. ما یک PubSubInboundChannelAdapter اضافه خواهیم کرد تا بتوانیم پیام‌ها را از موضوع Pub/Sub بخوانیم و آنها را برای پردازش بیشتر در pubsubInputChannel قرار دهیم. سپس تابع messageReceiver را با استفاده @ServiceActivator پیکربندی می‌کنیم تا با پیام‌های دریافتی در pubsubInputChannel فراخوانی شود.

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.cloud.gcp.pubsub.support.converter.JacksonPubSubMessageConverter

// new imports to add
import com.google.cloud.spring.pubsub.core.PubSubTemplate
import com.google.cloud.spring.pubsub.integration.AckMode
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter
import com.google.cloud.spring.pubsub.support.BasicAcknowledgeablePubsubMessage
import com.google.cloud.spring.pubsub.support.GcpPubSubHeaders
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.integration.annotation.ServiceActivator
import org.springframework.integration.channel.DirectChannel
import org.springframework.messaging.MessageChannel
import org.springframework.messaging.handler.annotation.Header

@SpringBootApplication
class DemoApplication {

  private val REGISTRANT_SUBSCRIPTION = "registrations-sub"

  @Autowired
  private lateinit var personRepository: PersonRepository

  // New Spring Beans to add
  @Bean
  fun pubsubInputChannel() = DirectChannel()

  @Bean
  fun messageChannelAdapter(
      @Qualifier("pubsubInputChannel") inputChannel: MessageChannel,
      pubSubTemplate: PubSubTemplate): PubSubInboundChannelAdapter {

    val adapter = PubSubInboundChannelAdapter(
        pubSubTemplate, REGISTRANT_SUBSCRIPTION)
    adapter.outputChannel = inputChannel
    adapter.ackMode = AckMode.MANUAL
    adapter.payloadType = Person::class.java
    return adapter
  }

  @ServiceActivator(inputChannel = "pubsubInputChannel")
  fun messageReceiver(
      payload: Person,
      @Header(GcpPubSubHeaders.ORIGINAL_MESSAGE) message: BasicAcknowledgeablePubsubMessage) {
    personRepository.save(payload)
    print("Message arrived! Payload: $payload")
    message.ack()
  }

  // ObjectMapper bean from previous step
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

در این مرحله، تنظیمات برنامه را تکمیل کرده‌اید. برای تأیید صحت عملکرد برنامه، دستور زیر را اجرا کنید:

$ ./mvnw spring-boot:run

دوباره روی دکمه پیش‌نمایش کلیک کنید و با پر کردن فرم و ارسال، ثبت نام کاربر را امتحان کنید.

e0d0b0f0c94120c2.png

برای تأیید اینکه ثبت‌کننده جدید در جدول ظاهر می‌شود، روی پیوند «افراد ثبت‌شده» کلیک کنید.

ab3b980423d0c51.png

تبریک می‌گویم، کار شما تمام شد! با فشردن CTRL+C در پنجره ترمینال، برنامه را ببندید.

۱۰. پاکسازی

برای پاکسازی محیط خود، باید موضوع Pub/Sub و نمونه Cloud MySQL که ایجاد کرده‌اید را حذف کنید.

حذف نمونه Cloud MySQL

$ gcloud sql instances delete codelab-instance

حذف منابع Pub/Sub

$ gcloud pubsub subscriptions delete registrations-sub
$ gcloud pubsub topics delete registrations

۱۱. تبریک می‌گویم!

اکنون نوشتن یک برنامه Spring Kotlin که با Cloud Pub/Sub و Cloud SQL (MySQL) ادغام می‌شود را به پایان رسانده‌اید.

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.