تكوين مصادر البيانات لتطبيق Tomcat أو JBoss أو Java SE في Azure App Service

توضح هذه المقالة كيفية تكوين مصادر البيانات في تطبيق Java SE أو Tomcat أو JBoss في App Service.

تقوم Azure App Service بتشغيل تطبيقات الويب في جافا بثلاثة أنواع على خدمة مدارة بالكامل:

  • النسخة القياسية من جافا (SE). يمكن لجافا SE تشغيل تطبيق منشور كحزمة أرشيف جافا (JAR) تحتوي على خادم مدمج، مثل Spring Boot أو Quarkus أو Dropwizard أو تطبيق يحتوي على خادم Tomcat أو Jetty مدمج.
  • تومكات. يمكن لخادم تومكات المدمج تشغيل تطبيق منشور كحزمة أرشيف تطبيقات ويب (WAR).
  • JBoss Enterprise Application Platform (EAP): يمكن لخادم JBoss EAP المضمن تشغيل تطبيق تم نشره كحزمة WAR أو أرشيف المؤسسة (EAR). يدعم هذا الخيار لتطبيقات لينكس بمجموعة من مستويات التسعير التي تشمل Free وPremium v3 وIsolated v2.

Note

يدعم JBoss EAP على خدمة التطبيقات الآن فوترة Bring Your Own License (BYOL). تمكن BYOL العملاء الذين لديهم اشتراكات قائمة في Red Hat من تطبيق تلك التراخيص مباشرة على نشرات JBoss EAP الخاصة بهم على خدمة تطبيقات Azure. لمزيد من المعلومات، راجع دعم BYOL ل JBoss EAP على خدمة التطبيقات.

تكوين مصدر البيانات

للاتصال بمصادر البيانات في تطبيقات Spring Boot، نقترح إنشاء سلاسل اتصال وتضمينها في ملف application.properties الموجود لديك.

  1. في اللوحة اليسرى من صفحة خدمة التطبيقات، اختر إعدادات>بيئة المتغيرات (settings Environment). في تبويب سلاسل الاتصال ، اختر الإضافة. حدد اسما للسلسلة، والصق سلسلة اتصال JDBC الخاصة بك في حقل القيمة ، وقم بتعيين النوع على مخصص. يمكنك اختيار سلسلة الاتصال كإعداد فتحة.

    سلسلة الاتصال متاحة لتطبيقك كمتغير بيئي يسمى CUSTOMCONNSTR_<your-string-name>. على سبيل المثال، CUSTOMCONNSTR_exampledb

  2. في ملف application.properties ، راجع إلى سلسلة الاتصال باستخدام اسم متغير البيئة. في المثال السابق، ستستخدم هذا الكود:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

لمزيد من المعلومات، راجع وثائق Spring Boot حول الوصول إلى البياناتوالتكوين الخارجي.

تلميح

يمكن لحاويات Tomcat في لينكس تكوين مصادر البيانات المشتركة تلقائيا في خادم Tomcat إذا قمت بتعيين متغير WEBSITE_AUTOCONFIGURE_DATABASE البيئة على true. الشيء الوحيد الذي يمكنك فعله هو إضافة إعداد تطبيق يحتوي على سلسلة اتصال JDBC صالحة إلى قاعدة بيانات Oracle، SQL Server، PostgreSQL، أو MySQL (بما في ذلك بيانات الاتصال). تضيف خدمة التطبيقات تلقائيا قاعدة البيانات المشتركة المقابلة إلى /usr/local/tomcat/conf/context.xml، باستخدام برنامج تشغيل مناسب متوفر في الحاوية. لسيناريو شامل يستخدم هذا النهج، راجع الدرس: بناء تطبيق ويب على Tomcat باستخدام Azure App Service على لينكس وMySQL.

تنطبق هذه الإرشادات على جميع اتصالات قاعدة البيانات. تحتاج إلى استبدال الرموز المؤقتة باسم فئة السائق وملف JAR الخاص بقاعدة البيانات التي اخترتها. يوفر الجدول التالي أسماء الفئات وتنزيلات التعريفات لقواعد البيانات الشائعة.

قاعدة البيانات اسم فئة السائق سائق JDBC
PostgreSQL org.postgresql.Driver تنزيل
MySQL com.mysql.jdbc.Driver تحميل (اختر المنصة المستقلة.)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver تنزيل

لتكوين تومكات لاستخدام اتصال قاعدة بيانات جافا (JDBC) أو واجهة برمجة تطبيقات جافا للاستمرارية (JPA)، قم أولا بتخصيص CATALINA_OPTS متغير البيئة الذي يقرأه تومكات عند بدء التشغيل. حدد هذه القيمة باستخدام إعداد تطبيق في إضافة App Service Maven:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

أو قم بتعيين متغير البيئة في تبويب إعدادات التطبيق في صفحةمتغيرات البيئة> بوابة Azure.

بعد ذلك، حدد ما إذا كان يجب أن يكون مصدر البيانات متاحا لتطبيق واحد أو لجميع التطبيقات التي تعمل على خادم تومكات.

مصادر البيانات على مستوى التطبيق

لتكوين مصدر بيانات على مستوى التطبيق:

  1. أنشئ ملف context.xml في دليل META-INF/ لمشروعك. إنشاء الدليل META-INF/ إذا لم يكن موجودا.

  2. في context.xml، أضف عنصر Context لربط مصدر البيانات بعنوان JNDI. استبدل الاسم driverClassName المؤقت باسم فئة السائق من الجدول الذي ظهر سابقا في هذا المقال.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. حدّث web.xml لتطبيقك حتى تتمكن من استخدام مصدر البيانات في تطبيقك.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

الموارد المشتركة على مستوى الخادم

تلميح

يمكن لحاويات تومكات في لينكس تطبيق ملفات XSLT تلقائيا باستخدام الاتفاقية التالية للملفات المنسوخة إلى /home/site/wwwroot: إذا server.xml.xsl كان أو server.xml.xslt موجودا، يتم تطبيق الملفات على ملفات تومكات server.xml. إذا context.xml.xsl كان موجودا أو context.xml.xslt موجودا، يتم تطبيق الملفات على ملفات تومكات context.xml.

تتطلب إضافة مصدر بيانات مشترك على مستوى الخادم تحرير Tomcat.server.xml نظرا لأن تغييرات الملفات خارج الدليل /home سريعة الزوال ، يجب تطبيق التغييرات على ملفات تكوين Tomcat برمجيا ، على النحو التالي:

  • قم بتحميل سكريبت بدء التشغيل وضبط المسار إلى السكربت في>إعدادات الإعدادات. في تبويب إعدادات المكدس ، أضف المسار في صندوق أوامر بدء التشغيل . يمكنك رفع سكريبت بدء التشغيل باستخدام FTP.

يقوم سكريبت بدء التشغيل الخاص بك بتحويل XSL إلى server.xml الملف ويخرج ملف XML الناتج إلى /usr/local/tomcat/conf/server.xml. يجب libxslt تثبيت سكريبت بدء التشغيل أو xlstproc، اعتمادا على توزيع إصدار تومكات من تطبيق الويب الخاص بك، كما هو مذكور في التعليق في السكربت المثال التالي. يمكنك استخدام FTP لرفع ملف XSL وسكريبت بدء التشغيل.

# Install the libxslt package on Alpine-based images:
apk add --update libxslt

# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc

# Also copy the transform file to /home/tomcat/conf/
# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

يضيف ملف XSL المثال التالي عقدة موصل جديدة إلى server.xml Tomcat.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing connector if there is one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first engine if there's no existing connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

إنهاء التكوين

وأخيرا، ضع JARs للسائقين في مسار الصف الخاص بتومكات وأعد تشغيل تطبيق خدمة التطبيقات.

  • تأكد من أن ملفات برنامج تشغيل JDBC متوفرة لمحمل فئة Tomcat عن طريق وضعها في الدليل /home/site/lib . في Cloud Shell، قم بتشغيل az webapp deploy --type=lib لكل برنامج تشغيل JAR:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

إذا كنت قد أنشئت مصدر بيانات على مستوى الخادم، فأعد تشغيل تطبيق App Service Linux. يقوم Tomcat بإعادة CATALINA_BASE/home/tomcat تعيين التكوين المحدث واستخدامه.

تلميح

بشكل افتراضي، يمكن لحاويات JBoss في لينكس تكوين مصادر البيانات المشتركة تلقائيا في خادم JBoss. الشيء الوحيد الذي تحتاجه هو إضافة إعداد تطبيق يحتوي على سلسلة اتصال JDBC صالحة إلى قاعدة بيانات أوراكل، SQL سيرفر، PostgreSQL، أو MySQL (بما في ذلك بيانات الاتصال)، وإضافة متغير WEBSITE_AUTOCONFIGURE_DATABASE إعداد التطبيق / البيئة مع القيمة true. كما يتم دعم اتصالات JDBC التي يتم إنشاؤها بواسطة موصل الخدمة. تضيف خدمة التطبيقات تلقائيا مصدر البيانات المشترك المقابل (بناء على اسم إعداد التطبيق واللاحقة _DS)، باستخدام برنامج تشغيل مناسب متوفر في الحاوية. لسيناريو شامل يستخدم هذا النهج، راجع التعليم: بناء تطبيق ويب JBoss باستخدام Azure App Service على لينكس وMySQL.

هناك ثلاث خطوات رئيسية لتسجيل مصدر البيانات لدى JBoss EAP:

  1. تحميل برنامج تشغيل JDBC.
  2. أضف برنامج تشغيل JDBC كوحدة نمطية.
  3. إضافة مصدر بيانات باستخدام الوحدة النمطية.

App Service هي خدمة استضافة بدون حالة، لذا تحتاج إلى إدخال هذه الخطوات في سكريبت بدء التشغيل وتشغيله في كل مرة يبدأ فيها حاوية JBoss. إليك أمثلة على قاعدة بيانات PostgreSQL وMySQL وAzure SQL:

Note

يدعم JBoss EAP على خدمة التطبيقات فوترة Bring Your Own License (BYOL). تمكن BYOL العملاء الذين لديهم اشتراكات قائمة في Red Hat من تطبيق تلك التراخيص مباشرة على نشرات JBoss EAP الخاصة بهم على خدمة تطبيقات Azure. لمزيد من المعلومات، راجع دعم BYOL ل JBoss EAP.

  1. ضع أوامر JBoss CLI في ملف يسمى jboss-cli-commands.cli. يجب أن تضيف أوامر JBoss الوحدة النمطية وتسجلها باعتبارها مصدراً للبيانات. يوضح المثال التالي أوامر JBoss CLI لإنشاء مصدر بيانات PostgreSQL باسم java:jboss/datasources/postgresDSJNDI .

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    لاحظ أن module add الأمر يستخدم ثلاثة متغيرات بيئة (DB_HOSTو DB_USERNAMEو DB_PASSWORD)، والتي يجب عليك إضافتها في App Service كإعدادات تطبيق. يضيفها البرنامج النصي بدون العلامة --resolve-parameter-values بحيث لا يحفظ JBoss قيمها في نص عادي.

  2. إنشاء برنامج نصي لبدء التشغيل، startup.sh، يستدعي أوامر JBoss CLI. المثال التالي يوضح كيفية استدعاء ملف jboss-cli-commands.cli الخاص بك. لاحقا، تقوم بتكوين خدمة التطبيقات لتشغيل هذا السكريبت عند بدء الحاوية.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss-cli-commands.cli
    
  3. باستخدام خيار نشر من اختيارك، قم بتحميل برنامج تشغيل JDBC الخاص بك، jboss-cli-commands.cli، startup.sh إلى المسارات المحددة في البرامج النصية المعنية. ارفع startup.sh كملف بدء تشغيل. على سبيل المثال:

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss-cli-commands.cli --target-path /home/site/scripts/jboss-cli-commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    لمزيد من المعلومات، راجع نشر الملفات إلى App Service.

للتأكد من أن مصدر البيانات أضيف إلى خادم JBoss، قم بتشغيل SSH في تطبيق الويب الخاص بك وتشغيل $JBOSS_HOME/bin/jboss-cli.sh --connect. بعد أن تتصل ب JBoss، قم /subsystem=datasources:read-resource بطباعة قائمة بمصادر البيانات.

وفقا للتعريف في jboss-cli-commands.cli، يمكنك الوصول إلى اتصال PostgreSQL باستخدام اسم java:jboss/datasources/postgresDSJNDI .