Buildpacks ile Google App Engine Java uygulamasından Cloud Run'a taşıma

1. Genel Bakış

Bu codelab'lerden oluşan bu seri, Google App Engine (Standart) Java geliştiricilerinin bir dizi taşıma işleminde rehberlik ederek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlamaktadır. Bu adımları izleyerek uygulamanızı daha taşınabilir olacak şekilde güncelleyebilir ve Cloud Run, Google Cloud'un container barındırma kardeş hizmeti, App Engine ve diğer container barındırma hizmetleri için container mimarisine almaya karar verebilirsiniz.

Bu eğiticide, Buildpacks'i kullanarak tümüyle yönetilen bir Cloud Run hizmetine dağıtım yapmak üzere bir App Engine uygulamasını nasıl container mimarisine alacağınız öğretilmektedir. Derleme paketleri, uygulamanızı doğrudan kaynak kodundan tüm bulutta çalıştırılabilen yüksek düzeyde taşınabilir görüntülere taşımanızı sağlayan bir CNCF projesidir.

App Engine'den Cloud Run'a geçmek için gerekli adımları öğretmenin yanı sıra Java 8 App Engine uygulamalarını Java 17'ye yükseltmeyi de öğreneceksiniz.

Taşımak istediğiniz uygulama App Engine'in eski paket hizmetlerini veya App Engine'e özgü diğer özellikleri yoğun bir şekilde kullanıyorsa Java 11/17 için paket halinde sunulan App Engine hizmetlerine erişme kılavuzu, bu codelab'den daha uygun olabilir.

Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • Cloud Shell'i kullanma
  • Cloud Run, Artifact Registry ve Cloud Build API'lerini etkinleştirme
  • Cloud Build'de Buildpacks kullanarak uygulamanızı container mimarisine alın
  • Container görüntülerinizi Cloud Run'a dağıtma

Gerekenler

Anket

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

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

Java deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

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

Acemi Orta Yeterli

2. Arka plan

App Engine ve Cloud Functions gibi PaaS sistemleri, ekibiniz ve uygulamanız için SysAdmins ve Devops'un çözüm geliştirmeye odaklanmasını sağlamak gibi pek çok kolaylık sağlar. Sunucusuz platformlar sayesinde uygulamanız gerektiğinde otomatik olarak ölçeklendirilebilir, maliyetleri kontrol etmenize yardımcı olmak için kullanım başına ödeme faturalandırmasıyla sıfıra indirebilir ve yaygın olarak kullanılan çeşitli geliştirme dilleri kullanabilir.

Bununla birlikte, container'ların esnekliği de ilgi çekicidir. Container'lar istediğiniz dili, kitaplığı ve ikili programı seçebilme özelliği sayesinde hem sunucusuz platformun rahatlığını hem de container'ların esnekliğini sunar. Google Cloud Run'da amacınız budur.

Cloud Run'ın nasıl kullanılacağını öğrenmek bu codelab kapsamında değildir. Cloud Run belgelerinde yer almaktadır. Buradaki amaç, App Engine uygulamanızı Cloud Run (veya kapsayıcıda barındırılan diğer hizmetler) için nasıl container mimarisine alacağınız hakkında bilgi edinmenizdir. Devam etmeden önce bilmeniz gereken birkaç nokta var. Öncelikle kullanıcı deneyimi biraz farklı olacak.

Bu codelab'de container'ları nasıl oluşturacağınızı ve dağıtacağınızı öğreneceksiniz. Buildpacks ile uygulamanızı container mimarisine alma, App Engine yapılandırmasından başka yere taşıma ve Cloud Build için derleme adımları tanımlama hakkında bilgi edineceksiniz. Bu kapsamda, App Engine'e özgü bazı özelliklerden ayrılacağız. Bu yolu uygulamamayı tercih ederseniz bunun yerine uygulamalarınızı App Engine'de tutarken Java 11/17 çalışma zamanına yükseltebilirsiniz.

3. Kurulum/Ön Çalışma

1. Proje oluşturun

Bu eğitim için yepyeni bir projede appengine-java-migration-samples deposundan örnek bir uygulama kullanacaksınız. Projenin etkin bir faturalandırma hesabı olduğundan emin olun.

Mevcut bir App Engine uygulamasını Cloud Run'a taşımak istiyorsanız ilgili uygulamayı kullanarak ilgili adımları uygulayabilirsiniz.

Projeniz için gerekli API'leri etkinleştirmek üzere aşağıdaki komutu çalıştırın:

gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com

2. Temel örnek uygulamayı edinme

Örnek uygulamayı kendi makinenizde veya Cloud Shell'de klonlayın, ardından baseline klasörüne gidin.

Örnek, App Engine'de dağıtılmak üzere tasarlanmış Java 8, Servlet tabanlı bir Datastore uygulamasıdır. Bu uygulamayı App Engine dağıtımına hazırlamayla ilgili BENİOKU talimatlarını uygulayın.

3. (İsteğe bağlı) Temel uygulamayı dağıtma

Aşağıdaki bilgiler, yalnızca Cloud Run'a geçiş yapmadan önce uygulamanın App Engine'de çalıştığını onaylamak istiyorsanız gereklidir.

README.md dosyasındaki adımlara göz atın:

  1. gcloud KSA'yı yükleme/yeniden tanıma
  2. gcloud init ile projeniz için gcloud KSA'yı başlatma
  3. gcloud app create ile App Engine projesini oluşturun
  4. Örnek uygulamayı App Engine'e dağıtma
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
  1. Uygulamanın App Engine'de sorunsuz çalıştığını doğrulayın

4. Artifact Registry deposu oluşturma

Uygulamanızı container mimarisine aldıktan sonra görüntülerinizi aktarıp depolayabileceğiniz bir yere ihtiyacınız olur. Bu işlemi Google Cloud'da gerçekleştirmeniz için Artifact Registry'yi kullanmanız önerilir.

migration adlı depoyu aşağıdakine benzer gcloud ile oluşturun:

gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"

Bu deponun docker biçim türünü kullandığını ancak birkaç depo türü bulunduğunu unutmayın.

Bu aşamada, temel App Engine uygulamanızı kullanabilirsiniz ve Google Cloud projeniz bu uygulamayı Cloud Run'a taşımaya hazırdır.

4. Uygulama Dosyalarını Değiştir

Uygulamanızın App Engine'in eski paketlenmiş hizmetlerini, yapılandırmasını veya App Engine'e özel diğer özelliklerini yoğun bir şekilde kullandığı durumlarda, yeni çalışma zamanına geçerken bu hizmetlere erişmeye devam etmenizi öneririz. Bu codelab'de, halihazırda bağımsız hizmetler kullanan veya bu amaçla yeniden düzenlemesi yapılabilecek uygulamalar için bir taşıma yolu gösterilmektedir.

1. Java 17'ye yükseltme

Uygulamanızda Java 8 kullanılıyorsa güvenlik güncellemelerinden haberdar olmak ve yeni dil özelliklerine erişmek için LTS kanalında 11 veya 17 gibi daha yeni bir adaya geçmeyi düşünebilirsiniz.

pom.xml içindeki özellikleri aşağıdakileri içerecek şekilde güncelleyerek başlayın:

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

Bu işlem, proje sürümünü 17'ye ayarlar, derleyici eklentisine Java 17 dil özelliklerine erişmek istediğinizi bildirir ve derlenen sınıfların Java 17 JVM ile uyumlu olmasını ister.

2. Web sunucusu dahil

App Engine ile Cloud Run arasında geçiş yaparken göz önünde bulundurmanız gereken bazı farklılıklar vardır. Tek fark, App Engine'in Java 8 çalışma zamanının barındırdığı uygulamalar için bir Jetty sunucusu sağlaması ve yönetmesi ancak Cloud Run'ın bunu yapmamasıdır. Spring Boot'u kullanarak bize bir web sunucusu ve servlet kapsayıcısı sağlayacağız.

Aşağıdaki bağımlılıkları ekleyin:

<dependencies>
<!-- ... -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <version>2.6.6</version>
       <exclusions>
           <!-- Exclude the Tomcat dependency -->
           <exclusion>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-tomcat</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
   <!-- Use Jetty instead -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jetty</artifactId>
       <version>2.6.6</version>
   </dependency>
<!-- ... -->
</dependencies>

Spring Boot varsayılan olarak bir Tomcat sunucusu yerleştirir. Ancak bu örnek, taşımadan sonraki varsayılan davranıştaki farklılıkları en aza indirmek için bu yapıyı hariç tutar ve Jetty'ye bağlı kalır.

3. Bahar Bot kurulumu

Spring Boot, servlet'lerinizi değişiklik yapmadan yeniden kullanabilir ancak bunların bulunabilir olmasını sağlamak için bazı yapılandırmalar gerekir.

com.example.appengine paketinde aşağıdaki MigratedServletApplication.java sınıfını oluşturun:

package com.example.appengine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(MigratedServletApplication.class, args);
    }
}

Bu ek, tüm @WebServlets için (varsayılan olarak geçerli pakette) görünecek ve beklendiği gibi kullanılabilir hale getirecek @ServletComponentScan ek açıklamasını içerir.

4. Derleme yapılandırması

Sonra, uygulamamızı WAR olarak paketlemek için yapılandırmayı kaldırın. Jar paketleme varsayılan davranış olduğundan bu, özellikle Maven aracı olarak Maven'i kullanan projeler için çok fazla yapılandırma gerektirmez.

pom.xml dosyasındaki packaging etiketini kaldırın:

<packaging>war</packaging>

Sonra, spring-boot-maven-plugin ekleyin:

<plugins>
<!-- ... -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.6</version>
  </plugin>
<!-- ... -->
</plugins>

5. App Engine yapılandırması, hizmeti ve bağımlılıklarından geçiş yapma

Codelab'in başında belirtildiği gibi Cloud Run ve App Engine farklı kullanıcı deneyimleri sunmak için tasarlanmıştır. App Engine'in kullanıma hazır olarak sunduğu Cron ve Task Queue hizmetleri gibi bazı özelliklerin manuel olarak yeniden oluşturulması gerekir. Bu özellikler sonraki modüllerde daha ayrıntılı olarak ele alınacaktır.

Örnek uygulama, eski paket servisleri kullanmaz. Bununla birlikte, uygulamaları olan kullanıcılar aşağıdaki kılavuzlara başvurabilir:

Artık Cloud Run'a dağıtım yapacağınız için appengine-maven-plugin kaldırılabilir:

<plugin>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>appengine-maven-plugin</artifactId>
 <version>2.4.1</version>
 <configuration>
   <!-- can be set w/ -DprojectId=myProjectId on command line -->
   <projectId>${app.projectId}</projectId>
   <!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
   <version>GCLOUD_CONFIG</version>
 </configuration>
</plugin>

5. Container mimarisine alın ve Uygulamayı Dağıtma

Bu noktada, uygulamanızı doğrudan kaynak kodunuzdan Cloud Run'a dağıtmaya hazırsınız. Bu, müdahale gerektirmeyen bir dağıtım deneyimi sunmak için arka planda Cloud Build'i kullanan mükemmel bir seçenektir. Bu özellikten yararlanmak için aşağıdaki izinlerden en az birine sahip bir hesaba sahip olmanız ve bu ortam kurulum adımlarını uygulamanız veya Cloud Shell'i kullanmanız gerektiğini unutmayın:

Bu ön koşulları sağladıktan sonra kaynak dizininizden aşağıdakini çalıştırın:

gcloud run deploy SERVICE --source .

Dağıtım komutu sırasında çalıştırmanız gereken birkaç şey vardır. Örneğin:

  • Kaynak kodu konumunu sağlama
  • Hizmet adını sağlama
  • Cloud Run API'yi etkinleştirme
  • Bölgenizi seçme

Bu istemlere yanıt verildikten sonra derleme ve dağıtma süreci başlar. Bu süreçte Cloud Build şunları yapar:

  • kaynağınızı ZIP dosyası olarak sıkıştırıp bir Cloud Storage paketine kaydeder
  • görüntünüzü derlemek için arka planda Cloud Native Computing Foundation derleme paketlerini kullanır
  • sonuçta ortaya çıkan container görüntüsünü depolamak için bir kayıt defteri oluşturur (zaten mevcut değilse)
  • Uygulamanızı barındırmak için bir Cloud Run hizmeti oluşturur (mevcut değilse)

Derleme ve dağıtma işlemi tamamlandıktan sonra yeni bir düzeltmenin çalıştığını ve trafiğin% 100'ünü sunduğunu belirten bir mesaj alırsınız.

6. Özet/Temizlik

Tebrikler! Yeni sürüme geçtiniz, container mimarisine aldınız, taşıdınız ve uygulamanızı taşıdınız. Böylece bu eğitim tamamlanmış oluyor.

Sırada, Cloud Build ile dağıtabileceğiniz CI/CD ve yazılım tedarik zinciri güvenlik özellikleri hakkında daha fazla bilgi var:

İsteğe bağlı: Hizmeti temizleme ve/veya devre dışı bırakma

Bu eğitim sırasında örnek uygulamayı App Engine'de dağıttıysanız ücret alınmaması için uygulamayı devre dışı bırakmayı unutmayın. Bir sonraki codelab'e geçmeye hazır olduğunuzda projeyi yeniden etkinleştirebilirsiniz. App Engine uygulamaları devre dışıyken ücretli trafik almaz. Ancak ücretsiz kotasını aşması durumunda Datastore kullanımı faturalandırılabilir. Bu nedenle, bu sınırın altına düşecek kadar veri silin.

Diğer yandan, taşıma işlemlerine devam etmeyecekseniz ve her şeyi tamamen silmek istiyorsanız hizmetinizi silebilir veya projenizi tamamen kapatabilirsiniz.

7. Ek kaynaklar

App Engine taşıma modülü codelab'leri ile ilgili sorunlar/geri bildirimler

Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:

Taşıma kaynakları

Çevrimiçi kaynaklar

Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:

App Engine

Diğer Cloud bilgileri

Videolar

Lisans

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