Настройка источников данных для приложения Tomcat, JBoss или Java SE в службе приложение Azure

В этой статье показано, как настроить источники данных в приложениях Java SE, Tomcat или JBoss в Службе приложений.

Служба приложений Azure запускает веб-приложения Java в трех типах в полностью управляемой службе:

  • Java Standard Edition (SE). Java SE может запускать приложение, развернутое в виде пакета JAR-файла Java, содержащего внедренный сервер, например Spring Boot, Quarkus, Dropwizard или приложение с внедренным сервером Tomcat или Jetty.
  • Tomcat. Встроенный сервер Tomcat может запускать приложение, развернутое как пакет веб-приложения (WAR).
  • Платформа корпоративных приложений JBoss (EAP): встроенный сервер JBoss EAP может запускать приложение, развернутое как пакет WAR или корпоративного архива (EAR). Этот параметр поддерживается для приложений Linux в наборе ценовых категорий, включая Бесплатный, Премиум версии 3 и Изолированный версии 2.

Замечание

JBoss EAP в службе приложений теперь поддерживает выставление счетов за использование собственной лицензии (BYOL). BYOL позволяет клиентам, имеющим подписки Red Hat, применять эти лицензии непосредственно к развертываниям JBoss EAP в Службе приложений Azure. Дополнительные сведения см. в разделе "Поддержка BYOL для JBoss EAP" в службе приложений.

Настройка источника данных

Чтобы подключиться к источникам данных в приложениях Spring Boot, мы рекомендуем создавать строки подключения и внедрять их в файл application.properties.

  1. На левой панели страницы службы приложений выберите Параметры>Переменные среды. На вкладке "Строки подключения" нажмите кнопку "Добавить". Задайте имя строки, вставьте строку подключения JDBC в поле "Значение " и задайте для параметра Typeзначение Custom. При необходимости можно задать строку подключения в качестве параметра слота.

    Строка подключения доступна вашему приложению в качестве переменной среды с именем CUSTOMCONNSTR_<your-string-name>. Например, CUSTOMCONNSTR_exampledb.

  2. В файле application.properties укажите строку подключения, используя имя переменной среды. В предыдущем примере используется следующий код:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Дополнительные сведения см. в документации Spring Boot по доступу к данным и внешней конфигурации.

Совет

Контейнеры Linux Tomcat могут автоматически настраивать общие источники данных на сервере Tomcat, если вы задаёте переменную среды WEBSITE_AUTOCONFIGURE_DATABASE на true. Единственное, что необходимо сделать, — добавить параметр приложения, содержащий допустимую строку подключения JDBC к базе данных Oracle, SQL Server, PostgreSQL или MySQL (включая учетные данные подключения). Служба приложений автоматически добавляет соответствующую общую базу данных в /usr/local/tomcat/conf/context.xml, используя соответствующий драйвер, доступный в контейнере. Комплексный сценарий, использующий этот подход, см. в руководстве по созданию веб-приложения Tomcat с помощью Службы приложений Azure в Linux и MySQL.

Эти инструкции применимы ко всем подключениям к базе данных. Необходимо заменить заполнители именем класса драйвера выбранной базы данных и JAR-файлом. В следующей таблице приведены имена классов и скачивание драйверов для общих баз данных.

База данных Имя класса драйвера Драйвер JDBC
PostgreSQL org.postgresql.Driver Скачать
MySQL com.mysql.jdbc.Driver Загрузите (Выберите Независимый от платформы.)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Скачать

Чтобы настроить Tomcat для использования подключения к базе данных Java (JDBC) или API сохраняемости Java (JPA), сначала настройте CATALINA_OPTS переменную среды, считываемую Tomcat при запуске. Установите это значение с помощью настройки приложения в плагине Maven App Service:

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

Или задайте переменную среды на вкладке "Параметры приложения" на странице "Параметры">"Переменные среды" на портале Azure.

Затем определите, должен ли источник данных быть доступен одному приложению или всем приложениям, работающим на сервлете Tomcat.

Источники данных уровня приложения

Чтобы настроить источник данных на уровне приложения, выполните следующие действия.

  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>
    

Общие ресурсы уровня сервера

Совет

Контейнеры Linux Tomcat могут автоматически применять XSLT-файлы с помощью следующего соглашения для файлов, скопированных в /home/site/wwwroot: Если server.xml.xsl или server.xml.xslt присутствует, файлы применяются на Tomcat server.xml. Если context.xml.xsl или context.xml.xslt присутствует, файлы применяются в Tomcat context.xml.

Добавление общего источника данных на уровне сервера требует редактирования Tomcat server.xml. Так как изменения файлов за пределами /home каталога являются временными, изменения файлов конфигурации Tomcat должны применяться программно, как показано ниже.

  • Отправьте скрипт запуска и задайте путь к скрипту вразделе "Конфигурация>". На вкладке "Параметры стека " добавьте путь в поле команды "Запуск ". Скрипт запуска можно отправить с помощью FTP.

Сценарий запуска выполняет преобразование XSL над файлом server.xml, а полученный XML-файл выводится в /usr/local/tomcat/conf/server.xml. Скрипт запуска должен установить libxslt или xlstproc, в зависимости от дистрибутива версии Tomcat для вашего веб-приложения, как указано в комментарии в следующем примере скрипта. Вы можете использовать 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>

Завершение конфигурации

Наконец, поместите драйверные JAR-файлы в класспас Tomcat и перезапустите приложение службы App Service.

  • Убедитесь, что файлы драйверов 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

Если вы создали источник данных на уровне сервера, перезапустите приложение Linux службы приложений. Tomcat сбрасывает CATALINA_BASE на /home/tomcat и использует обновленную конфигурацию.

Совет

По умолчанию контейнеры JBoss Linux могут автоматически настраивать общие источники данных на сервере JBoss. Единственное, что необходимо сделать, — добавить параметр приложения, содержащий допустимую строку подключения JDBC к базе данных Oracle, SQL Server, PostgreSQL или MySQL (включая учетные данные подключения), а также добавить переменную приложения или переменную WEBSITE_AUTOCONFIGURE_DATABASE среды со значением true. Также поддерживаются подключения JDBC, созданные с помощью коннектора сервиса. Служба приложений автоматически добавляет соответствующий общий источник данных (на основе имени параметра приложения и суффикса _DS), используя соответствующий драйвер, доступный в контейнере. Комплексный сценарий, использующий этот подход, см. в руководстве по созданию веб-приложения JBoss с помощью Службы приложений Azure в Linux и MySQL.

Существует три основных шага для регистрации источника данных в JBoss EAP:

  1. Отправьте драйвер JDBC.
  2. Добавьте драйвер JDBC в качестве модуля.
  3. Добавьте источник данных с помощью модуля.

Служба приложений — это служба размещения без сохранения состояния, поэтому необходимо поместить эти шаги в скрипт запуска и выполнять его при каждом запуске контейнера JBoss. Ниже приведены примеры PostgreSQL, MySQL и Базы данных SQL Azure:

Замечание

JBoss EAP в службе приложений поддерживает выставление счетов за использование собственной лицензии (BYOL). BYOL позволяет клиентам, имеющим подписки Red Hat, применять эти лицензии непосредственно к развертываниям JBoss EAP в Службе приложений Azure. Дополнительные сведения см. в разделе "Поддержка BYOL для JBoss EAP".

  1. Вставьте команды интерфейса командной строки JBoss в файл с именем jboss-cli-commands.cli. Команды JBoss должны добавить модуль и зарегистрировать его в качестве источника данных. В следующем примере показаны команды интерфейса командной строки JBoss для создания источника данных 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), которые необходимо добавить в Служба приложений в качестве параметров приложения. Скрипт добавляет их без флага --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
    

    Дополнительные сведения см. в разделе "Развертывание файлов в Служба приложений".

Чтобы подтвердить, что источник данных добавлен на сервер JBoss, выполните SSH-подключение к вашему веб-приложению и запустите $JBOSS_HOME/bin/jboss-cli.sh --connect. После подключения к JBoss'у выполните команду /subsystem=datasources:read-resource, чтобы вывести список источников данных.

В соответствии с определением в jboss-cli-commands.cli, вы можете получить доступ к подключению PostgreSQL, используя имя java:jboss/datasources/postgresDSJNDI.