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

1. Genel Bakış

Bu Codelabs serisi (kendi hızınızda ilerleyebileceğiniz uygulamalı eğitici içerikler), Google App Engine (Standart) Java geliştiricilerine bir dizi taşıma işleminde rehberlik ederek uygulamalarını modernize etmelerine yardımcı olmayı amaçlamaktadır. Bu adımları uygulayarak uygulamanızı daha taşınabilir olacak şekilde güncelleyebilir ve Google Cloud'un App Engine'e benzer bir kapsayıcı barındırma hizmeti olan Cloud Run ve diğer kapsayıcı barındırma hizmetleri için kapsayıcıya yerleştirmeye 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. Buildpack'ler, uygulamanızı doğrudan kaynak koddan herhangi bir bulutta çalışabilecek son derece taşınabilir görüntülere taşımanıza olanak tanıyan bir CNCF projesidir.

Bu eğitimde, App Engine'den Cloud Run'a geçiş 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 uygulamada App Engine eski paketlenmiş hizmetleri veya App Engine'e özgü diğer özellikler yoğun olarak kullanılıyorsa Java 11/17 için App Engine paketlenmiş hizmetlerine erişme kılavuzu bu kod laboratuvarından daha uygun olabilir.

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'i 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 Okuyup alıştırmaları tamamlayın

Java ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Uzman

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

Acemi Orta Seviye Uzman

2. Arka plan

App Engine ve Cloud Functions gibi PaaS sistemleri, sistem yöneticilerinin ve Devops'un çözüm oluşturmaya odaklanmasını sağlamak gibi ekip ve uygulamanız için birçok kolaylık sağlar. Sunucusuz platformlar sayesinde uygulamanız gerektiğinde otomatik olarak ölçeklenebilir, maliyetleri kontrol etmeye yardımcı olmak için kullanım başına ödemeli faturalandırmayla sıfıra kadar ölçeklenebilir ve çeşitli yaygın geliştirme dillerini 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'un amacı budur.

Cloud Run'ı nasıl kullanacağınızı öğrenmek bu codelab'in kapsamı dışındadır. Bu konu Cloud Run belgeleri kapsamındadır. Buradaki amaç, Cloud Run (veya kapsayıcı barındıran diğer hizmetler) için App Engine uygulamanızı nasıl kapsayıcıya alacağınızı öğrenmenizi sağlamaktır. 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ı nasıl kapsayacağınızı, App Engine yapılandırmasından nasıl geçeceğinizi ve Cloud Build için derleme adımlarını nasıl tanımlayacağınızı öğreneceksiniz. Bu, App Engine'e özgü belirli özelliklerden vazgeçmeyi gerektirecektir. Bu yolu izlemeyi tercih etmezseniz uygulamalarını App Engine'de tutarken Java 11/17 çalışma zamanına yükseltme yapabilirsiniz.

3. Kurulum/Ön çalışma

1. Proje oluşturma

Bu eğitimde, appengine-java-migration-samples deposundaki örnek bir uygulamayı yeni bir projede 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 bu uygulamayı kullanarak talimatları 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 temel klasörüne gidin.

Örnek, App Engine'de dağıtılmak üzere tasarlanmış, Java 8 tabanlı, Servlet'e dayalı 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ı onaylama

4. Artifact Registry deposu oluşturma

Uygulamanızı kapsayıcıya dönüştürdükten sonra, resimlerinizi gönderip depolayacağınız bir yere ihtiyacınız vardır. 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 depoda docker biçim türünün kullanıldığını ancak çeşitli depo türleri bulunduğunu unutmayın.

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

4. Uygulama dosyalarını değiştirme

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 kod laboratuvarında, bağımsız hizmetleri zaten kullanan veya bu şekilde yeniden yapılandırılabilir olan 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 hesabınızdaki ö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 olarak ayarlar, derleyici eklentisini Java 17 dil özelliklerine erişmek istediğinizi ve derlenen sınıfların Java 17 JVM ile uyumlu olmasını istediğinizi bilgilendirir.

2. Web sunucusu ekleme

App Engine ile Cloud Run arasında, aralarında geçiş yaparken dikkate alınması gereken çeşitli farklılıklar vardır. Farklardan biri, App Engine'ın Java 8 çalışma zamanının barındırdığı uygulamalar için bir Jetty sunucusu sağlaması ve yönetmesidir. Cloud Run bunu yapmaz. 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şı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. Spring Boot 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ı

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

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

<packaging>war</packaging>

Ardından spring-boot-maven-plugin öğesini 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 geçiş yapma

Codelab'in başında da belirtildiği gibi Cloud Run ve App Engine farklı kullanıcı deneyimleri sunmak için tasarlanmıştır. App Engine'ın hazır olarak sunduğu belirli özelliklerin (ör. Cron ve Görev Sırası hizmetleri) manuel olarak yeniden oluşturulması gerekir. Bu özellikler, sonraki modüllerde daha ayrıntılı olarak ele alınacaktır.

Örnek uygulama eski paketlenmiş hizmetleri kullanmaz ancak uygulamalarında bu hizmetleri kullanan kullanıcılar aşağıdaki kılavuzlardan yararlanabilir:

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. Uygulamayı Kapsayıcıya Alma ve Dağıtma

Bu noktada, uygulamanızı doğrudan kaynak kodunuzdan Cloud Run'a dağıtmaya hazırsınız. Bu, arka planda Cloud Build'i kullanarak dağıtım deneyimini kolaylaştırmak için mükemmel bir seçenektir. Bu özelliği kullanabilmek için aşağıdaki izinlerden en az birine sahip bir hesaba ve bu ortam kurulum adımlarını uygulamaya veya Cloud Shell'i kullanmaya ihtiyacınız olduğunu unutmayın:

Bu ön koşullar yerine getirildiğinde, kaynak dizininizden aşağıdakileri çalıştırmanız yeterlidir:

gcloud run deploy SERVICE --source .

Yayınlama komutunu çalıştırırken sizden birkaç şey istenir. Ö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 verdikten sonra derleme ve dağıtım işlemi 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
  • Resminizi oluşturmak için arka planda Cloud Native Computing Foundation buildpack'lerini kullanır
  • Elde edilen kapsayıcı görüntüsünü depolamak için bir kayıt defteri oluşturur (henüz mevcut değilse)
  • Ayrıca, uygulamanızı barındıracak bir Cloud Run hizmeti oluşturur (henüz mevcut değilse).

Derleme ve dağıtım tamamlandıktan sonra, yeni bir düzeltmenin yayınlandığını ve trafiğin% 100'ünün bu düzeltmeyi kullandığını açıklayan bir mesaj alırsınız.

6. Özet/Temizleme

Tebrikler, uygulamanızı yeni sürüme geçirdiniz, kapsayıcıya aldınız ve taşıdınız. Bu eğitim burada sona eriyor.

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'e dağıttıysanız ücret ödememek için uygulamayı devre dışı bırakmayı unutmayın. Bir sonraki codelab'e geçmeye hazır olduğunuzda bu özelliği yeniden etkinleştirebilirsiniz. Devre dışı bırakılan App Engine uygulamaları, ücrete tabi olacak trafik almaz. Ancak Veri Deposu kullanımı, ücretsiz kotasını aşarsa faturalandırılabilir. Bu nedenle, bu sınırın altına düşecek kadar veri silin.

Öte 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ü codelabs sorunları/geri bildirimleri

Bu kod laboratuvarıyla ilgili herhangi bir sorunla karşılaşırsanız lütfen sorununuzu göndermeden önce arayın. Arama yapma ve yeni sorun oluşturma bağlantıları:

Taşıma kaynakları

Online 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.