Поделиться через


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

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

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

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

Замечание

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

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

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

  1. В разделе "Конфигурация" на странице Службы приложений установите имя для строки, вставьте строку подключения JDBC в поле "Значение" и установите тип на "Пользовательский". При необходимости можно задать эту строку подключения в качестве параметра слота.

    Эта строка подключения доступна для нашего приложения в виде переменной среды с именем 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 (включая учетные данные подключения), и App Service автоматически добавляет соответствующую базу данных в /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 Database Connectivity (JDBC) или Java Persistence API (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 должны применяться программно, как показано ниже.

  1. Отправьте скрипт запуска и задайте путь к скрипту в . Сценарий запуска можно добавить с помощью FTP.

Скрипт запуска выполняет преобразование XSL для файла server.xml и выводит полученный XML-файл в /usr/local/tomcat/conf/server.xml. Скрипт запуска должен устанавливать libxslt или xlstproc в зависимости от распространения версии Tomcat веб-приложения. Файл XSL и скрипт запуска можно отправить через FTP. Ниже приведен пример скрипта запуска.

# 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's 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, а затем перезапустите службу приложений.

  1. Убедитесь, что файлы драйверов 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 в качестве примеров:

Замечание

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

  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/postgresDS JNDI.

Посетите центр Azure для разработчиков Java, чтобы найти быстрые руководства по Azure, учебники и справочную документацию по Java.