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


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

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

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

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

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

Чтобы подключиться к источникам данных в приложениях 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. Единственное, что вам нужно сделать, — это добавить настройку приложения, содержащую допустимую строку подключения 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>
    

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

Добавление общего источника данных на уровне сервера требует редактирования server.xml Tomcat. Самый надежный способ сделать это следующим образом:

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

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

# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt

# 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 (включая учетные данные подключения), и Служба приложений автоматически добавит соответствующий общий источник данных, используя соответствующий драйвер, доступный в контейнере. Комплексный сценарий с помощью этого подхода см. в руководстве по созданию веб-приложения JBoss с помощью службы приложение Azure в Linux и MySQL.

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

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

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

  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.