Alıştırma - Azure Uygulaması Hizmetinde JBoss EAP'ye Java EE (Jakarta EE) uygulaması dağıtma

Tamamlandı

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=warbelirtilmezse path savaş dosyasını /home/site/wwwroot/app.war dağıtacak
    • type=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.jardağıtır. path parametresi yoksayılacak
    • type=ear , savaş dosyasını öğesine /home/site/wwwroot/app.eardağıtır. path parametresi yoksayılacak
    • type=lib jar dosyasını /home/site/libs adresine dağıtır. path parametresi belirtilmelidir
    • type=static betiği öğesine /home/site/scriptsdağıtır. path parametresi belirtilmelidir
    • type=startup betiği startup.sh olarak (Linux) veya startup.cmd (Windows) olarak /home/site/scripts/dağıtır. path parametresi yoksayılacak
    • type=zip zip dosyasının sıkıştırmasını olarak /home/site/wwwrootaç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.xmlMySQL 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_USERve MYSQL_PASSWORDortam değişkenlerini MYSQL_CONNECTION_URLkullanı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.wardeğ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_URLMYSQL_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.xmlyapı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/JPAWorldDataSourceoluş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.

Screenshot that shows area as the REST endpoint.

$ 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.

Screenshot that shows continent as the REST endpoint.

$ 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 /countriesbir ülke/bölge kodu belirtirseniz, ülke/bölge içinde nüfusu 1 milyondan büyük olan tüm şehirleri alabilirsiniz.

Screenshot that shows cities as the REST endpoint.

$ 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.