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ğitimde, Jib'i kullanarak bir App Engine uygulamasının Cloud Run tümüyle yönetilen hizmetine dağıtılmak üzere nasıl kapsayıcıya alınacağı açıklanmaktadır. Jib'i kullanarak, container'larda uygulama geliştirmek, göndermek ve çalıştırmak için sektörde bilinen bir platform olan Docker görüntülerini oluşturabilirsiniz.
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.
Uygulamanız App Engine eski paketlenmiş hizmetlerini veya diğer App Engine özelliklerini yoğun şekilde kullanıyorsa Cloud Run'a geçmeden önce bu paketlenmiş hizmetlerden taşınmanızı veya bu özellikleri değiştirmenizi öneririz. Taşıma seçeneklerinizi incelemek için daha fazla zamana ihtiyacınız varsa veya eski paketlenmiş hizmetleri kullanmaya devam etmek istiyorsanız daha yeni bir çalışma zamanına geçerken 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.
Aşağıdaki işlemleri yapmayı öğreneceksiniz:
- Cloud Shell'i kullanma
- Cloud Run, Artifact Registry ve Cloud Build API'lerini etkinleştirme
- Jib ve Cloud Build'i kullanarak uygulamanızı container'a alma
- Container görüntülerinizi Cloud Run'a dağıtma
Gerekenler
- Etkin bir GCP faturalandırma hesabı ve App Engine'in etkin olduğu bir Google Cloud Platform projesi
- Yaygın Linux komutları hakkında bilgi sahibi olma
- App Engine uygulamalarını geliştirme ve dağıtma hakkında temel düzeyde bilgi
- Java 17'ye taşımak ve Cloud Run'a dağıtmak istediğiniz bir Java 8 servlet uygulaması (App Engine'deki bir uygulama veya yalnızca kaynak olabilir)
Anket
Bu eğitimi nasıl kullanacaksınız?
Java ile ilgili deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
App Engine ve Cloud Functions gibi Platform Olarak Hizmet (PaaS) sistemleri, sistem yöneticilerinin ve Devops'un çözümler 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.
Ancak kapsayıcıların esnekliği de ilgi çekicidir. İstediğiniz dili, kitaplığı ve ikili programı seçebilmeniz sayesinde kapsayıcılar size iki dünyanın da en iyisini sunar: sunucusuzluğun kolaylığı ve kapsayıcıların esnekliği. 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ı deneyiminizin biraz farklı olacağını belirtmek isteriz.
Bu codelab'de kapsayıcıları nasıl oluşturacağınızı ve dağıtacağınızı öğreneceksiniz. Öğrenecekleriniz:
- Jib ile uygulamanızı kapsayıcıya alma
- App Engine yapılandırmasından taşıma
- ve isteğe bağlı olarak Cloud Build için derleme adımları tanımlayabilirsiniz.
Bu kapsamda, App Engine'e özgü bazı özelliklerden ayrılacağız. 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ına sahip 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, Servlet tabanlı bir Datastore uygulamasıdır. Bu uygulamayı App Engine dağıtımına hazırlamayla ilgili README'deki talimatları uygulayın.
3. (İsteğe bağlı) Temel uygulamayı dağıtma
Aşağıdakiler yalnızca Cloud Run'a taşımadan önce uygulamanın App Engine'de çalıştığını onaylamak istiyorsanız gereklidir.
README.md dosyasındaki adımlara göz atın:
gcloud
CLI'yi yükleyin/yeniden öğrenin- Projeniz için gcloud CLI'yi
gcloud init
ile başlatın gcloud app create
ile App Engine projesini oluşturun- Örnek uygulamayı App Engine'e dağıtma
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Uygulamanın App Engine'de sorunsuz çalıştığını doğrulayın
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. Google Cloud'da bunu yapmanın önerilen yolu Artifact Registry'yi kullanmaktır.
gcloud ile migration
adlı deposu şu şekilde 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 yalnızca App Engine'e özgü diğer özelliklerini yoğun ş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ız Java 8 kullanıyorsa güvenlik güncellemelerini takip etmek ve yeni dil özelliklerine erişmek için 11 veya 17 gibi daha yeni bir LTS adayına 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'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 ekleme
App Engine ile Cloud Run arasında, aralarında geçiş yaparken dikkate alınması gereken çeşitli 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. Bize bir 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 örnekte, taşıma işleminden sonra varsayılan davranıştaki farklılıkları en aza indirmek için bu yapı hariç tutulur ve Jetty kullanılır. Ayrıca Jetty sürümünü, App Engine'ın sağladığı sürümle eşleşecek şekilde 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, servlet'lerinizi değiştirmeden yeniden kullanabilir ancak keşfedilebilirlik 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);
}
}
Buna @ServletComponentScan
ek açıklama da dahildir. 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
Jib ile uygulamanızı bir war dosyasından kapsayıcıya yerleştirmek mümkün olsa da uygulamanızı yürütülebilir JAR olarak paketlemeniz işlemi kolaylaştırır. 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ında 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ından, hizmetlerinden ve bağımlılıklarından geçiş
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:
- Uygun bağımsız hizmetler bulmak için paketlenmiş hizmetlerden taşıma.
- App Engine'de kalırken Java 11/17 çalışma zamanlarına geçiş yapan kullanıcılar için XML yapılandırma dosyalarını YAML'ye taşıma.
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
Bu noktada, uygulamanızı doğrudan kaynak kodunuzdan Cloud Run'a manuel olarak dağıtabilirsiniz. Bu, arka planda Cloud Build'i kullanarak dağıtım deneyimini kolaylaştırmak için 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 kontrole ihtiyacınız varsa amaçladığınız derleme adımlarını açıkça belirten bir cloudbuild.yaml
dosyası tanımlayarak bunu elde edebilirsiniz:
1. cloudbuild.yaml dosyası tanımlama
pom.xml
ile aynı düzeyde aşağıdaki cloudbuild.yaml
dosyasını 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'e bu adımları uygulamasını söyledikten sonra:
- Testlerinizi
./mvnw test
ile çalıştırma - Jib ile görüntünüzü derleyin, Artifact Registry'ye gönderin ve etiketleyin
gcloud run deploy
ile resminizi Cloud Run'a dağıtma
‘visitors'
değerinin, Cloud Run'a istenen hizmet adı olarak sağlandığını unutmayın. –allow-unauthenticated
işareti, kullanıcıların kimlik doğrulama gerekmeden web uygulamasını ziyaret etmesine olanak tanır. cloudbuild.yaml
dosyasında PROJECT_ID'yi projenizin kimliğiyle değiştirdiğinizden emin olun.
Ardından, Cloud Build hizmet hesabının Artifact Registry'ye erişmesine izin vermek için aşağıdaki IAM politika 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 istenen derleme adımları hakkında bilgi verdiğiniz için artık tek tıklamayla dağıtıma hazırsınız.
Aşağıdaki komutu çalıştırın:
gcloud builds submit
İşlem tamamlandıktan sonra container görüntünüz derlendi, Artifact Registry'de depolandı ve Cloud Run'a dağıtıldı.
Bu codelab'in sonunda uygulamanız java17-and-cloud-run/finish ile aynı görünecektir.
İşte bu kadar! Bir Java 8 App Engine uygulamasını Java 17 ve Cloud Run'a başarıyla taşıdınız ve artık geçiş yaparken ve barındırma seçenekleri arasında seçim yaparken yapılması gerekenleri daha net anlıyorsunuz.
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.
Sonraki adımda, Cloud Build ile dağıtabileceğiniz CI/CD ve yazılım tedarik zinciri güvenlik özellikleri hakkında daha fazla bilgi edinebilirsiniz:
- Cloud Build ile özel derleme adımları oluşturma
- Derleme Tetikleyicileri oluşturma ve yönetme
- Cloud Build ardışık düzeninizde İsteğe Bağlı taramayı kullanma
İ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 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ı
- App Engine hizmetlerinin bir parçası olarak sunmak için taşıma seçenekleri
- Cloud Build için derleme tetikleyicileri ayarlama
- Java 11/17'ye geçiş hakkında daha fazla bilgi
Online kaynaklar
Aşağıda, bu eğitimle alakalı olabilecek internet kaynakları verilmiştir:
App Engine
- App Engine belgeleri
- App Engine fiyatlandırması ve kotaları hakkında bilgi
- Birinci ve ikinci nesil platformları karşılaştırma
- Eski çalışma zamanları için uzun süreli destek
Diğer Cloud bilgileri
- Google Cloud "Always Free" katmanı
- Google Cloud CLI (
gcloud
CLI) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Tech kanalına abone olun
- Google Developers'a abone olun
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.