Bu codelab hakkında
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, Dockerfile ile 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. Docker dosyaları, bu taşıma işlemi için en pratik dağıtım yöntemidir ancak derleme işleminizi özelleştirmek için en fazla seçeneği de sunar.
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.
Taşımak istediğiniz uygulamada App Engine eski paketlenmiş hizmetleri veya App Engine'a ö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 iyi bir başlangıç noktası olabilir.
Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:
- Cloud Shell'i kullanma
- Cloud Run, Artifact Registry ve Cloud Build API'lerini etkinleştirme
- Docker, Docker ve Cloud Build'i kullanarak uygulamanızı container mimarisine alma
- Container görüntülerinizi Cloud Run'a dağıtma
Gerekenler
- Etkin bir GCP faturalandırma hesabı ve etkin App Engine içeren 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 Java 8 servlet uygulaması (bu, App Engine'daki 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 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. İ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. 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ı 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. Uygulamanızı Dockerfile ile 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 nasıl derleme adımları tanımlayacağınızı öğreneceksiniz. 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 baseline 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 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ında yer alan adımları inceleyin:
gcloud
KSA'yı yükleme/yeniden tanıma- Projeniz için gcloud CLI'yi
gcloud init
ile başlatın gcloud app create
ile App Engine projesi oluşturma- Örnek uygulamayı App Engine'e dağıtma
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Uygulamanın App Engine'de sorunsuz çalıştığını onaylama
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. Google Cloud'da bunu yapmanın önerilen yolu Artifact Registry'yi kullanmaktır.
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ş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ı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, 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. Bahar Bot kurulumu
Spring Boot, servlet'lerinizi değişiklik yapmadan yeniden kullanabilir ancak bulunabilir olmaları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. Uygulamayı JAR olarak paketleme
Savaştan başlayarak uygulamanızı container mimarisine almak mümkün olsa da uygulamanızı yürütülebilir bir JAR olarak paketlemeniz daha kolay hale gelir. 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:
- 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'e 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ın container'ını gerçekte nasıl derleyebileceğiniz hakkında Cloud Build'i bilgilendirmeye hazırsınız. Bu kapsayıcı oluşturma 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
${JAR_FILE} app.jar dosyasını KOPYALA
ENTRYPOINT ["Java", "-jar","/app.jar"]
Bu Dockerfile, ilkbahar önyükleme hizmetinizin uber-jar sürümünü tek bir katmanda toplar. Dockerfile kapsayıcı oluşturma konusunda en basit yaklaşımdır ancak özellikle bağımlılıkların nispeten kararlı olduğu tekrarlanan süreler karşılaştırıldığında birtakım dezavantajları vardır. Bu tür endişeler, bu kapsayıcı yönteminin daha gelişmiş olarak kabul edilmesinin nedenidir. Ancak kendi Dockerfile'ınızı yazmanın avantajları da vardır. Kendi Dockerfile'ınızı yazarak temel görüntünüz üzerinde tam kontrol sahibi olabilir ve dikkatlice katmanlı bir görüntü yazmanın performans avantajlarından yararlanabilirsiniz.
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 --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Yukarıdaki komuttaki yer tutucu değerleri aşağıdakilerle değiştirin:
- KONUM: Deponunuzun 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ü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! 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.
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'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. 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 öğe 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 codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama yapma ve yeni sorun oluşturma bağlantıları:
Taşıma kaynakları
- App Engine hizmetlerini paketten çıkarmak için taşıma seçenekleri
- Cloud Build için derleme tetikleyicileri ayarlama
- Java 11/17'ye geçiş hakkında daha fazla bilgi
Çevrimiçi 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 "Daima Ücretsiz" katmanı
- Google Cloud KSA (
gcloud
KSA) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Expeditions
- 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.