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'da statik web sitesi barındırma ve Hızlı Başlangıç: Azure depolama hesabını Azure CDN ile tümleştirme.
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.
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 herhangi bir kod içeriyorsa, bu bağımlılıkları kaldırmak için yeniden düzenlemeniz gerekir. Örneğin, dosya sistemi yollarının herhangi bir kullanımını veya \
uygulamanızın /
Windows üzerinde çalışıyorsa ile File.Separator
Paths.get
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ş
Not
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ı eklemek için Veri Kaynakları gibi server.xml 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.