Google Cloud Platform ile Kotlin Spring Uygulaması Derleme

1. Giriş

Spring Framework 5.0, özel Kotlin desteği ekleyerek Kotlin geliştiricilerinin Spring'i kullanmasını kolaylaştırdı. Bu değişiklikler, Spring Cloud GCP tarafından sağlanan Google Cloud entegrasyonlarının Kotlin'de de sorunsuz bir şekilde çalışmasını sağladı. Bu codelab'de, Kotlin uygulamalarınızda Google Cloud hizmetlerini kullanmaya başlamanın ne kadar kolay olduğunu göreceksiniz.

Bu codelab'de, Kotlin'de basit bir kayıt uygulamasının nasıl ayarlanacağı açıklanmaktadır. Bu uygulama, Cloud Pub/Sub ve Cloud SQL gibi GCP hizmetlerinin kullanımını gösterir.

Ne oluşturacaksınız?

Bu codelab'de, kayıtlı kullanıcı bilgilerini kabul eden, bunları bir Cloud Pub/Sub konusunda yayınlayan ve bir Cloud MySQL veritabanında kalıcı hale getiren bir Kotlin Spring Boot uygulaması kuracaksınız.

Neler öğreneceksiniz?

Kotlin Spring uygulamanızda Google Cloud hizmetleriyle nasıl entegrasyon yapacağınızı öğrenin.

İhtiyacınız olanlar

  • Google Cloud Platform projesi
  • Chrome veya Firefox gibi bir tarayıcı

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

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

Yeni başlayan Orta düzey Uzman

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

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Gmail veya G Suite hesabınız yoksa hesap oluşturmanız gerekir.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Google Cloud Shell

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ tıklayın.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

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

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Pub/Sub kaynaklarını sağlama

Öncelikle bir Cloud Pub/Sub konusu ve aboneliği oluşturmamız gerekir. Bu uygulamada, kayıt bilgilerini bir Pub/Sub konusuna yayınlayacağız. Ardından, bilgiler bu konudan okunup bir veritabanında kalıcı hale getirilecek.

Bu eğiticide kaynaklarımızı sağlamak için Cloud Shell'i kullanacağız. Pub/Sub kaynaklarının Google Cloud Console'daki Cloud Pub/Sub bölümü aracılığıyla da yapılandırılabileceğini unutmayın.

Cloud Shell terminalinizde önce Pub/Sub API'yi etkinleştirin.

$ gcloud services enable pubsub.googleapis.com

Ardından, bu uygulama için registrations adlı bir Pub/Sub konusu oluşturacağız. Uygulama üzerinden gönderilen kayıt bilgileri bu konuda yayınlanır.

$ gcloud pubsub topics create registrations

Son olarak, konu için bir abonelik oluşturun. Pub/Sub aboneliği, bir konudan mesaj almanızı sağlar.

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

Artık uygulamanız için Cloud Pub/Sub konusu ve aboneliği oluşturma işlemini tamamladınız.

4. Cloud SQL (MySQL) örneği ve veritabanı oluşturma

Örnek uygulamamız için de kayıt yaptıranların bilgilerini tutacak bir veritabanı örneği oluşturmamız gerekiyor. Bu adımda, Cloud SQL kaynaklarını sağlama için Cloud Shell terminali de kullanılır. Cloud SQL örneklerinizi Google Cloud Console üzerinden de görüntüleyip yapılandırabileceğinizi unutmayın.

Öncelikle Cloud SQL Admin API'yi etkinleştirin.

$ gcloud services enable sqladmin.googleapis.com

Ardından, bir Cloud SQL (MySQL) örneği sağlayacağız. Bu komutun çalıştırılması biraz zaman alabilir.

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

Cloud SQL örneğinizi başarıyla oluşturduktan sonra örneğinizde registrants adlı yeni bir veritabanı oluşturun.

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

Uygulamanız için Cloud SQL örneği ve veritabanı kurulumunu tamamladınız.

5. Spring Boot uygulaması başlatma

Artık uygulamayı yazmaya başlayabiliriz. Sonraki adımlarda, kurulum adımlarında açıklanan Cloud Shell kullanılmaya devam edecektir.

İlk olarak, proje için iskele kodu oluşturmak üzere Initializr'ı kullanacağız. Cloud Shell pencerenizde şunu çalıştırın:

$ 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

Bu komut, registrations-codelab/ dizininde uygulamanız için iskele koduyla birlikte ilk Maven proje kurulumunu oluşturur. Aşağıdaki bölümlerde, çalışan bir uygulama oluşturmak için gerekli kod düzenlemeleri açıklanmaktadır.

Cloud Shell kod düzenleyicisi

Cloud Shell ortamında kodu değiştirmeye ve görüntülemeye başlamanın en kolay yolu, yerleşik Cloud Shell kod düzenleyiciyi kullanmaktır.

Cloud Shell örneğini açtıktan sonra kod düzenleyiciyi açmak için kalem simgesini tıklayın. Düzenleyici, Initialzr tarafından oluşturulan proje dosyalarını doğrudan değiştirmenize olanak tanımalıdır.

cce293b40119c37b.png

6. Veritabanı Yapılandırması

Öncelikle uygulamanızı, oluşturduğunuz Cloud MySQL veritabanına bağlanabilecek şekilde yapılandırın. Spring Cloud GCP kitaplıkları, Cloud MySQL örneğine bağlanmak için gerekli bağımlılıkları sağlayan bir Cloud MySQL başlatıcı sunar.

spring-cloud-gcp-starter-sql-mysql bağımlılığını proje pom.xml dosyasına ekleyin:

registrations-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>

Ayrıca, veritabanı yapılandırmanızı açıklamak için application.properties yapılandırma dosyasını değiştirmeniz gerekir. Aşağıdaki özellikleri application.properties dosyanıza kopyalayın.

Veritabanınızın örnek bağlantı adını bulun:

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

Bunun çıktısı, bağlantı bilgilerini yapılandırmak için application.properties dosyasında kullanılır.

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

Değiştirmeniz gereken tek özellik örnek bağlantı adıdır. Bu değer, iki nokta üst üste ile ayrılmış değer olarak YOUR_GCP_PROJECT_ID:REGION:DATABASE_INSTANCE_NAME biçiminde biçimlendirilmelidir.

7. Statik İçerik Oluşturma

İlk olarak uygulamamızın ön ucunu oluşturacağız. Uygulamada, kişilerin kaydolmasına olanak tanıyan bir form ve başarılı kayıt yaptıran tüm kullanıcıları gösteren bir görünüm olmalıdır.

Ana sayfa için kayıt formunu içeren bir index.html oluşturun.

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>

Ardından, kayıtlı kullanıcıları göstermek için registrants.html adlı bir Thymeleaf şablonu oluşturacağız. Thymeleaf, dinamik olarak oluşturulan HTML'yi oluşturmak ve yayınlamak için kullandığımız bir şablon oluşturma çerçevesidir. Şablonun, dinamik içeriği işlemek için bazı ek Markdown öğeleri dışında HTML'ye benzediğini görürsünüz. Bu şablon, uygulamaya kaydolan tüm kullanıcıları içeren personsList adlı tek bir parametreyi kabul eder.

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>

Bu noktada, statik içeriğin sunulduğunu doğrulayabilirsiniz.

Maven kullanarak uygulamayı derleyin ve çalıştırın:

$ ./mvnw spring-boot:run

Cloud Shell penceresinde önizleme düğmesini tıklayın ve ana sayfanın oluşturulduğunu doğrulayın. Ancak web denetleyicisi eksik olduğundan kullanıcı arayüzündeki işlevlerin hiçbiri çalışmaz. Bu, sonraki adımda eklenecektir.

5e38bb0d0e93002e.png

Uygulamayı önizledikten sonra uygulamayı sonlandırmak için CTRL+C simgesine basın.

8. Kayıt Yaptıranları Pub/Sub Konusuna Gönderme

Bu adımda, web formu aracılığıyla gönderilen kayıtların bir Cloud Pub/Sub konusunda yayınlanacağı özelliği uygulayacağız.

Veri sınıflarını ekleme

İlk olarak, bazı Kotlin veri sınıfları oluşturacağız. Bunlar JPA varlıklarımız olacak ve aynı zamanda form aracılığıyla gönderilen kayıt yaptıranların ara temsili olarak da işlev görecek.

Demo paketine iki yeni dosya ekleyin: Person sınıfı ve Spring Data PersonRepository. Bu iki sınıf, Spring Data JPA kullanarak kayıt girişlerini MySQL veritabanımızda kolayca saklamamıza ve almamıza olanak tanır.

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>

Web denetleyicisini ekleme

Ardından, formdaki kayıtlı kullanıcıları işleyen ve bilgileri daha önce oluşturduğunuz Cloud Pub/Sub konusuna gönderen bir denetleyici sınıfı oluşturacağız. Bu denetleyici iki uç nokta oluşturur:

  • /registerPerson: Kayıt yaptıran bilgilerinin gönderildiği ve ardından Pub/Sub konusuna gönderildiği POST uç noktası. registerPerson(..) işlevinde, kayıt yaptıran bilgileri Spring Cloud GCP Pub/Sub entegrasyonlarındaki bir kolaylık sınıfı olan PubSubTemplate kullanılarak Pub/Sub konusuna gönderilir. Bu sınıf, Cloud Pub/Sub ile etkileşime başlamak için gereken standart kodu en aza indirir.
  • /registrants: Veritabanına başarıyla kaydedilen tüm kayıtlı kullanıcıları gösterir. Bu bilgiler, önceki adımda oluşturduğumuz Spring Data deposu kullanılarak MySQL örneğinden alınır.

Demo paketinde aşağıdaki denetleyici sınıfını oluşturun:

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

Denetleyici, web formu aracılığıyla gönderilen kayıt yaptıran bilgilerini okur ve ardından bilgileri Pub/Sub konusunda yayınlar.

JSON Object Mapper Bean'i ekleme

Denetleyicide, Pub/Sub konusuna bir String değil, Person nesnesi yayınladığımızı fark etmiş olabilirsiniz. Bu, konulara gönderilecek özel JSON yükleri için Spring Cloud GCP desteğinden yararlanmamız sayesinde mümkündür. Kitaplıklar, nesneleri JSON'a seri hale getirmenize, JSON yüklerini bir konuya göndermenize ve yükü alındığında seri durumdan çıkarmanıza olanak tanır.

Bu özellikten yararlanmak için uygulama bağlamınıza bir ObjectMapper bean eklememiz gerekir. Bu ObjectMapper bean, uygulamanız mesaj gönderip aldığında nesneleri JSON'a ve JSON'dan seri hale getirmek için kullanılır. DemoApplication.kt sınıfına JacksonPubSubMessageConverter Spring bean'ini ekleyin:

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

Bu noktada, aşağıdaki komutu çalıştırarak uygulamayı tekrar çalıştırmayı deneyebilirsiniz:

$ ./mvnw spring-boot:run

Uygulama, ana sayfadaki web formundan bilgileri oluşturduğunuz Pub/Sub konusuna gönderir. Ancak bu Pub/Sub konusundan okumamız gerektiğinden henüz yararlı bir işlem yapmıyor. Bu işlem bir sonraki adımda gerçekleştirilir.

9. Pub/Sub konusundan kayıtlı kullanıcıları okuma

Son adımda, kayıt yaptıran bilgilerini Pub/Sub konusundan işleyip Cloud MySQL veritabanında kalıcı hale getireceğiz. Bu işlem, uygulamayı tamamlayarak form aracılığıyla yeni kayıtlı kullanıcılar göndermenize ve /registrants uç noktası üzerinden tüm kayıtlı kullanıcıları görüntülemenize olanak tanır.

Bu uygulama, mesajlaşma ile ilgili birçok kullanışlı soyutlama sunan Spring Integration'dan yararlanacaktır. Pub/Sub konusundaki mesajları okuyup daha fazla işlenmek üzere pubsubInputChannel'a yerleştirmemizi sağlamak için bir PubSubInboundChannelAdapter ekleyeceğiz. Ardından, messageReceiver işlevini @ServiceActivator kullanarak pubsubInputChannel adresine gelen iletilerle çağrılacak şekilde yapılandıracağız.

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

Bu noktada, uygulamanın kurulumunu tamamlamış olursunuz. Uygulamanın düzgün çalıştığını doğrulamak için şunu çalıştırın:

$ ./mvnw spring-boot:run

Önizleme düğmesini tekrar tıklayın ve formu doldurup göndererek bir kullanıcı kaydetmeyi deneyin.

e0d0b0f0c94120c2.png

Yeni katılımcının tabloda göründüğünü doğrulamak için Kayıtlı Kişiler bağlantısını tıklayın.

ab3b980423d0c51.png

Tebrikler, artık hazırsınız. Terminal penceresinde CTRL+C tuşuna basarak uygulamayı sonlandırın.

10. Temizleme

Ortamınızı temizlemek için oluşturduğunuz Pub/Sub konusunu ve Cloud MySQL örneğini silmeniz gerekir.

Cloud MySQL örneğini silme

$ gcloud sql instances delete codelab-instance

Pub/Sub kaynaklarını silme

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

11. Tebrikler!

Artık Cloud Pub/Sub ve Cloud SQL (MySQL) ile entegre olan bir Spring Kotlin uygulaması yazma işlemini tamamladınız.

Daha Fazla Bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.