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

1. Genel Bakış

Bu Codelab serisi (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitimler), bir dizi taşıma işlemi boyunca yol göstererek Google App Engine (Standart) Java geliştiricilerinin uygulamalarını modernleştirmelerine yardımcı olmayı amaçlamaktadır. Bu adımları uygulayarak uygulamanızı daha taşınabilir olacak şekilde güncelleyebilir ve App Engine'in kardeş hizmeti olan Google Cloud'un kapsayıcı barındırma hizmeti Cloud Run ve diğer kapsayıcı barındırma hizmetleri için kapsayıcıya alma kararı verebilirsiniz.

Bu eğiticide, Jib kullanarak Cloud Run'ın tümüyle yönetilen hizmetine dağıtmak üzere bir App Engine uygulamasını nasıl container mimarisine alacağınız açıklanmaktadır. Jib ile, sektörde uygulamaları container'larda geliştirme, gönderme ve çalıştırma konusunda iyi bilinen bir platform olan Docker görüntüleri oluşturabilirsiniz.

Bu laboratuvarda, App Engine'den Cloud Run'a geçmek için gereken adımları öğrenmenin yanı sıra Java 8 App Engine uygulamasını Java 17'ye nasıl yükselteceğinizi de öğreneceksiniz.

Uygulamanız App Engine'in eski paketlenmiş hizmetlerini veya diğer App Engine özelliklerini yoğun bir şekilde kullanıyorsa Cloud Run'a geçmeden önce bu paketlenmiş hizmetlerden geçmenizi veya bu özellikleri değiştirmenizi öneririz. Taşıma seçeneklerinizi incelemek için daha fazla zamana ihtiyacınız varsa veya bir süreliğine eski paketlenmiş hizmetleri kullanmaya devam etmek istiyorsanız daha yeni bir çalışma zamanına yükseltirken Java 11/17 için App Engine paketlenmiş hizmetlerine erişmeye devam edebilirsiniz. Uygulamanız daha taşınabilir hale geldiğinde, talimatları uygulamanıza nasıl uygulayacağınızı öğrenmek için bu codelab'e geri dönün.

Bu demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • Cloud Shell'i kullanma
  • Cloud Run, Artifact Registry ve Cloud Build API'lerini etkinleştirin.
  • Jib ve Cloud Build kullanarak uygulamanızı container'a dönüştürme
  • Container görüntülerinizi Cloud Run'a dağıtma

Gerekenler

Anket

Bu eğitimi nasıl kullanacaksınız?

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

Java ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Yeni başlayan Orta düzey Uzman

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

Başlangıç Orta İleri

2. Arka plan

App Engine ve Cloud Functions gibi hizmet olarak platform (PaaS) sistemleri, sistem yöneticilerinin ve DevOps ekiplerinin çözüm oluşturmaya odaklanmasını sağlama gibi birçok kolaylık sunar. Sunucusuz platformlar sayesinde uygulamanız gerektiğinde otomatik olarak yukarı ölçeklenebilir, maliyetleri kontrol etmenize yardımcı olmak için kullanıma göre ödeme faturalandırmasıyla sıfıra kadar ölçeği azaltılabilir ve çeşitli yaygın geliştirme dillerini kullanabilir.

Ancak kapsayıcıların esnekliği de dikkat çekicidir. Herhangi bir dili, kitaplığı ve ikili programı seçebilme özelliği sayesinde container'lar, hem sunucusuz bilgi işlem kolaylığını hem de container'ların esnekliğini sunar. Cloud Run'ın amacı budur.

Cloud Run'ı kullanmayı öğrenmek bu codelab'in kapsamı dışındadır. Bu konu Cloud Run belgelerinde ele alınmıştır. Buradaki amaç, App Engine uygulamanızı Cloud Run (veya kapsayıcı barındıran diğer hizmetler) için kapsayıcıya alma konusunda bilgi sahibi olmanızı sağlamaktır. Devam etmeden önce bilmeniz gereken birkaç nokta var. En önemlisi, kullanıcı deneyiminizin biraz farklı olacağı.

Bu codelab'de kapsayıcı oluşturmayı ve dağıtmayı öğreneceksiniz. Öğrenecekleriniz:

  • Jib ile uygulamanızı kapsayıcıya alma
  • App Engine yapılandırmasından taşıma
  • İsteğe bağlı olarak, Cloud Build için derleme adımları tanımlayın.

Bu işlem, App Engine'e özgü belirli özelliklerin kullanımının bırakılmasını gerektirir. Bu yolu izlemeyi tercih etmezseniz uygulamalarınızı App Engine'de tutarak Java 11/17 çalışma zamanına yükseltebilirsiniz.

3. Kurulum/Ön Hazırlık

1. Proje oluşturma

Bu eğitimde, yepyeni bir projede appengine-java-migration-samples deposundaki örnek bir uygulamayı kullanacaksınız. Projenin etkin bir faturalandırma hesabı olduğundan emin olun.

Mevcut bir App Engine uygulamasını Cloud Run'a taşımayı planlıyorsanız bunun yerine bu uygulamayı kullanarak da adımları takip edebilirsiniz.

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ış, Servlet tabanlı bir Java 8 Datastore uygulamasıdır. Bu uygulamayı App Engine dağıtımına hazırlama ile ilgili README dosyasındaki talimatları uygulayın.

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

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

README.md dosyasındaki adımlara bakın:

  1. gcloud CLI'yı yükleyin/yeniden öğrenin
  2. gcloud init ile projeniz için gcloud CLI'yı başlatın.
  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ı onaylayın

4. Artifact Registry deposu oluşturma

Uygulamanızı kapsayıcıya dönüştürdükten sonra görüntülerinizi gönderebileceğiniz ve depolayabileceğiniz bir yer gerekir. Google Cloud'da bu işlemi yapmanın önerilen yolu Artifact Registry'dir.

migration adlı depoyu gcloud ile aşağıdaki gibi oluşturun:

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

Bu depoda docker biçim türünün kullanıldığını ancak çeşitli depo türlerinin bulunduğunu unutmayın.

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

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

Uygulamanızın App Engine'in eski paketlenmiş hizmetlerini, yapılandırmasını veya yalnızca App Engine'e özel diğer özelliklerini yoğun bir şekilde kullandığı durumlarda, yeni çalışma zamanına yükseltirken bu hizmetlere erişmeye devam etmenizi öneririz. Bu codelab, bağımsız hizmetleri kullanan veya bunu yapacak şekilde yeniden düzenlenebilecek uygulamalar için bir taşıma yolunu gösterir.

1. Java 17'ye yükseltme

Uygulamanız Java 8'de çalışıyorsa güvenlik güncellemelerinden yararlanmaya devam etmek ve yeni dil özelliklerine erişmek için 11 veya 17 gibi daha yeni bir LTS adayına yükseltmeyi düşünebilirsiniz.

pom.xml bölümündeki tesisleri aşağıdaki bilgileri 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 olarak 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ı sağlar.

2. Web sunucusu dahil

App Engine ile Cloud Run arasında, aralarında geçiş yaparken dikkate alınması gereken çeşitli farklar vardır. Farklardan biri, App Engine'in Java 8 çalışma zamanı, barındırdığı uygulamalar için bir Jetty sunucusu sağlarken ve yönetirken Cloud Run'ın bunu yapmamasıdır. Web sunucusu ve servlet kapsayıcısı sağlamak için Spring Boot'u kullanacağı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şıma işleminden sonra varsayılan davranışlardaki farklılıkları en aza indirmek için bu yapıyı hariç tutar ve Jetty'yi kullanır. Jetty sürümünü, App Engine'in kutudan çıktığı gibi sağladığı sürümle eşleşecek şekilde de yapılandırabiliriz.

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

3. Spring Boot kurulumu

Spring Boot, servletlerinizi değiştirmeden yeniden kullanabilir ancak bulunabilirlik için bazı yapılandırmalar gerektirir.

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, @ServletComponentScan ek açıklamasını içerir. Bu ek açıklama, varsayılan olarak mevcut pakette tüm @WebServlets öğelerini arar ve bunları beklendiği gibi kullanılabilir hale getirir.

4. Uygulamayı JAR olarak paketleme

Uygulamanızı war dosyasından başlayarak Jib ile kapsüllemek mümkün olsa da uygulamanızı yürütülebilir bir JAR olarak paketlerseniz bu işlem kolaylaşır. Bu işlem, özellikle derleme aracı olarak Maven'i kullanan projelerde çok fazla yapılandırma gerektirmez. Bunun nedeni, jar paketlemenin varsayılan davranış olmasıdır.

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

<packaging>war</packaging>

Ardından 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ı, hizmetleri ve bağımlılıklarından taşıma

Bu kod laboratuvarının başında belirtildiği gibi Cloud Run ve App Engine, farklı kullanıcı deneyimleri sunacak şekilde tasarlanmıştır. App Engine'in kullanıma hazır olarak sunduğu belirli özellikler (ör. Cron ve Task Queue hizmetleri) manuel olarak yeniden oluşturulmalıdır ve sonraki modüllerde daha ayrıntılı olarak ele alınacaktır.

Örnek uygulamada eski paketlenmiş hizmetler kullanılmamaktadır ancak uygulamalarında bu hizmetleri kullanan kullanıcılar aşağıdaki kılavuzlara başvurabilir:

Bundan sonra 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. Uygulamayı Kapsayıcıya Alma

Bu noktada, uygulamanızı doğrudan kaynak kodunuzdan Cloud Run'a manuel olarak dağıtabilirsiniz. Bu, arka planda Cloud Build'i kullanarak otomatik dağıtım deneyimi sunan mükemmel bir seçenektir. Kaynak dağıtımları, sonraki modüllerde daha ayrıntılı olarak ele alınacaktır.

Alternatif olarak, uygulamanızın dağıtılma şekli üzerinde daha fazla kontrol sahibi olmak istiyorsanız amaçlanan derleme adımlarınızı açıkça belirten bir cloudbuild.yaml dosyası tanımlayarak bunu sağlayabilirsiniz:

1. cloudbuild.yaml dosyası tanımlama

cloudbuild.yaml dosyasını pom.xml ile aynı düzeyde oluşturun:

steps:
  # Test your build
  - name: maven:eclipse-temurin
    entrypoint: mvn
    args: ["test"]
  # Build with Jib
  - name: maven:eclipse-temurin
    entrypoint: mvn
    args: [ "compile", "com.google.cloud.tools:jib-maven-plugin:3.2.1:build", "-Dimage=northamerica-northeast1-docker.pkg.dev/PROJECT_ID/migration/visitors:jib"]
  # Deploy to Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: gcloud
    args: [ 'run', 'deploy', 'visitors', '--image', 'northamerica-northeast1-docker.pkg.dev/PROJECT_ID/migration/visitors:jib', '--region', 'northamerica-northeast1', '--allow-unauthenticated']

Cloud Build'a bu adımları uygulaması söylendiğinde:

  1. Testlerinizi ./mvnw test ile yapın
  2. Jib ile görüntünüzü oluşturma, Artifact Registry'ye aktarma ve etiketleme
  3. gcloud run deploy ile görüntünüzü Cloud Run'a dağıtın.

‘visitors' değerinin, istenen hizmet adı olarak Cloud Run'a sağlandığını unutmayın. –allow-unauthenticated işareti, kullanıcıların kimlik doğrulaması yapmadan web uygulamasına gitmesini sağlar. cloudbuild.yaml dosyasında PROJECT_ID yerine projenizin kimliğini yazdığınızdan emin olun.

Ardından, Cloud Build hizmet hesabının Artifact Registry'ye erişmesine izin vermek için aşağıdaki IAM politikası bağlamalarını ekleyin:

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)" )

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
--role=roles/run.admin \
--project=$PROJECT_ID
gcloud iam service-accounts add-iam-policy-binding $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
--role roles/iam.serviceAccountUser --project=$PROJECT_ID

2. Derleme işlemini çalıştırma

Cloud Build'e istediğiniz derleme adımlarını bildirdiğinize göre artık tek tıklamayla dağıtım yapmaya hazırsınız.

Aşağıdaki komutu çalıştırın:

gcloud builds submit

İşlem tamamlandığında container görüntünüz oluşturulur, Artifact Registry'de depolanır ve Cloud Run'a dağıtılır.

Bu codelab'in sonunda uygulamanız, java17-and-cloud-run/finish klasöründeki uygulamayla aynı görünmelidir.

İşte bu kadar! Java 8 App Engine uygulamasını Java 17 ve Cloud Run'a başarıyla taşıdınız. Artık geçiş yaparken ve barındırma seçenekleri arasında seçim yaparken gereken çalışmalar hakkında daha net bir fikriniz var.

6. Özet/Temizleme

Tebrikler! Uygulamanızı yükselttiniz, kapsüllediniz ve taşıdınız. Bu eğitim de tamamlandı.

Buradan sonraki adım, Cloud Build ile dağıtım yapabildiğiniz için artık erişebileceğiniz CI/CD ve yazılım tedarik zinciri güvenliği özellikleri hakkında daha fazla bilgi edinmektir:

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

Bu eğitim sırasında örnek uygulamayı App Engine'e 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 yeniden etkinleştirebilirsiniz. App Engine uygulamaları devre dışı bırakıldığında ücretlendirmeye neden olacak trafik almaz. Ancak Datastore kullanımı, ücretsiz kotayı aşarsa faturalandırılabilir. Bu nedenle, bu sınırın altında kalmak için yeterli miktarda veri silin.

Diğer yandan, taşımalara devam etmeyecek ve her şeyi tamamen silmek istiyorsanız hizmetinizi silebilir veya projenizi tamamen kapatabilirsiniz.

7. Ek kaynaklar

App Engine taşıma modülüyle ilgili codelab sorunları/geri bildirimleri

Bu codelab ile ilgili sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama yapma ve yeni sorunlar oluşturma bağlantıları:

Taşıma kaynakları

Online kaynaklar

Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:

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.