Partilhar 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 Standard Edition (SE): Pode executar um aplicativo implantado como um pacote Java Archive (JAR) que contém um servidor incorporado (como Spring Boot, Quarkus, Dropwizard ou um aplicativo com um servidor Tomcat ou Jetty incorporado).
  • Tomcat: O servidor Tomcat integrado pode executar um aplicativo implantado como um pacote WAR (Web Application Archive).
  • JBoss Enterprise Application Platform (EAP): O servidor JBoss EAP integrado pode executar um aplicativo implantado como um pacote WAR ou Enterprise Archive (EAR). Suportado para aplicativos Linux em um conjunto de níveis de preços que inclui Free, Premium v3 e Isolated v2.gti

Configurar a fonte de dados

Para se conectar a fontes de dados em aplicativos Spring Boot, sugerimos criar cadeias de conexão e injetá-las em seu 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 a cadeia de conexão JDBC no campo de valor e defina o tipo como "Personalizado". Opcionalmente, você pode definir 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 chamada 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}
    

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

Gorjeta

Por padrão, os contêineres do Linux Tomcat podem configurar automaticamente fontes de dados compartilhadas para você no servidor Tomcat. 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), e 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 usando essa abordagem, consulte Tutorial: Criar um aplicativo Web Tomcat com o Serviço de Aplicativo do Azure no Linux e no MySQL.

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

Base de Dados Nome da classe do driver Controlador JDBC
PostgreSQL org.postgresql.Driver Transferir
MySQL com.mysql.jdbc.Driver Download (Selecione "Independente da plataforma")
Servidor SQL com.microsoft.sqlserver.jdbc.SQLServerDriver Transferir

Para configurar o Tomcat para usar o Java Database Connectivity (JDBC) ou a Java Persistence API (JPA), primeiro personalize a variável de ambiente que é lida CATALINA_OPTS pelo Tomcat na inicialização. Defina esses valores por meio de uma configuração de aplicativo no plug-in do App Service Maven:

<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>Definições da Aplicação 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

  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. No context.xml, adicione um Context elemento para vincular a fonte de dados a um endereço JNDI. Substitua o marcador driverClassName pelo nome da classe do condutor na 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 da sua aplicação para usar a fonte de dados na sua aplicação.

    <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

Adicionar uma fonte de dados compartilhada no nível do servidor requer que você edite o 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 Configuration>Startup Command. Você pode carregar o script de inicialização usando FTP.

O seu script de inicialização realiza uma transformação XSL no ficheiro server.xml e grava o ficheiro XML resultante em . O script de inicialização deve instalar libxslt via apk. Seu arquivo xsl e script de inicialização podem ser carregados via FTP. Abaixo está 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 ficheiro XSL de exemplo a seguir adiciona um novo nó de conector ao Tomcat server.xml.

<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. Certifique-se de que os arquivos do driver JDBC estejam disponíveis para o carregador de classes 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ê criou uma fonte de dados no nível do servidor, reinicie o aplicativo Linux do Serviço de Aplicativo. O Tomcat restabelece CATALINA_BASE para /home/tomcat e utiliza a configuração atualizada.

Gorjeta

Por padrão, os contêineres do Linux JBoss podem configurar automaticamente fontes de dados compartilhadas para você no servidor JBoss. 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), e o Serviço de Aplicativo adiciona automaticamente a fonte de dados compartilhada correspondente, usando um driver apropriado disponível no contêiner. Para obter um cenário de ponta a ponta usando essa abordagem, consulte Tutorial: Criar um aplicativo Web JBoss com o Serviço de Aplicativo do Azure no Linux e no MySQL.

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

  1. Carregue o driver JDBC.
  2. Adicione o driver JDBC como um módulo.
  3. Adicione uma fonte de dados com o módulo.

O App Service é um serviço de hospedagem sem estado, por isso, estas etapas devem ser colocadas num script de inicialização e executadas sempre que o contentor 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 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
    

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

  2. Crie um script de inicialização, startup.sh, que chame os comandos da CLI do JBoss. O exemplo a seguir mostra como chamar o seu jboss-cli-commands.cli. Mais tarde, 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. Usando uma opção de implantação de sua escolha, carregue seu driver JDBC, jboss-cli-commands.cli e startup.sh para os caminhos especificados nos respetivos scripts. Especialmente, 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 que a fonte de dados foi adicionada ao servidor JBoss, SSH em seu webapp e execute $JBOSS_HOME/bin/jboss-cli.sh --connect. Quando estiver conectado ao JBoss, execute o /subsystem=datasources:read-resource para imprimir uma lista das fontes de dados.

Conforme definido por jboss-cli-commands.cli anteriormente, pode aceder à conexão PostgreSQL usando o nome JNDIjava:jboss/datasources/postgresDS.

Próximos passos

Visite o Centro do Azure para Desenvolvedores de Java para encontrar guias de início rápido, tutoriais e documentação de referência de Java no Azure.