Alıştırma - Azure Uygulaması Hizmetinde JBoss EAP'ye Java EE (Jakarta EE) uygulaması dağıtma
Bu alıştırmada, Azure Uygulaması Hizmeti'nde JBoss EAP'ye bir Java EE (Jakarta EE) uygulaması dağıtacaksınız. Maven eklentisini kullanarak projeyi yapılandırabilir, uygulamayı derleyip dağıtabilir ve bir veri kaynağı yapılandırabilirsiniz.
Uygulamayı Azure Uygulaması Hizmeti için Maven Eklentisi ile yapılandırma
Şimdi Azure Uygulaması Hizmeti için Maven Eklentisi'nde yapılandırma hedefini yürüterek uygulamayı yapılandıralım.
./mvnw com.microsoft.azure:azure-webapp-maven-plugin:2.9.0:config
Önemli
MySQL sunucunuzun bölgesini değiştirirseniz, gecikme gecikmelerini en aza indirmek için Java EE uygulama sunucunuzun bölgesini de aynı bölgeye değiştirmeniz gerekir.
Komutta Java sürümü için Java 11 ve çalışma zamanı yığını için JBoss EAP 7'yi seçin.
Giriş öğesi | Değer |
---|---|
Available subscriptions: |
Your appropriate subsctioption |
Choose a Web Container Web App [\<create\>]: |
1: <create> |
Define value for OS [Linux]: |
Linux |
Define value for javaVersion [Java 17]: |
2: Java 11 |
Define value for runtimeStack: |
1: Jbosseap 7 |
Define value for pricingTier [P1v3]: |
P1v3 |
Confirm (Y/N) [Y]: |
Y |
Komutu çalıştırdıktan sonra terminalde aşağıdaki gibi iletiler alırsınız:
$ ./mvnw com.microsoft.azure:azure-webapp-maven-plugin:2.9.0:config
[INFO] Scanning for projects...
[INFO]
[INFO] ---------< com.microsoft.azure.samples:jakartaee-app-on-jboss >---------
[INFO] Building jakartaee-app-on-jboss 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- azure-webapp-maven-plugin:2.5.0:config (default-cli) @ jakartaee-app-on-jboss ---
[WARNING] The POM for com.microsoft.azure.applicationinsights.v2015_05_01:azure-mgmt-insights:jar:1.0.0-beta is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Auth type: OAUTH2
Username: YOUR_EMAIL_ADDRESS@microsoft.com
Available subscriptions:
[INFO] Subscription: YOUR_SUBSCRIPTION(********-****-****-****-************)
[INFO] It may take a few minutes to load all Java Web Apps, please be patient.
Web Container Web Apps in subscription Microsoft Azure Internal Billing-CDA:
* 1: <create>
2: jakartaee-app-on-jboss-yoshio (linux, jbosseap 7.2-java8)
Please choose a Web Container Web App [<create>]:
Define value for OS [Linux]:
* 1: Linux
2: Windows
3: Docker
Enter your choice:
Define value for javaVersion [Java 8]:
* 1: Java 8
2: Java 11
Enter your choice:
Define value for runtimeStack:
1: Jbosseap 7.2
2: Jbosseap 7
* 3: Tomcat 8.5
4: Tomcat 9.0
Enter your choice: 1
Define value for pricingTier [P1v3]:
1: P3v3
2: P2v3
* 3: P1v3
Enter your choice:
Please confirm webapp properties
Subscription Id : ********-****-****-****-************
AppName : jakartaee-app-on-jboss-1625038814881
ResourceGroup : jakartaee-app-on-jboss-1625038814881-rg
Region : westeurope
PricingTier : P1v3
OS : Linux
Java : Java 8
Web server stack: Jbosseap 7.2
Deploy to slot : false
Confirm (Y/N) [Y]:
[INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:43 min
[INFO] Finished at: 2021-06-30T16:40:47+09:00
[INFO] ------------------------------------------------------------------------
$
Komut tamamlandıktan sonra Maven pom.xml
dosyanıza aşağıdaki girişin eklendiğini görebilirsiniz.
<build>
<finalName>ROOT</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>2.9.0</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>jakartaee-app-on-jboss-1625038814881-rg</resourceGroup>
<appName>jakartaee-app-on-jboss-1625038814881</appName>
<pricingTier>P1v3</pricingTier>
<region>centralus</region>
<runtime>
<os>Linux</os>
<javaVersion>Java 11</javaVersion>
<webContainer>Jbosseap 7</webContainer>
</runtime>
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.war</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
</plugins>
</build>
Önemli
<region>
öğesini denetleyin. MySQL ile aynı yükleme konumu değilse, aynı konuma değiştirin.
Azure'a dağıtmak için yukarıdaki yapılandırmayı ekledikten sonra, başlangıç dosyasını dağıtmak için aşağıdaki XML girdilerini ekleyin. Kaynak<type>startup</type>
, belirtilen betiği 'ye /home/site/scripts/
(Linux) veya startup.cmd
(Windows) olarak startup.sh
dağıtır. Başlangıç betiğini aşağıdaki adımda yapılandıracağız.
<!-- Please add following lines -->
<resource>
<type>startup</type>
<directory>${project.basedir}/src/main/webapp/WEB-INF/</directory>
<includes>
<include>createMySQLDataSource.sh</include>
</includes>
</resource>
<!-- Please add following lines -->
Dekont
XML'de dağıtılacak aşağıdaki kaynağı belirtebilirsiniz:
type=<war|jar|ear|lib|startup|static|zip>
type=war
belirtilmezsepath
savaş dosyasını/home/site/wwwroot/app.war
dağıtacaktype=war&path=webapps/<appname>\
tam olarak /home/site/wwwroot/webapps/<appname adresine uygulama sıkıştırmasını açarak wardeploy gibi davranır>type=jar
, savaş dosyasını öğesine/home/site/wwwroot/app.jar
dağıtır.path
parametresi yoksayılacaktype=ear
, savaş dosyasını öğesine/home/site/wwwroot/app.ear
dağıtır.path
parametresi yoksayılacaktype=lib
jar dosyasını /home/site/libs adresine dağıtır.path
parametresi belirtilmelidirtype=static
betiği öğesine/home/site/scripts
dağıtır.path
parametresi belirtilmelidirtype=startup
betiğistartup.sh
olarak (Linux) veyastartup.cmd
(Windows) olarak/home/site/scripts/
dağıtır.path
parametresi yoksayılacaktype=zip
zip dosyasının sıkıştırmasını olarak/home/site/wwwroot
açar.path
parametresi isteğe bağlıdır.
Şimdi, yukarıdaki XML dosyasından kaynak grubu adı ve uygulama adı değerlerini denetleyin. Bu adları not edin veya ortam değişkenlerine daha iyi atayın.
<resourceGroup>jakartaee-app-on-jboss-1625038814881-rg</resourceGroup>
<appName>jakartaee-app-on-jboss-1625038814881</appName>
Bash kullanıyorsanız ortam değişkenlerini aşağıdaki komutla yapılandırın. Bu değerleri daha sonra kullanacaksınız.
export RESOURCEGROUP_NAME=jakartaee-app-on-jboss-1625038814881-rg
export WEBAPP_NAME=jakartaee-app-on-jboss-1625038814881
Java EE uygulamasını derleme ve derleme
Azure Uygulaması Hizmeti dağıtım ayarlarını yapılandırdıktan sonra kaynak kodu derleyin ve paketleyin.
./mvnw clean package
Terminalde aşağıdaki çıkış görüntülenir:
[INFO] Packaging webapp
[INFO] Assembling webapp [jakartaee-app-on-jboss] in [/private/tmp/mslearn-jakarta-ee-azure/target/ROOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/private/tmp/mslearn-jakarta-ee-azure/src/main/webapp]
[INFO] Webapp assembled in [369 msecs]
[INFO] Building war: /private/tmp/mslearn-jakarta-ee-azure/target/ROOT.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.656 s
[INFO] Finished at: 2023-03-04T12:35:43-05:00
[INFO] ------------------------------------------------------------------------
Java EE uygulamasını Azure Uygulaması Hizmetinde JBoss EAP'ye dağıtma
Kodu derleyip paketledikten sonra uygulamayı dağıtın:
./mvnw azure-webapp:deploy
Terminalde aşağıdaki ileti görüntülenir:
[INFO] Creating resource group jakartaee-app-on-jboss-1625038814881-rg in region westeurope...
[INFO] Successfully created resource group jakartaee-app-on-jboss-1625038814881-rg.
[INFO] Creating app service plan...
[INFO] Successfully created app service plan asp-jakartaee-app-on-jboss-1625038814881.
[INFO] Creating web app jakartaee-app-on-jboss-1625038814881...
[INFO] Successfully created Web App jakartaee-app-on-jboss-1625038814881.
[INFO] Trying to deploy artifact to jakartaee-app-on-jboss-1625038814881...
[INFO] Deploying (/private/tmp/mslearn-jakarta-ee-azure/target/ROOT.war)[war] ...
[INFO] Successfully deployed the artifact to https://jakartaee-app-on-jboss-1625038814881.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:11 min
[INFO] Finished at: 2023-03-04T12:38:39-05:00
[INFO] ------------------------------------------------------------------------
Dağıtılan uygulamanın URL'sine, özellikle Maven çıkışında aşağıdaki satıra dikkat edin:
[INFO] Successfully deployed the artifact to https://jakartaee-app-on-jboss-1625038814881.azurewebsites.net
Veritabanı bağlantısını yapılandırma
Örnek uygulama My SQL Veritabanı ve görüntüleme verilerinize bağlanır.
içindeki Maven proje yapılandırmasında pom.xml
MySQL JDBC sürücüsünü aşağıdaki gibi belirttik:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-jdbc-driver}</version>
</dependency>
Sonuç olarak, JBoss EAP JDBC sürücüsünü dağıtım paketinize (ROOT.war
) otomatik olarak yükler. MySQL JDBC sürücüsünün adına aşağıdaki gibi başvurabilirsiniz:
ROOT.war_com.mysql.cj.jdbc.Driver_8_0
JBoss EAP'de MySQL DataSource nesnesi oluşturma
MySQL için Azure Veritabanı erişmek için JBoss EAP'de nesnesini yapılandırmanız DataSource
ve kaynak kodunuzda JNDI adını belirtmeniz gerekir.
JBoss EAP'de bir MySQL DataSource
nesnesi oluşturmak için aşağıdaki başlangıç kabuğu betiğini oluşturduk. Betik dosyası dizinin altındadır createMySQLDataSource.sh
/WEB-INF
.
Dekont
Betikte, JBoss CLI komutunu kullanarak MySQL DataSource'ı bağlayacağız. bağlantı dizesi, kullanıcı adı ve parola, , MYSQL_USER
ve MYSQL_PASSWORD
ortam değişkenlerini MYSQL_CONNECTION_URL
kullanır.
Betik dosyasının kaynağı daha sonra gösterilir. Bu betik dosyası App Service'e zaten yüklenmiş, ancak henüz çağrılacak şekilde yapılandırılmamış.
#!/usr/bin/bash
# In order to use the variables in JBoss CLI scripts
# https://access.redhat.com/solutions/321513
#
sed -i -e "s|.*<resolve-parameter-values.*|<resolve-parameter-values>true</resolve-parameter-values>|g" /opt/eap/bin/jboss-cli.xml
/opt/eap/bin/jboss-cli.sh --connect <<EOF
data-source add --name=JPAWorldDataSourceDS \
--jndi-name=java:jboss/datasources/JPAWorldDataSource \
--connection-url=${MYSQL_CONNECTION_URL} \
--driver-name=ROOT.war_com.mysql.cj.jdbc.Driver_8_0 \
--user-name=${MYSQL_USER} \
--password=${MYSQL_PASSWORD} \
--min-pool-size=5 \
--max-pool-size=20 \
--blocking-timeout-wait-millis=5000 \
--enabled=true \
--driver-class=com.mysql.cj.jdbc.Driver \
--jta=true \
--use-java-context=true \
--valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker \
--exception-sorter-class-name=com.mysql.cj.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
exit
EOF
Şimdi App Service örneğinizi başlangıç betiğini çağıracak şekilde yapılandırın:
az webapp config set --startup-file '/home/site/scripts/startup.sh' \
-n ${WEBAPP_NAME} \
-g ${RESOURCEGROUP_NAME}
Betik çalıştırıldıktan sonra, uygulama sunucusu her yeniden başlatıldığında çağrılır.
Dekont
Dağıtım yapıtınız değilse ROOT.war
değerini de değiştirmeniz --driver-name=YOUR_ARTIFACT.war_com.mysql.cj.jdbc.Driver_8_0
gerekir.
MySQL'e bağlanmak için ortam değişkenlerini yapılandırma
Başlangıç betiğini yapılandırdıktan sonra App Service'i belirli ortam değişkenlerini kullanacak şekilde yapılandırın:
az webapp config appsettings set \
--resource-group ${RESOURCEGROUP_NAME} --name ${WEBAPP_NAME} \
--settings \
MYSQL_CONNECTION_URL='jdbc:mysql://mysqlserver-**********.mysql.database.azure.com:3306/world?useSSL=true&requireSSL=false' \
MYSQL_PASSWORD='************' \
MYSQL_USER=azureuser
Bahşiş
ve değerleri MYSQL_CONNECTION_URL
MYSQL_USER
MYSQL_PASSWORD
önceki üniteden ayarlanmıştır.
Koddaki DataSource başvuruyu onaylayın
Uygulamanızdan MySQL veritabanına erişmek için uygulama projenizde veri kaynağı başvurusunu yapılandırmanız gerekir. Java Kalıcılık API'sini (JPA) kullanarak veritabanı erişim kodunu uyguladık.
Başvuru yapılandırması DataSource
, JPA'nın persistence.xml
yapılandırma dosyası olan öğesine eklenmiştir.
Aşağıdaki dosyaya erişin:
├── src
│ ├── main
│ │ ├── resources
│ │ │ └── META-INF
│ │ │ └── persistence.xml
Adın DataSource
yapılandırmada kullanılan adla eşleşip eşleşmediğini denetleyin. Kod JNDI adını zaten olarak java:jboss/datasources/JPAWorldDataSource
oluşturmuştur:
<persistence-unit name="JPAWorldDatasourcePU" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/JPAWorldDataSource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
</persistence>
Ardından birim adında başvuruda bulunan PersistenceContext
MySQL veritabanına aşağıdaki gibi erişebilirsiniz:
@Transactional(REQUIRED)
@RequestScoped
public class CityService {
@PersistenceContext(unitName = "JPAWorldDatasourcePU")
EntityManager em;
Uygulamaya erişme
Örnek uygulamada üç REST uç noktası uyguladık. Uygulamaya erişebilir ve web tarayıcısı veya curl
komut kullanarak bu uç noktaları doğrulayabilirsiniz.
Uygulamaya erişmek için, önceki bir bölümden aldığınız uygulama URL'sine başvurmanız gerekir:
[INFO] Successfully deployed the artifact to
https://jakartaee-app-on-jboss-1606464084546.azurewebsites.net
Tüm kıta bilgilerini JSON biçiminde almak için aşağıdaki komutu çalıştırın.
$ curl https://${WEBAPP_NAME}.azurewebsites.net/area
["North America","Asia","Africa","Europe","South America","Oceania","Antarctica"]$
URL'de kıtayı belirtirseniz, belirtilen kıtadaki tüm ülkeleri/bölgeleri alabilirsiniz.
$ curl https://${WEBAPP_NAME}.azurewebsites.net/area/Asia | jq '.[] | { name: .name, code: .code }'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 16189 100 16189 0 0 65278 0 --:--:-- --:--:-- --:--:-- 65542
{
"name": "Afghanistan",
"code": "AFG"
}
{
"name": "United Arab Emirates",
"code": "ARE"
}
{
"name": "Armenia",
"code": "ARM"
}
{
"name": "Azerbaijan",
"code": "AZE"
}
{
"name": "Bangladesh",
"code": "BGD"
}
....
Son olarak, sonrasında /countries
bir ülke/bölge kodu belirtirseniz, ülke/bölge içinde nüfusu 1 milyondan büyük olan tüm şehirleri alabilirsiniz.
$ curl https://${WEBAPP_NAME}.azurewebsites.net/countries/JPN | jq '.[].name'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 788 100 788 0 0 2671 0 --:--:-- --:--:-- --:--:-- 2662
"Tokyo"
"Jokohama [Yokohama]"
"Osaka"
"Nagoya"
"Sapporo"
"Kioto"
"Kobe"
"Fukuoka"
"Kawasaki"
"Hiroshima"
"Kitakyushu"
Alıştırma özeti
Uygulama REST uç noktalarını doğrulayıp uygulamanızın MySQL veritabanınızdan veri alabildiğini test ettiniz.
Sonraki ünitede sunucu günlüklerini inceleyeceksiniz.