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ğitimde, Jib kullanılarak 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. 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.
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.
Uygulamanız App Engine'in eski paket hizmetlerini veya diğer App Engine özelliklerini yoğun bir şekilde kullanıyorsa Cloud Run'a geçmeden önce bu paket halinde sunulan hizmetlerden geçiş yapmanızı veya bu özellikleri değiştirmenizi öneririz. Taşıma seçeneklerinizi incelemek için daha fazla zamana ihtiyacınız varsa veya şimdilik eski paketlenmiş hizmetleri kullanmaya devam etmek istiyorsanız daha yeni bir çalışma zamanına yükseltme yaparken Java 11/17 için App Engine paket 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.
Demoda 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 mimarisine alın
- 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ıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- 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ğiticiden nasıl yararlanacaksınız?
Java deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
App Engine ve Cloud Functions gibi Hizmet Olarak Platform (PaaS) sistemleri, ekibiniz ve uygulamanız için SysAdmins ve Devops'un çözümler 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. Cloud Run'ın vadettiklerinden biri de bu.
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. Öğrenecekleriniz:
- Jib ile uygulamanızı container mimarisine alın
- App Engine yapılandırmasının dışına 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 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:
gcloud
KSA'yı yükleme/yeniden tanımagcloud init
ile projeniz için gcloud KSA'yı başlatmagcloud 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ı 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. Ayrıca Jetty sürümünü, kullanıma hazır olarak App Engine'in 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. Bahar Bot 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);
}
}
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. Uygulamayı bir JAR olarak paketleme
Savaştan başlayarak uygulamanızı Jib ile kapsayıcıya almak mümkün olsa da uygulamanızı yürütülebilir bir JAR olarak paketlemeniz daha kolay hale gelir. 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ı, hizmetleri 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:
- Uygun bağımsız hizmetleri 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ı Container mimarisine alın
Bu noktada, uygulamanızı doğrudan kaynak kodunuzdan Cloud Run'a manuel olarak dağıtabilirsiniz. Bu, müdahale gerektirmeyen bir dağıtım deneyimi sunmak için arka planda Cloud Build'i kullanan mükemmel bir seçenektir. Sonraki modüllerde kaynak dağıtımlarını daha ayrıntılı olarak ele alacağız.
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 gösteren bir cloudbuild.yaml
dosyası tanımlayarak bunu gerçekleştirebilirsiniz:
1. Bir cloudbuild.yaml dosyası tanımlayın
Aşağıdaki 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'e bu adımları izlemesini söyledikten sonra:
./mvnw test
ile test yapın- Jib ile görüntünüzü derleyin, aktarın ve Artifact kayıt defterine etiketleyin.
gcloud run deploy
ile görüntünüzü Cloud Run'a dağıtın
Cloud Run'a istenen hizmet adı olarak ‘visitors'
sağlanmış. –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 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'i istediğiniz derleme adımları hakkında bilgilendirdiğinize göre tek tıkla 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 barındırma seçenekleri arasında geçiş yaparken yapılması gerekenleri daha net bir şekilde anladı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:
- 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 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ı
- App Engine hizmetlerinin bir parçası olarak sunmak için taşıma seçenekleri
- Cloud Build için Derleme tetikleyicilerini ayarlama
- Java 11/17'ye geçiş hakkında daha fazla bilgi
Çevrimiçi kaynaklar
Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:
App Engine
- App Engine belgeleri
- App Engine fiyatlandırması ve kota bilgileri
- Birinci ve ikinci nesil platformlar
- Eski çalışma zamanları için uzun süreli destek
Diğer Cloud bilgileri
- Google Cloud "Daima Ücretsiz" katman
- Google Cloud KSA (
gcloud
KSA) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Teknolojisi'ne 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.