Tomcat uygulamalarını Azure Container Apps'e geçirme

Bu kılavuzda, mevcut bir Tomcat uygulamasını Azure Container Apps'te (ACA) çalışacak şekilde geçirmek istediğinizde dikkat etmeniz gerekenler açıklanmaktadır.

Geçiş öncesi

Geçişin başarılı olduğundan emin olmak için, başlamadan önce aşağıdaki bölümlerde açıklanan değerlendirme ve envanter adımlarını tamamlayın.

Dış kaynakların envanterini çıkarma

Veri kaynakları ve JMS ileti aracıları gibi dış kaynaklar Java Adlandırma ve Dizin Arabirimi (JNDI) aracılığıyla eklenir. Bunlara benzer kaynakların geçirilmesi veya yeniden yapılandırılması gerekebilir.

Uygulamanızın içinde

META-INF/context.xml dosyasını inceleyin. <Context> öğesi içindeki <Resource> öğelerini arayın.

Uygulama sunucularında

$CATALINA_BASE/conf/context.xml ve $CATALINA_BASE/conf/server.xml dosyalarının yanı sıra $CATALINA_BASE/conf/[engine-name]/[host-name] dizinlerinde bulunan .xml dosyalarını da inceleyin.

context.xml dosyalarında JNDI kaynakları, üst düzey <Context> öğesindeki <Resource> öğesi tarafından açıklanır.

server.xml dosyalarında JNDI kaynakları, üst düzey <GlobalNamingResources> öğesindeki <Resource> öğesi tarafından açıklanır.

Veri kaynakları

Veri kaynakları, type özniteliği javax.sql.DataSource olarak ayarlanmış JNDI kaynaklarıdır. Aşağıdaki bilgileri her veri kaynağı için belgeleyin:

  • Veri kaynağının adı nedir?
  • Bağlantı havuzu yapılandırması nedir?
  • JDBC sürücüsü JAR dosyasını nerede bulabilirim?

Ek veri kaynağı yönergeleri için Tomcat belgelerindeki JNDI Veri Kaynağı, Nasıl Yapılır? sayfasına göz atın.

Diğer tüm dış kaynaklar

Bu kılavuzda olası tüm dış bağımlılıkları belgelemek uygulanabilir bir yöntem değildir. Geçişten sonra uygulamanızın tüm dış bağımlılıklarının karşılandığını doğrulamak ekibinizin sorumluluğundadır.

Gizli dizilerin envanterini çıkarma

Parolalar ve güveli dizeler

Üretim sunucularındaki tüm özellikleri ve yapılandırma dosyalarını gizli dizeler ve parolalar için denetleyin. $CATALINA_BASE/conf altındaki server.xml ve context.xml dosyalarını denetlediğinizden emin olun. Ayrıca uygulamanızın içinde parolalar ve kimlik bilgileri içeren yapılandırma dosyaları da bulabilirsiniz. Bunlar META-INF/context.xml dosyası ve Spring Boot uygulamaları için application.properties ile application.yml dosyaları olabilir.

Dosya sisteminin kullanılıp kullanılmayacağını ve nasıl kullanıldığını belirleme

Uygulama sunucusundaki dosya sisteminin her kullanımı yeniden yapılandırma veya nadir durumlarda mimari değişiklikleri gerektirir. Aşağıdaki senaryolardan birini veya tümünü belirleyebilirsiniz.

Salt okunur statik içerik

Uygulamanız şu anda statik içerik sunuyorsa bunun için alternatif bir konumunuz olması gerekir. Statik içeriği Azure Blob Depolama’ya taşımayı ve küresel olarak ışık hızında indirme işlemleri için Azure CDN eklemeyi düşünebilirsiniz. Daha fazla bilgi için bkz. Azure Depolama'de statik web sitesi barındırma ve Hızlı Başlangıç: Azure depolama hesabını Azure CDN ile tümleştirme. Statik içeriği Azure Spring Apps Enterprise planındaki bir uygulamaya doğrudan da dağıtabilirsiniz. Daha fazla bilgi için bkz . Web statik dosyalarını dağıtma.

Dinamik olarak yayımlanan statik içerik

Uygulamanız tarafından karşıya yüklenen/üretilen ama oluşturulduktan sonra sabit hale gelen statik içeriğe uygulamanızda izin veriliyorsa, karşıya yüklemeleri ve CDN yenilemesini işlemek için Azure İşlevi’yle birlikte yukarıda açıklandığı gibi Azure Blob Depolama ve Azure CDN kullanabilirsiniz. Azure İşlevleri ile statik içeriği karşıya yükleme ve CDN’ye önceden yükleme başlığı altında kullanımınıza ilişkin örnek bir uygulama sağladık. Statik içeriği Azure Spring Apps Enterprise planındaki bir uygulamaya doğrudan da dağıtabilirsiniz. Daha fazla bilgi için bkz . Web statik dosyalarını dağıtma.

Oturum kalıcılığı mekanizmasını tanımlama

Kullanımdaki oturum kalıcılığı yöneticisi tanımlamak için, uygulamanızdaki ve Tomcat yapılandırmasındaki context.xml dosyalarını inceleyin. <Manager> öğelerini bulun ve className özniteliğinin değerini not alın.

Tomcat'in StandardManager veya FileStore gibi yerleşik PersistentManager uygulamaları, ACA gibi dağıtılmış, ölçeklendirilmiş bir platformla kullanılmak üzere tasarlanmamıştır. ACA, çeşitli örnekler arasında yük dengeleme yapabilir ve herhangi bir zamanda herhangi bir örneği saydam olarak yeniden başlatabilir, bu nedenle dosya sisteminde değiştirilebilir durumun kalıcı olması önerilmez.

Oturum kalıcılığı gerekiyorsa, Redis Cache ile VMware Tanzu Oturum Yöneticisi gibi bir dış veri deposuna yazacak alternatif PersistentManager bir uygulama kullanmanız gerekir.

Özel durumlar

Bazı üretim senaryoları daha fazla değişiklik gerektirebilir veya daha fazla sınırlama uygulayabilir. Bu tür senaryolar seyrek olsa da, uygulamanıza uygulanamaz veya doğru çözümlendiklerinden emin olmak önemlidir.

Uygulamanızın zamanlanan işlere dayanıp dayanmadığını saptama

Quartz Scheduler görevleri veya cron işleri gibi zamanlanan işler kapsayıcılı hale getirilmiş Tomcat dağıtımlarıyla kullanılamaz. Uygulamanızın ölçeği genişletildiyse, zamanlanan işlerden biri zamanlama dönemi başına birden çok kez çalıştırılabilir. Bu durum istenmeyen sonuçlar doğurabilir.

Uygulama sunucusunun içindeki veya dışındaki tüm zamanlanan işlerin envanterini çıkarın.

Uygulamanızın işletim sistemine özgü kod içerip içermediğini saptama

Uygulamanız konak işletim sisteminde bağımlılıkları olan kod içeriyorsa, bunu yeniden düzenleyip söz konusu bağımlılıkları kaldırmanız gerekir. Örneğin dosya sistemi yollarındaki / veya \ kullanımlarını File.Separator veya Paths.get ile değiştirmeniz gerekebilir.

MemoryRealm’ın kullanılıp kullanılmadığını saptama

MemoryRealm kalıcı bir XML dosyası gerektirir. ACA'da bu dosyayı kapsayıcı görüntüsüne eklemeniz veya kapsayıcıların kullanımına sunulan paylaşılan depolama alanına yüklemeniz gerekir. (Daha fazla bilgi için bkz. Oturum kalıcılık mekanizmasını tanımlama bölümü.) Parametresinin pathName uygun şekilde değiştirilmesi gerekir.

MemoryRealm sınıfının şu anda kullanılıp kullanılmadığını saptamak için server.xml ile context.xml dosyalarınızı inceleyin ve className özniteliğinin org.apache.catalina.realm.MemoryRealm olarak ayarlandığı <Realm> öğelerini arayın.

Yerinde test etme

Kapsayıcı görüntüleri oluşturmadan önce uygulamanızı ACA'da kullanmayı düşündüğünüz JDK ve Tomcat'e geçirin. Uyumluluk ve performanstan emin olmak için uygulamanızı kapsamlı olarak test edin.

Yapılandırmayı parametreleştirme

Büyük olasılıkla geçiş öncesinde server.xml ve context.xml dosyalarında gizli dizileri ve veri kaynakları gibi dış bağımlılıkları tanımlamış olmalısınız. Tanımlanan her öğe için kullanıcı adı, parola, bağlantı dizesi veya URL’leri bir ortam değişkeniyle değiştirin.

Örneğin context.xml dosyasının aşağıdaki öğeyi içerdiğini düşünün:

<Resource
    name="jdbc/dbconnection"
    type="javax.sql.DataSource"
    url="jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true"
    driverClassName="org.postgresql.Driver"
    username="postgres"
    password="t00secure2gue$$"
/>

Bu durumda aşağıdaki örnekte gösterildiği gibi değiştirebilirsiniz:

<Resource
    name="jdbc/dbconnection"
    type="javax.sql.DataSource"
    url="${postgresdb.connectionString}"
    driverClassName="org.postgresql.Driver"
    username="${postgresdb.username}"
    password="${postgresdb.password}"
/>

Geçiş

Dekont

Bazı Tomcat dağıtımlarında tek bir Tomcat sunucusunda birden çok uygulama bulunabilir. Sizin dağıtımınızda da böyle bir durum söz konusuysa, her uygulamayı ayrı podda çalıştırmanızı kesinlikle öneririz. Bu sayede hem her uygulama için kaynak kullanımını iyileştirebilir, hem de karmaşıklığı ve ilişkilendirmeyi en aza indirebilirsiniz.

Dağıtım yapıtlarını hazırlama

Kapsayıcılar üzerinde Tomcat Hızlı Başlangıç GitHub deposunu kopyalayın. Bu depo, birçok önerilen iyileştirmeye sahip bir Dockerfile ve Tomcat yapılandırma dosyaları içerir. Aşağıdaki adımlarda, kapsayıcı görüntüsünü derlemeden ve ACA'ya dağıtmadan önce büyük olasılıkla bu dosyalarda yapmanız gereken değişiklikleri özetleyeceğiz.

JNDI kaynaklarını ekleme

Aşağıdaki örnekte gösterildiği gibi, geçiş öncesi adımlarda hazırladığınız kaynakları (veri kaynakları gibi) eklemek için server.xml dosyasını düzenleyin:

<!-- Global JNDI resources
      Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml"
               />

    <!-- Migrated datasources here: -->
    <Resource
        name="jdbc/dbconnection"
        type="javax.sql.DataSource"
        url="${postgresdb.connectionString}"
        driverClassName="org.postgresql.Driver"
        username="${postgresdb.username}"
        password="${postgresdb.password}"
    />
    <!-- End of migrated datasources -->
</GlobalNamingResources>

Ek veri kaynağı yönergeleri için Tomcat belgelerindeki JNDI Veri Kaynağı, Nasıl Yapılır? sayfasının şu bölümlerine göz atın:

Görüntüyü derleme ve gönderme

ACA tarafından kullanılmak üzere görüntüyü derlemenin ve Azure Container Registry'ye (ACR) yüklemenin az acr build en basit yolu komutunu kullanmaktır. Bu komut için bilgisayarınızda Docker’ın yüklü olması gerekmez. Örneğin, geçerli dizinde tomcat-container-quickstart deposundan Dockerfile ve petclinic.war uygulama paketine sahipseniz, aşağıdaki komutla ACR'de kapsayıcı görüntüsünü oluşturabilirsiniz:

az acr build \
    --registry $acrName \
    --image "${acrName}.azurecr.io/petclinic:{{.Run.ID}}" 
    --build-arg APP_FILE=petclinic.war \
    --build-arg SERVER_XML=prod.server.xml .

WAR dosyanız ROOT.war olarak adlandırılmışsa --build-arg APP_FILE... parametresini atlayabilirsiniz. Sunucu XML dosyanız server.xml olarak adlandırılmışsa --build-arg SERVER_XML... parametresini atlayabilirsiniz. Her iki dosya da Dockerfile ile aynı dizinde yer almalıdır.

Alternatif olarak, aşağıdaki komutları kullanarak görüntüyü yerel olarak oluşturmak için Docker CLI kullanabilirsiniz. Bu yaklaşım ACR’ye ilk dağıtımdan önce görüntünün test edilmesini ve geliştirilmesini basitleştirebilir. Öte yandan Docker CLI’nın yüklenmiş ve Docker daemon’ın çalışıyor olmasını gerektirir.

# Build the image locally.
sudo docker build . --build-arg APP_FILE=petclinic.war -t "${acrName}.azurecr.io/petclinic:1"

# Run the image locally.
sudo docker run -d -p 8080:8080 "${acrName}.azurecr.io/petclinic:1"

# You can now access your application with a browser at http://localhost:8080.

# Sign in to ACR.
sudo az acr login --name $acrName

# Push the image to ACR.
sudo docker push "${acrName}.azurecr.io/petclinic:1"

Daha fazla bilgi için bkz . Azure Container Registry ile kapsayıcı görüntüleri oluşturma ve depolama.

Azure Container Apps'e dağıtma

Aşağıdaki komut örnek bir dağıtımı gösterir:

az containerapp create \
    --resource-group <RESOURCE_GROUP> \
    --name <APP_NAME> \
    --environment <ENVIRONMENT_NAME> \
    --image <IMAGE_NAME> \
    --target-port 8080 \
    --ingress 'external' \
    --registry-server <REGISTRY_SERVER> \
    --min-replicas 1

Daha ayrıntılı bir hızlı başlangıç için bkz . Hızlı Başlangıç: İlk kapsayıcı uygulamanızı dağıtma.

Geçiş sonrası

Uygulamanızı ACA'ya geçirdiğinizden, beklediğiniz gibi çalıştığını doğrulamanız gerekir. Bunu yaptıktan sonra uygulamanızı daha bulutta yerel hale getirmenizi sağlayabilecek bazı önerilerimiz var.

Öneriler

  • İş sürekliliği ve olağanüstü durum kurtarma stratejisini tasarlayın ve uygulayın. Görev açısından kritik uygulamalar için çok bölgeli dağıtım mimarisi uygulamayı düşünebilirsiniz. Daha fazla bilgi için bkz . Azure Kubernetes Service'te (AKS) iş sürekliliği ve olağanüstü durum kurtarma için en iyi yöntemler.

  • logging.properties dosyasındaki öğeleri değerlendirin. Performansı geliştirmek için günlük çıkışından bir bölümünü ortadan kaldırmayı veya azaltmayı düşünün.

  • Performansı daha iyi hale getirmek için JAVA_OPTS kod önbelleği boyutunu izlemeyi ve dockerfile içindeki parametreleri -XX:InitialCodeCacheSize ve -XX:ReservedCodeCacheSize değişkeni eklemeyi göz önünde bulundurun. Daha fazla bilgi edinmek için Oracle belgelerinde Kod önbelleğini ayarlama bölümüne bakın.

  • Sapkıcı koşulları hızla algılamak ve ele almak için Azure İzleyici uyarı kuralları ve eylem grupları eklemeyi göz önünde bulundurun.

  • Daha düşük gecikme süresi ve daha yüksek güvenilirlik ve hataya dayanıklılık için Azure Container Apps dağıtımını başka bir bölgede çoğaltmayı göz önünde bulundurun. Dağıtımlar arasında yük dengelemesi yapmak için Azure Traffic Manager'ı kullanın veya Azure Front Door kullanarak SSL boşaltma ve DDoS korumasıyla Web Uygulaması Güvenlik Duvarı ekleyin.

  • Coğrafi çoğaltma gerekli değilse, DDoS korumasıyla SSL boşaltma ve Web Uygulaması Güvenlik Duvarı eklemek için bir Azure Uygulaması Lication Gateway eklemeyi göz önünde bulundurun.