Configurar fontes de dados para um aplicativo Tomcat, JBoss ou Java SE no Serviço de Aplicativo do Azure

Este artigo mostra como configurar fontes de dados em um aplicativo Java SE, Tomcat ou JBoss no Serviço de Aplicativo.

O Serviço de Aplicativo do Azure executa aplicativos Web Java em três tipos em um serviço totalmente gerenciado:

  • Java Standard Edition (SE). O Java SE pode executar um aplicativo implantado como um pacote jar (arquivo java) que contém um servidor inserido, como Spring Boot, Quarkus, Dropwizard ou um aplicativo com um servidor Tomcat ou Jetty inserido.
  • Tomcat. O servidor Tomcat interno pode executar um aplicativo implantado em um arquivo WAR (Web Application Archive).
  • JBoss EAP (Enterprise Application Platform) – O servidor do JBoss EAP interno pode executar um aplicativo implantado como um pacote WAR ou EAR (Enterprise Archive). Essa opção tem suporte para aplicativos Linux em um conjunto de tipos de preços que incluem Gratuito, Premium v3 e Isolado v2.

Observação

O JBoss EAP no App Service agora suporta a cobrança BYOL (Bring Your Own License - Traga Sua Própria Licença). A BYOL permite que os clientes que têm assinaturas existentes do Red Hat apliquem essas licenças diretamente às implantações do JBoss EAP no Serviço de Aplicativo do Azure. Para obter mais informações, consulte Suporte BYOL para JBoss EAP no Serviço de Aplicativo.

Configurar a fonte de dados

Para conectar-se a fontes de dados nos aplicativos Spring Boot, sugerimos criar cadeias de conexão e injetá-las no arquivo application.properties.

  1. No painel esquerdo da página de Serviço de Aplicativo, selecione Configurações>Variáveis de Ambiente. Na guia Cadeias de conexão , selecione Adicionar. Defina um nome para a cadeia de caracteres, cole a cadeia de conexão JDBC no campo Valor e defina o Tipo como Personalizado. Opcionalmente, você pode definir a cadeia de conexão como uma configuração de slot.

    A cadeia de conexão é acessível ao seu aplicativo como uma variável de ambiente chamada CUSTOMCONNSTR_<your-string-name>. Por exemplo, CUSTOMCONNSTR_exampledb.

  2. No arquivo application.properties , faça referência à cadeia de conexão com o nome da variável de ambiente. Para o exemplo anterior, você usaria este código:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Para obter mais informações, consulte a documentação do Spring Boot sobre acesso a dados e configuração externalizada.

Dica

Os contêineres Tomcat do Linux poderão configurar automaticamente fontes de dados compartilhadas no servidor Tomcat se você definir a variável WEBSITE_AUTOCONFIGURE_DATABASE de ambiente como true. A única coisa a fazer é adicionar uma configuração de aplicativo que contenha uma cadeia de conexão JDBC válida a um banco de dados Oracle, SQL Server, PostgreSQL ou MySQL (incluindo as credenciais de conexão). O Serviço de Aplicativo adiciona automaticamente o banco de dados compartilhado correspondente a /usr/local/tomcat/conf/context.xml, usando um driver apropriado disponível no contêiner. Para obter um cenário de ponta a ponta que usa essa abordagem, consulte Tutorial: Criar um aplicativo Web Tomcat com o Serviço de Aplicativo do Azure em Linux e MySQL.

Essas instruções se aplicam a todas as conexões de banco de dados. Você precisa substituir os marcadores de posição pelo nome da classe do driver do banco de dados escolhido e pelo arquivo JAR. A tabela a seguir fornece nomes de classes e downloads de drivers para bancos de dados comuns.

Banco de dados Nome da classe de driver Driver JDBC
PostgreSQL org.postgresql.Driver Baixar
MySQL com.mysql.jdbc.Driver Baixar (Selecionar Plataforma Independente.)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Baixar

Para configurar o Tomcat para usar a JDBC (Conectividade de Banco de Dados Java) ou a JPA (API de Persistência java), primeiro personalize a CATALINA_OPTS variável de ambiente lida pelo Tomcat na inicialização. Defina esse valor usando uma configuração de aplicativo no plugin Maven do App Service:

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

Ou defina a variável de ambiente na guia Configurações do aplicativo da página de Configurações>Variáveis de Ambiente no portal do Azure.

Em seguida, determine se a fonte de dados deve estar disponível para um aplicativo ou para todos os aplicativos em execução no servlet Tomcat.

Fontes de dados no nível do aplicativo

Para configurar uma fonte de dados no nível do aplicativo:

  1. Crie um arquivo context.xml no diretório META-INF/ do seu projeto. Crie o diretório META-INF/ se ele não existir.

  2. Em context.xml, adicione um elemento Context para vincular a fonte de dados a um endereço JNDI. Substitua o driverClassName marcador de posição pelo nome da classe do driver da tabela mencionada anteriormente neste artigo.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Atualize o web.xml do aplicativo para usar a fonte de dados no aplicativo.

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

Recursos compartilhados no nível do servidor

Dica

Os contêineres Tomcat do Linux podem aplicar automaticamente arquivos XSLT usando a seguinte convenção para arquivos copiados para /home/site/wwwroot: Se server.xml.xsl ou server.xml.xslt estiver presente, os arquivos serão aplicados ao Tomcat's server.xml. Se context.xml.xsl ou context.xml.xslt estiverem presentes, os arquivos serão aplicados ao context.xml do Tomcat.

A adição de uma fonte de dados compartilhada no nível do servidor exige que você edite o Tomcat's server.xml. Como as alterações de arquivo fora do /home diretório são efêmeras, as alterações nos arquivos de configuração do Tomcat precisam ser aplicadas programaticamente, da seguinte maneira:

  • Carregue um script de inicialização e defina o caminho para o script em Configurações>Configuração. Na guia Configurações de pilha, adicione o caminho na caixa Comando de Inicialização. Você pode carregar o script de inicialização usando FTP.

Seu script de inicialização faz uma transformação XSL no server.xml arquivo e gera o arquivo XML resultante para /usr/local/tomcat/conf/server.xml. O script de inicialização deve ser instalado libxslt ou xlstproc, dependendo da distribuição da versão do Tomcat do seu aplicativo Web, conforme observado no comentário no script de exemplo a seguir. Você pode usar FTP para carregar o arquivo XSL e o script de inicialização.

# 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

O seguinte arquivo XSL de exemplo adiciona um novo nó de conector ao server.xml do 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>

Finalizar a configuração

Por fim, coloque os JARs do driver no classpath do Tomcat e reinicie seu aplicativo App Service.

  • Garanta que os arquivos do driver JDBC estão disponíveis para o carregador de classes do Tomcat colocando-os no diretório /home/site/lib. No Cloud Shell, execute o comando az webapp deploy --type=lib para cada JAR de driver:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Se você criou uma fonte de dados no nível do servidor, reinicie o aplicativo App Service do Linux. O Tomcat redefine CATALINA_BASE para /home/tomcat e usa a configuração atualizada.

Dica

Por padrão, os contêineres JBoss do Linux podem configurar automaticamente fontes de dados compartilhadas no servidor JBoss. A única coisa que você precisa fazer é adicionar uma configuração de aplicativo que contenha uma cadeia de conexão JDBC válida a um Banco de Dados Oracle, SQL Server, PostgreSQL ou MySQL (incluindo as credenciais de conexão) e adicionar a configuração do aplicativo/variável WEBSITE_AUTOCONFIGURE_DATABASE de ambiente com o valor true. Há suporte também para conexões JDBC criadas usando o conector de serviço. O Serviço de Aplicativo adiciona automaticamente a fonte de dados compartilhada correspondente (com base no nome da configuração do aplicativo e no sufixo _DS), usando um driver apropriado disponível no contêiner. Para obter um cenário de ponta a ponta que usa essa abordagem, consulte Tutorial: Criar um aplicativo Web JBoss com o Serviço de Aplicativo do Azure em Linux e MySQL.

Há três etapas principais para registrar uma fonte de dados com o JBoss EAP:

  1. Carregar o driver JDBC.
  2. Adicionar o driver JDBC como um módulo.
  3. Adicionar uma fonte de dados usando o módulo.

O Serviço de Aplicativo é um serviço de hospedagem sem estado, portanto, você precisa colocar essas etapas em um script de inicialização e executá-lo sempre que o contêiner JBoss for iniciado. Aqui estão exemplos de Banco de Dados SQL do PostgreSQL, MySQL e Azure:

Observação

O JBoss EAP no Serviço de Aplicações oferece suporte à cobrança BYOL (Traga Sua Própria Licença). A BYOL permite que os clientes que têm assinaturas existentes do Red Hat apliquem essas licenças diretamente às implantações do JBoss EAP no Serviço de Aplicativo do Azure. Para obter mais informações, consulte Suporte BYOL para JBoss EAP.

  1. Coloque os comandos da CLI do JBoss em um arquivo chamado jboss-cli-commands.cli. Os comandos do JBoss devem adicionar o módulo e registrá-lo como fonte de dados. O exemplo a seguir mostra os comandos da CLI do JBoss para criar uma fonte de dados PostgreSQL com o nome JNDI java:jboss/datasources/postgresDS.

    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
    

    Observe que o comando module add usa três variáveis de ambiente (DB_HOST, DB_USERNAME e DB_PASSWORD), que você precisa adicionar no Serviço de Aplicativo como configurações de aplicativo. O script os adiciona sem o sinalizador --resolve-parameter-values para que o JBoss não salve seus valores em texto não criptografado.

  2. Crie um script de inicialização, startup.sh, que chama os comandos da CLI do JBoss. O exemplo a seguir mostra como chamar o arquivo jboss-cli-commands.cli . Posteriormente, você configurará o Serviço de Aplicativo para executar esse script quando o contêiner for iniciado.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss-cli-commands.cli
    
  3. Use a opção de implantação da sua escolha para carregar o driver JDBC, jboss-cli-commands.cli e startup.sh nos caminhos especificados nos scripts correspondentes. Carregue startup.sh como um arquivo de inicialização. Por exemplo:

    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
    

    Para obter mais informações, consulte Implantar arquivos no Serviço de Aplicativo.

Para confirmar se a fonte de dados foi adicionada ao servidor JBoss, acesse seu aplicativo Web via SSH e execute $JBOSS_HOME/bin/jboss-cli.sh --connect. Depois de se conectar ao JBoss, execute /subsystem=datasources:read-resource para imprimir uma lista das fontes de dados.

De acordo com a definição em jboss-cli-commands.cli, você pode acessar a conexão PostgreSQL usando o nome java:jboss/datasources/postgresDSJNDI.