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 olacak şekilde güncelleyebilir 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, Buildpacks kullanarak Cloud Run tümüyle yönetilen hizmetine dağıtmak üzere bir App Engine uygulamasını nasıl container mimarisine alacağınız açıklanmaktadır. Buildpack'ler, uygulamanızı doğrudan kaynak kodundan herhangi bir bulutta çalıştırılabilen yüksek oranda taşınabilir görüntülere dönüştürmenize olanak tanıyan bir CNCF projesidir.
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 uygun 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.
- Cloud Build'de Buildpack'leri kullanarak uygulamanızı container'a dönüştürme
- Container görüntülerinizi Cloud Run'a dağıtma
Gerekenler
- Etkin bir GCP faturalandırma hesabı ve App Engine'in etkinleştirildiği bir Google Cloud Platform projesi
- Yaygın Linux komutları hakkında çalışma bilgisi
- App Engine uygulamalarını geliştirme ve dağıtma hakkında temel bilgiler
- Java 17'ye taşımak ve Cloud Run'a dağıtmak istediğiniz bir Java 8 servlet uygulaması (bu, 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 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. Buildpack'ler ile uygulamanızı kapsayıcıya dönüştürmeyi, App Engine yapılandırmasından taşımayı ve Cloud Build için derleme adımlarını tanımlamayı öğ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:
gcloudCLI'yı yükleyin/yeniden öğreningcloud initile projeniz için gcloud CLI'yı başlatın.gcloud app createile 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ı 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. 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'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:
- Uygun bağımsız hizmetleri bulmak için paketlenmiş hizmetlerden geçiş yapma.
- App Engine'de kalırken Java 11/17 çalışma zamanlarına geçen kullanıcılar için XML yapılandırma dosyalarını YAML'ye taşıma.
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 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 otomatik dağıtım deneyimi sunan mükemmel bir seçenektir. Bu özelliği kullanabilmek için aşağıdaki izinlerden en az birine sahip bir hesabınızın olması ve bu ortam kurulumu adımlarını uygulamanız ya da Cloud Shell'i kullanmanız gerektiğini unutmayın:
- Sahip rolü
- Düzenleyici rolü
- Aşağıdaki roller:
- Cloud Build Düzenleyici rolü
- Artifact Registry Yöneticisi rolü
- Depolama alanı yöneticisi rolü
- Cloud Run Yöneticisi rolü
- Hizmet Hesabı Kullanıcısı rolü
Bu ön koşullar karşılandığında, kaynak dizininizden aşağıdaki komutu çalıştırmanız yeterlidir:
gcloud run deploy SERVICE --source .
Dağıtımı çalıştırma komutu sırasında aşağıdakiler gibi birkaç şey istenir:
- 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 süreci başlar. Bu süreçte Cloud Build şunları yapar:
- kaynağınızı zip'ler ve bir bulut depolama paketine kaydeder
- Resminizi oluşturmak için arka planda Cloud Native Computing Foundation buildpack'lerini kullanır.
- Ortaya çıkan kapsayıcı görüntüsünü depolamak için bir kayıt defteri oluşturur (henüz yoksa)
- Ayrıca, uygulamanızı barındırmak için bir Cloud Run hizmeti oluşturur (henüz yoksa).
Derleme ve dağıtım tamamlandıktan sonra, yeni bir düzeltmenin yayında olduğunu ve trafiğin% 100'ünü karşıladığını açıklayan bir mesaj alırsınız.
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:
- Cloud Build ile özel derleme adımları oluşturma
- Derleme tetikleyicileri oluşturma ve yönetme
- Cloud Build ardışık düzeninizde isteğ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 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ı
- App Engine hizmetlerinin paketini kaldırma 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
Bu eğitimle ilgili olabilecek online kaynakları aşağıda bulabilirsiniz:
App Engine
- App Engine belgeleri
- App Engine fiyatlandırma ve kota bilgileri
- Birinci ve ikinci nesil platformları karşılaştırma
- Eski çalışma zamanları için uzun süreli destek
Diğer Cloud bilgileri
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.