Compartilhar via


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 um serviço totalmente gerenciado em três variantes:

  • Java SE – pode executar um aplicativo implantado como um pacote JAR que contém um servidor inserido (como Spring Boot, Dropwizard, Quarkus ou um com um servidor Tomcat ou Jetty inserido).
  • Tomcat – O servidor Tomcat interno pode executar um aplicativo implantado como um pacote WAR.
  • JBoss EAP: Suporte apenas para aplicativos Linux nos níveis de preços Gratuito, Premium v3 e Isolado v2. O servidor JBoss EAP interno pode executar um aplicativo implantado como um pacote WAR ou EAR.

Observação

Para aplicativos Spring, é recomendável usar o Aplicativos Spring do Azure. No entanto, você ainda pode usar o Serviço de Aplicativo do Azure como um destino. Consulte Diretrizes de Destino da Carga de Trabalho Java para obter orientação.

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. Na seção "Configuração" da página Serviço de Aplicativo, defina um nome para a cadeia de caracteres, cole sua cadeia de conexão JDBC no campo de valor e defina o tipo como "Personalizado". Opcionalmente, defina essa cadeia de conexão como configuração de slot.

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

  2. No arquivo application.properties, faça referência a essa cadeia de conexão com o nome da variável de ambiente. Para o nosso exemplo, usaríamos o seguinte código:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Confira a documentação do Spring Boot sobre acesso a dados e configurações externalizadas para obter mais informações sobre este tópico.

Dica

Por padrão, os contêineres do Tomcat do Linux podem configurar automaticamente fontes de dados compartilhadas para você no servidor Tomcat. A única coisa que você precisa fazer é adicionar uma configuração de aplicativo que contenha uma cadeia de conexão JDBC válida para um banco de dados Oracle, SQL Server, PostgreSQL ou MySQL (incluindo as credenciais de conexão) e o Serviço de Aplicativo adicionará automaticamente o banco de dados compartilhado correspondente em /usr/local/tomcat/conf/context.xml usando um driver apropriado que esteja disponível no contêiner. Para ver um cenário completo usando essa abordagem, consulte Tutorial: Crie um aplicativo Web Tomcat com o Serviço de Aplicativo do Azure no Linux e MySQL.

Essas instruções se aplicam a todas as conexões de banco de dados. Você precisa preencher os espaços reservados com nome de classe do driver do banco de dados escolhido e o arquivo JAR. É fornecida uma tabela com nomes de classe e downloads de driver para bancos de dados comuns.

Banco de dados Nome de Classe do Driver Driver JDBC
PostgreSQL org.postgresql.Driver Download
MySQL com.mysql.jdbc.Driver Baixar (Selecione "Independente de Plataforma")
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Download

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 variável de ambiente CATALINA_OPTS lida em Tomcat na inicialização do backup. Defina esses valores por meio de uma configuração de aplicativo no plug-in Maven do Serviço de Aplicativo:

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

Ou defina as variáveis de ambiente na página Configuração>Configurações de Aplicativo 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 do Tomcat.

Fontes 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 espaço reservado driverClassName pelo nome de classe do seu driver da tabela acima.

    <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

A adição de uma fonte de dados compartilhada no nível do servidor exige a edição do server.xml do Tomcat. A maneira mais confiável de fazer isso é a seguinte:

  1. Carregue um script de inicialização e defina o caminho para o script em Configuração>Comando de Inicialização. Você pode carregar o script de inicialização usando o FTP.

Seu script de inicialização faz uma transformação XSL no arquivo server.xml e envia o arquivo xml resultante para /usr/local/tomcat/conf/server.xml. O script de inicialização deve instalar o libxslt via apk. O arquivo xsl e o script de inicialização podem ser carregados via FTP. Confira abaixo um exemplo de script de inicialização.

# 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

O arquivo XSL de exemplo a seguir adiciona um novo nó do 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'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>

Finalizar a configuração

Por fim, coloque os JARs do driver no classpath do Tomcat e reinicie o Serviço de Aplicativo.

  1. 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 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ê tiver uma fonte de dados no nível do servidor, reinicie o aplicativo Linux Serviço de Aplicativo. O Tomcat redefine CATALINA_BASE para /home/tomcat e usa a configuração atualizada.

Dica

Por padrão, os contêineres do JBoss no Linux podem configurar automaticamente fontes de dados compartilhadas para você no servidor JBoss. Sua única tarefa é adicionar uma configuração de aplicativo contendo uma cadeia de conexão JDBC válida para um banco de dados Oracle, SQL Server, PostgreSQL ou MySQL (incluindo as credenciais de conexão) e o Serviço de Aplicativo adicionará automaticamente a fonte de dados compartilhada correspondente usando um driver apropriado que esteja disponível no contêiner. Para ver um cenário completo usando essa abordagem, confira o Tutorial: crie um aplicativo Web JBoss com o Serviço de Aplicativo do Azure no Linux e MySQL.

São três etapas principais ao 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.

Como o Serviço de Aplicativo é um serviço de hospedagem sem monitoração de estado, você deve colocar essas etapas em um script de inicialização e executá-lo sempre que o contêiner JBoss for iniciado. Usando PostgreSQL, MySQL e Banco de Dados SQL como exemplos:

  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 seu 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. Principalmente, carregue o 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 do JBoss, use o SSH no seu aplicativo Web e execute $JBOSS_HOME/bin/jboss-cli.sh --connect. Quando você estiver conectado ao JBoss, execute o /subsystem=datasources:read-resource para imprimir uma lista das fontes de dados.

Conforme definido pelo jboss-cli-commands.cli, você poderá acessar a conexão com o PostgreSQL usando o nome JNDI java:jboss/datasources/postgresDS.

Próximas etapas

Acesse a central para Desenvolvedores do Azure para Java para conferir inícios rápidos, tutoriais e documentação de referência do Java.