Deploy de uma aplicação Java reativa (Pokedéx) na Microsoft Azure + CosmosDB ✨
Tags: azure, azureapril, java, tutorial
Published: 2020-04-24 20:01:43

Olá galera, no artigo de hoje vamos fazer deploy no Azure, a nuvem da microsoft, e usar a API do CosmosDB para colocar nosso banco de dados MongoDB Atlas.

Você pode acompanhar aqui no dev.to da Womakerscode o processo de construção da Rest API reativa usando WebFlux, este artigo pode ser tanto um complemento quanto um aprendizado, onde iremos fazer deploy numa nuvem diferente, então bora lá! ʕ•́ᴥ•̀ʔっ

**Repositório da aplicação: https://bit.ly/pokedex-azure**
**Link a API publicada: https://restapipokedex-1587755576956.azurewebsites.net/pokedex**

# Pré Requesitos
Para poder fazer o deploy eis aqui alguns pré requesitos que você precisa ter

* [Azure CLI](https://docs.microsoft.com/pt-br/cli/azure/?view=azure-cli-latest)
* Uma conta gratuita no [Portal Azure](https://azure.microsoft.com/pt-br/free/)
* Uma conta gratuita no [MongoDB Atlas](https://www.mongodb.com/cloud/atlas)
* Uma aplicação com Webflux, se quiser usar a que fizemos no último artigo pode usar :D

> Durante o tutorial vou usar uma aplicação WebFlux pokedéx que construi com os dados salvos no mongoDB Atlas

# Setting up the project
Caso sua aplicação não use o MongoDB Atlas, sem problemas, acesse a apresentação onde eu ensino passo a passo de como criar um banco de dados no mongo Atlas de  como colocar ele na sua aplicação Java WebFLux

PARA VIZUALIZAR [CLIQUE AQUI](https://docs.google.com/presentation/d/1-wjMLHdvmNDqj3HM0lRIxrIYSIoSi-Uxle1rrmBRvv8/edit?usp=sharing)

Ou você pode assistir a live da Womakerscode onde eu e a Kamila explicamos tudinho, e eu ensino um passo a passo de como colocar o MongoDB Atlas na sua aplicação Java Webflux

{% youtube Qzp7gDnyGzQ %}

> lembre-se de colocar o IP adress para qualquer localização como na imagem abaixo, senão sua aplicação local não sobe
![aba de network access do mongodb atlas](https://dev-to-uploads.s3.amazonaws.com/i/ni2a2f9ypwffklszhbc1.PNG)

# Criando um banco Cosmos DB
Vamos entrar no portal Azure, e buscar por "CosmosDB"

![painel do portal azure](https://dev-to-uploads.s3.amazonaws.com/i/foxk62vbp3mmv6ptttl0.PNG)

Clique em Azure CosmosDB, agora na página vamos clicar em **Add +** para adicionar um novo banco de dados, como na imagem abaixo

![painel do cosmos db](https://dev-to-uploads.s3.amazonaws.com/i/l15vdzs8r1a4mh08uh3l.PNG)

Vamos adicionar as informações do nosso banco de dados, para isso especifique as seguintes informações:

* **Assinatura**: especifique a assinatura do Azure para usar.
* **Grupo de recursos**: especifique se deseja criar um novo grupo de recursos ou escolher um grupo de recursos existente.
* **Nome da conta**: Escolha um nome exclusivo para sua conta do Cosmos DB. Ele será usado para criar um nome de domínio totalmente qualificado, como wingtiptoysmongodb.documents.azure.com.
* **API**: Especifique Azure Cosmos DB for MongoDB API para este tutorial.
* **Localização**: especifique a região geográfica mais próxima do banco de dados.

> Vale lembrar que eu tenho uma conta pay-as-you-go no Azure então minha assinatura esta com essa opção, mas isso nao interfere em nada, pois estou no período gratuito utilizando os mesmos recursos que você com a conta gratuita vai usar

Minhas informações ficaram assim:

![informações de assinatura do cosmos](https://dev-to-uploads.s3.amazonaws.com/i/5n8iam5nfnsdvkbpo1q4.PNG)

Agora vamos clicar em **Review + create** e nos será gerado uma página de revisão das informações que colocamos, se tudo estiver certinho só finalizar clicando em **create** e esperar um minutos que nosso banco de dados ComosDB estará sendo finalizado.

Se seu recurso subiu com êxito a seguinte mensagem vai aparecer:
![mensagem de êxito ao criar o banco de dados](https://dev-to-uploads.s3.amazonaws.com/i/gn96veankjkt6wqzpvzl.PNG)

Agora só clicar em **Go to recurse** para acessarmos esse recurso

# Configurando o MongoDB com a API do CosmosDB
Aparecerá uma tela com diversas formas de conexão com o MongoDB, como no nosso caso é uma aplicação Java, vamos nessa janela e copiar a **second connection string** que foi gerada..

*Sugiro Copiar e colar num bloco de notas pois vamos usá-la mais tarde*

Copie a connection String conforme a imagem, e lembre-se se usar a **Second Connection String**:
![connection string](https://dev-to-uploads.s3.amazonaws.com/i/dp2ovyhgk8l0hq48gmqa.PNG)

Volte pro projeto Spring e vá até o applicarion.properties, nele é onde fica nossas configurações de banco de dados.

Basta substituir a string de conexão que está lá com o link do mongoDB para essa nova String

```java
spring.data.mongodb.database=wingtiptoysmongodb
spring.data.mongodb.uri=mongodb://wingtiptoysmongodb:AbCdEfGhIjKlMnOpQrStUvWxYz==@wingtiptoysmongodb.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
````

Show!

Só que este comando esta com informações genéricas, devemos colocar as informações que o Azure CosmosDB nos deu, para isso volte na secodn connection string que deixamos guarado e substuitua no código, ficará da seguinte forma:


````java
spring.data.mongodb.database=pokedex-demo
spring.data.mongodb.uri=mongodb://pokedex-demo:crbTRtSMrZ8ymwK6zg0hpxfVQFjJ62wrOISTopZd5pElCeeyIEVZGP9enmlzmZP2JcYcV835YoJl1oE6UfoPOg==@pokedex-demo.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@pokedex-demo@
````

Agora para saber se a aplicação foi criada, precisamos testar, para isso inicie sua aplicação no método main();

### Testando a aplicação local
Vamos testar nossos endpoints para saber se esta tudo ok
Eu vou utlilizar o postman mas você pode usar o Web client API que quiser!

Perceba que testando a requisição **Get**, não me retorna nada, isso por que nosso banco de dados está vazio:
![teste no postamn da requisição GET, está retornando vazia](https://dev-to-uploads.s3.amazonaws.com/i/s1bvvyri8cb8lurexmmn.PNG)

Para ter algo salvo, eu vou inserir pelo postman mesmo com a requisição POST > body > raw > JSON, vou inserir o Bulbassauro

````json
{
	"nome": "Bulbassauro"
}
```

Se funcionou você tem seu banco conectado o/, siginifica que estamos prontos pro deploy

# Deploy na plataforma Azure

 **No arquivo pom.xml da sua aplicação insira o plugin do Azure**

````java
<plugin>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-webapp-maven-plugin</artifactId>
	<version>1.9.0</version>
</plugin>
````
E importe as mudanças

Agora abre um terminal e localize a pasta onde está salvo seu projeto, para locar no azure com o comando `mvn azure-webapp:config`

Espere alguns segundo para seja realizado o deploy, vai aparecer mensagens para definirmos valores para nossa aplicação, vamos usar as que o azure nos entrega por padrão, sendo assim nossa resposta é a seguinte:

![sucesso de construção](https://dev-to-uploads.s3.amazonaws.com/i/qcmbsqhqmi7t51a7garg.PNG)

As configurações serão salvas no arquivo pom.xml

> Caso você queira mudar as confirgurações rode o comando `mvn azure-webapp:config` novamente

## Configurando a porta
No mesmo arquivo pom.xml vamos definir a porta que nossa aplicação vai subir, para isso vá ate a tag **<configuration>** e cole o seguinte comando:

````java
<appSettings>
    <property>
       <name>JAVA_OPTS</name>
       <value>-Dserver.port=80</value>
     </property>
</appSettings>
````

## Subindo a aplicação

Depois de todas as confirgurações realizadas, vamos fazer login no portal azure com o comando `az login`

Selecione sua conta, e volte para o terminal

![conta microsoft](https://dev-to-uploads.s3.amazonaws.com/i/yp6y60tu5h728rv604i2.PNG)

Deve retornar esta mensagem no terminal

![mensagem com as credenciais da conta na plataforma azure](https://dev-to-uploads.s3.amazonaws.com/i/nbtvuj4ulpwz2u4c2hmd.PNG)

Se tudo deu certo, utilize o comando `mvn clean package` , para limpar todas as suas dependências e realizar o building no Maven, a mensagem de **Build Success** aparecerá conforme a imagem:

![mensagem que de sucesso ao realizar o comando de maven clean package](https://dev-to-uploads.s3.amazonaws.com/i/733gtnwbrqako6py7368.PNG)

...

AGORA BORA PRO DEPLOY

Para realizar definitivamente o deploy utilize o comando `mvn azure-webapp:deploy`

Agora é só esperar alguns minutinhos até nossa aplicação subir
![vídeo de um personagem esperando](https://media.giphy.com/media/brHaCdJqCXijm/giphy.gif)

Se tudo ocorreu certinho, obtivemos sucesso no deploy, e no seu terminal terá um link na nuvem que você poderá acessar:
![sucesso no deploy](https://dev-to-uploads.s3.amazonaws.com/i/n4cwbz2zjge165siylp7.PNG)

No meu caso esse foi o link que gerou: https://restapipokedex-1587755576956.azurewebsites.net

Vou acessar esse link, e colar no postman para testar os endpoints, usando `https://restapipokedex-1587755576956.azurewebsites.net/pokedex`

![postman com o link que o azure me gerou](https://dev-to-uploads.s3.amazonaws.com/i/in2moblobhtwfxn6m9ed.PNG)

Teste todos os enpoints, o que insere (POST), o que exclui (DELETE), se divirta pois seu deploy foi com sucesso!!!  (•◡•) /

Você pode ver detalhes da sua aplicação acessando o portal o azure > **App Services** e selecionar o seu, sua visão será como esta imagem:

![portal azure com o caminho dito acima](https://dev-to-uploads.s3.amazonaws.com/i/xqsj7sfztijycoizpr4h.PNG)

Você pode acessar seus recursos por esse painel e também acessar a URI que sua aplicação tem agora!

...

# Conclusão

A microsoft é uma empresa gigante com várias funcionalidades, e quando estamos falando de Java essas funcionalidades aumentam, quando pensei em colocar minha Rest API na nuvem fiquei pensando em diversos serviços que poderiam me auxiliar, e para um ínicio achei que o Azure foi demais.
Eu já tive contato com o Azure na faculdade, principalmente publicando webapps, só que eu fazia pelo github (se vocês quiserem posso fazer uma artigo sobre isso também), mas por linha de comando é tão íncrivel quanto!

...
Espero que vocês tenham gostado, e que possamos nos ver mais vezes aqui no dev.to da comunidade Womakerscode!
Me sigam nas redes sociais https://twitter.com/anabneri

...

Referências
[Canal da Michelli Brito DIVA](https://www.youtube.com/channel/UC2WbG8UgpPaLcFSNJYwtPow)
[Artigo do Blog Dev Java](https://www.devjava.com.br/deploy-de-um-app-springboot-2-nas-nuvens-do-azure/)
[Documentação da Microsoft](https://docs.microsoft.com/pt-br/azure/java/spring-framework/configure-spring-data-mongodb-with-cosmos-db)

![thank you next, gif do videoclip da ariana grande](https://media.giphy.com/media/MT9MOLJXrXfVvMJ34C/giphy.gif)