Docker 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 hale getirebilir 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, Dockerfile ile Cloud Run tümüyle yönetilen hizmetine dağıtmak için App Engine uygulamasını nasıl container mimarisine alacağınız açıklanmaktadır. Dockerfiles, bu taşıma için en pratik dağıtım yöntemidir ancak derleme işleminizi özelleştirmek için en fazla seçeneği de sunar.

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.

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

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

  • Cloud Shell'i kullanma
  • Cloud Run, Artifact Registry ve Cloud Build API'lerini etkinleştirin.
  • Docker, Docker 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 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. Google Cloud Run'ın temel 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. Dockerfile ile uygulamanızı nasıl kapsayacağınızı, App Engine yapılandırmasından nasıl geçeceğinizi ve (isteğe bağlı olarak) Cloud Build için derleme adımlarını nasıl tanımlayacağınızı öğreneceksiniz. 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.

3. Spring Boot kurulumu

Spring Boot, servlet'lerinizi değiştirmeden yeniden kullanabilir ancak bunların bulunabilir olduğundan emin olmak için bazı yapılandırmalar yapmanız 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, @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 kapsüllemeniz mümkün olsa da uygulamanızı yürütülebilir JAR olarak paketlemeniz bu işlemi kolaylaştırı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, Cloud Build'e uygulamanızın kapsayıcısını nasıl oluşturacağını bildirmeye hazırsınız. Bu kapsülleme yönteminde ayrı bir derleme yapılandırma dosyası (cloudbuild.yaml) gerekmez. Başlangıç noktası olarak basit bir Dockerfile tanımlayabiliriz:

FROM eclipse-temurin

ARG JAR_FILE=JAR_FILE_MUST_BE_SPECIFIED_AS_BUILD_ARG

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-jar","/app.jar"]

Bu Dockerfile, Spring Boot hizmetinizin uber-jar sürümünü tek bir katmanda paketler. Bu, Dockerfile container'laştırmanın en basit yaklaşımıdır ancak özellikle bağımlılıkların nispeten kararlı olduğu tekrarlanan zamanlar karşılaştırıldığında bir dizi dezavantajı vardır. Bu tür endişeler, bu kapsülleme yönteminin daha gelişmiş olarak kabul edilmesinin nedenidir. Ancak kendi Dockerfile'ınızı yazmak, temel görüntünüz üzerinde tam kontrol sağlar ve dikkatlice katmanlandırılmış bir görüntü yazmanın performans avantajlarından yararlanmanıza olanak tanır.

2**. Derleme işlemini çalıştırın**

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 --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME

Yukarıdaki komuttaki yer tutucu değerlerini aşağıdakilerle değiştirin:

  • LOCATION: Deponuzun bölgesel veya çok bölgeli konumu.
  • PROJECT_ID: Cloud projenizin kimliği.
  • REPOSITORY: Artifact Registry deponuzun adı.
  • IMAGE_NAME: Kapsayıcı resminizin adı.

İş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, mod4-migrate-to-cloud-run 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.