Implantar um aplicativo de inicialização Spring no Azure
1. Introdução
O Microsoft Azure agora oferece suporte a Java bastante sólido.
Neste tutorial, vamos demonstrar como fazer nosso aplicativo Spring Boot funcionar na plataforma Azure, passo a passo.
2. Dependência e configuração do Maven
Primeiro,we do need an Azure subscription to make use of the cloud services there; atualmente, podemos inscrever uma conta gratuitahere.
Em seguida, faça login na plataforma e crie um principal de serviço usandoAzure CLI:
> az login
To sign in, use a web browser to open the page \
https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
> az ad sp create-for-rbac --name "app-name" --password "password"
{
"appId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"displayName": "app-name",
"name": "http://app-name",
"password": "password",
"tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}
Agorawe configure Azure service principal authentication settings in our Maven settings.xml, com a ajuda da seção a seguir, em<servers>:
azure-auth
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
tttttttt-tttt-tttt-tttt-tttttttttttt
password
AZURE
Contaremos com a configuração de autenticação acima ao enviar nosso aplicativo Spring Boot para a plataforma Microsoft, usandoazure-webapp-maven-plugin.
Vamos adicionar o seguinte plugin Maven aopom.xml:
com.microsoft.azure
azure-webapp-maven-plugin
1.1.0
Podemos verificar a versão de lançamento mais recentehere.
Há várias propriedades configuráveis para este plugin que serão abordadas na introdução a seguir.
3. Implantar um aplicativo de inicialização Spring no Azure
Agora que configuramos o ambiente, vamos tentar implantar nosso aplicativo Spring Boot no Azure.
Nosso aplicativo responde com “hello azure!” quando acessamos “/hello“:
@GetMapping("/hello")
public String hello() {
return "hello azure!";
}
A plataforma agora permite a implantação do Java Web App para o Tomcat e o Jetty. Comazure-webapp-maven-plugin, podemos implantar nosso aplicativo diretamente em contêineres da Web suportados como o aplicativo padrão (ROOT) ou implantar via FTP.
Observe que, como vamos implantar o aplicativo em contêineres da web, devemos empacotá-lo como um arquivo WAR. Como um lembrete rápido, temos um artigo que apresentahow to deploy a Spring Boot WAR into Tomcat.
3.1. Implantação de contêiner da Web
Usaremos a seguinte configuração paraazure-webapp-maven-plugin se pretendemos implantar no Tomcat em uma instância do Windows:
1.8
tomcat 8.5
Para uma instância do Linux, tente a seguinte configuração:
tomcat 8.5-jre8
Não vamos esquecer a autenticação do Azure:
azure-auth
spring-azure
example
Quando implantarmos nosso aplicativo no Azure, o veremos aparecer como um Serviço de Aplicativo. Portanto, aqui especificamos a propriedade<appName> para nomear o Serviço de Aplicativo. Além disso, o serviço de aplicativo, como um recurso, precisa ser mantido por umresource group container, então<resourceGroup> também é necessário.
Now we’re ready to pull the trigger using the azure-webapp:deploy Maven target, e veremos a saída:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanssssssss-bbbb-0000'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net
...
Now we can access https://spring-example.azurewebsites.net/helloe veja a resposta: ‘hello azure! '.
Durante o processo de implantação, o Azure criou automaticamente um Plano de Serviço de Aplicativo para nós. Confira oofficial document para obter detalhes sobre os planos do Serviço de Aplicativo do Azure. Se já temos um plano de serviço de aplicativo, podemos definir a propriedade<appServicePlanName> para evitar a criação de um novo:
ServicePlanssssssss-bbbb-0000
3.2. Implantação de FTP
Para implantar via FTP, podemos usar a configuração:
azure-auth
spring-example
example
1.8
ftp
${project.basedir}/target
webapps
*.war
Na configuração acima, fazemos com que o plug-in localize o arquivo WAR no diretório$\{project.basedir}/target e o implemente no diretóriowebapps do contêiner Tomcat.
Digamos que nosso artefato final seja denominadoazure-0.1.war,, veremos uma saída como a seguinte assim que iniciarmos a implantação:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanxxxxxxxx-xxxx-xxxx'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
...
[INFO] Finished uploading directory: \
/xxx/.../target/azure-webapps/spring-example --> /site/wwwroot
[INFO] Successfully uploaded files to FTP server: \
xxxx-xxxx-xxx-xxx.ftp.azurewebsites.windows.net
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net
Observe que aqui não implantamos nosso aplicativo como o aplicativo da Web padrão para Tomcat, portanto, só podemos acessá-lo por meio de ‘https://spring-example.azurewebsites.net/azure-0.1/hello '. O servidor responderá 'olá, azul!' como esperado.
4. Implantar com configurações personalizadas de aplicativos
Na maioria das vezes, nosso aplicativo Spring Boot requer acesso a dados para fornecer serviços. O Azure agora suporta bancos de dados como SQL Server, MySQL e PostgreSQL.
Para fins de simplicidade, usaremos seu MySQL no aplicativo como nossa fonte de dados, pois sua configuração é bastante semelhante a outros serviços de banco de dados do Azure.
4.1. Habilitar MySQL no aplicativo no Azure
Como não há uma linha única para criar um aplicativo da web com MySQL no aplicativo habilitado, temos que primeiro criar o aplicativo da web usando a CLI:
az group create --location japanwest --name bealdung-group
az appservice plan create --name example-plan --resource-group bealdung-group --sku B1
az webapp create --name example-webapp --resource-group example-group \
--plan example-plan --runtime java|1.8|Tomcat|8.5
Entãoenable MySQL in App inthe portal:
Depois que o MySQL no aplicativo é habilitado, podemos encontrar o banco de dados padrão, a URL da fonte de dados e as informações de conta padrão em um arquivo chamadoMYSQLCONNSTR_xxx.txt no diretório/home/data/mysql do sistema de arquivos.
4.2. Aplicativo de inicialização Spring usando o MySQL no aplicativo do Azure
Aqui, para necessidades de demonstração, criamos uma entidadeUser e dois endpoints usados pararegisterelistUsers:
@PostMapping("/user")
public String register(@RequestParam String name) {
userRepository.save(userNamed(name));
return "registered";
}
@GetMapping("/user")
public Iterable userlist() {
return userRepository.findAll();
}
Vamos usar um banco de dados H2 em nosso ambiente local e trocá-lo para MySQL no Azure. Geralmente, configuramos as propriedades da fonte de dados no arquivoapplication.properties:
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=
Enquanto para a implantação do Azure,we need to configure azure-webapp-maven-plugin in *<appSettings>*:
azure-auth
1.8
example-group
example-webapp
bealdung-plan
spring.datasource.url
jdbc:mysql://127.0.0.1:55738/localdb
spring.datasource.username
uuuuuu
spring.datasource.password
pppppp
Agora podemos começar a implantar:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App custom-webapp...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Updating target Web App...
[INFO] Successfully updated Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://example-webapp.azurewebsites.net
Podemos ver no log que a implantação está concluída.
Vamos testar nossos novos endpoints:
> curl -d "" -X POST https://example-webapp.azurewebsites.net/user\?name\=example
registered
> curl https://example-webapp.azurewebsites.net/user
[{"id":1,"name":"example"}]
A resposta do servidor diz tudo. Funciona!
5. Implantar um aplicativo de inicialização Spring em contêineres no Azure
Nas seções anteriores, mostramos como implantar aplicativos em contêineres de servlet (Tomcat, neste caso). Que tal implantar como um jar executável independente?
Por enquanto, podemos precisar containerizar nosso aplicativo Spring Boot. Especificamente, podemos dockerize-o e carregar a imagem no Azure.
Já temos um artigo sobrehow to dockerize a Spring Boot App, mas aquiwe’re about to make use of another maven plugin: docker-maven-plugin, to automate dockerization for us:
com.spotify
docker-maven-plugin
1.1.0
A versão mais recente pode ser encontradahere.
5.1. Registro de Contêiner do Azure
Primeiro,we need a Container Registry on Azure to upload our docker image.
Então, vamos criar um:
az acr create --admin-enabled --resource-group example-group \
--location japanwest --name exampleadr --sku Basic
Também precisaremos das informações de autenticação do Container Registry, e isso pode ser consultado usando:
> az acr credential show --name exampleadr --query passwords[0]
{
"additionalProperties": {},
"name": "password",
"value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
Em seguida, adicione a seguinte configuração de autenticação do servidor emsettings.xml do Maven:
exampleadr
exampleadr
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.2. Configuração do Maven Plugin
Vamos adicionar a seguinte configuração do plug-in Maven aopom.xml:
exampleadr
${azure.containerRegistry}.azurecr.io
com.spotify
docker-maven-plugin
1.0.0
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
docker
/
${project.build.directory}
${project.build.finalName}.jar
Na configuração acima, especificamos o nome da imagem da janela de encaixe, a URL do registro e algumas propriedades semelhantes às da implantação do FTP.
Observe que o plugin usará valores em<dockerDirectory> para localizarDockerfile. ColocamosDockerfile no diretóriodocker, e seu conteúdo é:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD azure-0.1.jar app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
5.3. Execute o aplicativo Spring Boot em uma instância do Docker
Agora podemos criar uma imagem do Docker e enviá-la para o registro do Azure:
> mvn docker:build -DpushImage
...
[INFO] Building image exampleadr.azurecr.io/azure-0.1
...
Successfully built aaaaaaaaaaaa
Successfully tagged exampleadr.azurecr.io/azure-0.1:latest
[INFO] Built exampleadr.azurecr.io/azure-0.1
[INFO] Pushing exampleadr.azurecr.io/azure-0.1
The push refers to repository [exampleadr.azurecr.io/azure-0.1]
...
latest: digest: sha256:0f0f... size: 1375
Depois que o upload for concluído, vamos verificar o registroexampleadr. Veremos a imagem na lista de repositórios:
Agora estamos prontos para executar uma instância da imagem:
Depois que a instância é inicializada, podemos acessar os serviços fornecidos por nosso aplicativo por meio de seu endereço IP público:
> curl http://a.x.y.z:8080/hello
hello azure!
5.4. Implantação de contêiner do Docker
Suponha que tenhamos um registro de contêiner, independentemente de ser do Azure, Docker Hub ou nosso registro privado.
Com a ajuda da seguinte configuração deazure-webapp-maven-plugin, também podemos implantar nosso aplicativo da web Spring Boot nos contêineres:
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
Depois de executarmvn azure-webapp:deploy, o plug-in ajudará a implantar nosso arquivo de aplicativo da web em uma instância da imagem especificada.
Então, podemos acessar os serviços da web por meio do endereço IP da instância ou URL do Serviço de Aplicativo do Azure.
6. Conclusão
Neste artigo, apresentamos como implantar um aplicativo Spring Boot no Azure, como um WAR implantável ou um JAR executável em um contêiner. Embora já tenhamos abordado a maioria dos recursos deazure-webapp-maven-plugin, ainda existem alguns recursos avançados a serem explorados. Por favor, verifiquehere para mais detalhes.
Como sempre, a implementação completa dos exemplos de código pode ser encontrada emon Github.