Como utilizar funções do Azure com MongoDB Atlas em Java
Avalie esse Tutorial
A computação em nuvem é um dos tópicos mais discutidos no setor de tecnologia. A capacidade de dimensionar sua infraestrutura para cima e para baixo instantaneamente é apenas um dos muitos benefícios associados aos aplicativos sem servidor. Neste artigo, vamos escrever a função como um serviço (FaaS) - ou seja, uma função sem servidor que interagirá com dados por meio de um banco de dados para produzir resultados significativos. O FaaS também pode ser muito útil no teste A/B quando você deseja liberar rapidamente uma função independente sem entrar em implementação ou lançamento real.
Neste artigo, você aprenderá como usar oMongoDB Atlas, um banco de dados na nuvem, quando estiver começando a usaras funções do Azure em Java.
- Uma contado Microsoft Azure que usaremos para executar e implantar nossa função sem servidor. Se você não tiver um, você pode se inscrever gratuitamente.
- Uma contaMongoDB Atlas, que é um banco de dados de documentos baseado na cloud. Você pode se inscrever em uma conta gratuitamente.
- IntelliJ IDEA Community Edition para ajudar nossas atividades de desenvolvimento para este tutorial. Se esse não for o seu IDE preferido, você poderá usar outros IDEs como Eclipse, Visual Studio etc., mas as etapas serão um pouco diferentes.
- Uma compreensão básica da linguagem de programação Java.
Começar a usar a função sem servidor do Azure é muito simples, graças ao plug-in IntelliJ do Azure, que oferece vários recursos, desde a geração de código clichê até a implantação da função Azure. Então, antes de pularmos para o código real, vamos instalar o plugin.
O plug-in Azure pode ser instalado no IntelliJ de uma maneira muito padrão usando o gerenciador de plug-ins IntelliJ. Abra Plugins e procure por "Azure Toolkit for IntelliJ" no Marketplace. Clique em Instalar.
Com isso, estamos prontos para criar nossa primeira função Azure.
Agora, vamos criar um projeto que conterá nossa função e terá as dependências necessárias para executá-la. Go em frente e selecione Arquivo > Novo > Projeto na barra de menu, selecione Azure de Geradores como mostrado abaixo e clique em Avançar.
Agora podemos editar os detalhes do projeto, se necessário, ou você pode deixá-los no padrão.
Na última etapa, atualize o nome do projeto e localização.
Com isso concluído, temos um projeto inicializado com uma implementação de função de amostra. Sem mais delongas, vamos executar e ver em ação.
Podemos implantar a função Azure localmente ou na cloud. Vamos começar implementando-o localmente. Para implantar e executar localmente, pressione o ícone de reprodução contra o nome da função na linha 20, conforme mostrado na captura de tela acima, e selecione executar na caixa de diálogo.
Copie a URL mostrada no registro do console e abra-a no navegador para executar a função Azure.
Isso solicitará a passagem do nome como um parâmetro de query, conforme definido na função bootstrapped.
1 if (name == null) { 2 return request.createResponseBuilder(HttpStatus.BAD_REQUEST) 3 .body("Please pass a name on the query string or in the request body").build(); 4 } else { 5 return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build(); 6 }
Atualize a URL anexando o parâmetro de query
name
a http://localhost:XXXXX/api/HttpExample?name=World
, que imprimirá o resultado desejado.Na etapa anterior, criamos nossa primeira função do Azure, que recebe a entrada do usuário e retorna um resultado. Mas os aplicativos do mundo real são muito mais complicados do que isso. Para criar uma função do mundo real, o que faremos na próxima seção, precisamos entender como conectar nossa função a um banco de dados, pois a lógica opera sobre os dados e os bancos de dados contêm os dados.
Semelhante à função sem servidor, vamos usar um banco de dados que também está na cloud e tem a capacidade de aumentar e reduzir conforme necessário. Usaremos o MongoDB Atlas, que é um banco de dados em cloud baseado em documentos.
Criar uma conta Atlas é muito simples, gratuito para sempre e completo para validar qualquer ideia de projeto de MVP, mas se precisar de um guia, você pode seguir a documentação.
A função do Azure utiliza vários endereços IP em vez de um único endereço, então vamos adicioná-los ao Atlas. Para obter a faixa de endereços IP, abra sua conta do Azure e pesquise a rede dentro da máquina virtual do Azure. Copie os endereços de saída do tráfego de saída.
Uma das etapas ao criar uma conta com Atlas é adicionar o endereço IP para aceitar solicitações de conexão de entrada. Isso é essencial para evitar o acesso indesejado ao nosso banco de dados. Em nosso caso, o Atlas obterá todas as solicitações de conexão da função do Azure, então vamos adicionar este endereço.
Adicione-os ao IP individualmente em Acesso à rede.
Existem várias maneiras de interagir com Atlas. Como estamos construindo um serviço usando uma função sem servidor em Java, minha preferência é usar o driver Java do MongoDB. Então, vamos adicionar a dependência do driver no arquivo
build.gradle
.1 dependencies { 2 implementation 'com.microsoft.azure.functions:azure-functions-java-library:3.0.0' 3 // dependency for MongoDB Java driver 4 implementation 'org.mongodb:mongodb-driver-sync:4.9.0' 5 }
Com isso, nosso projeto está pronto para se conectar e interagir com nosso banco de dados na nuvem.
Com todos os pré-requisitos atendidos, vamos criar nossa primeira função do mundo real usando o conjunto dedados de exemplo do MongoDB para filmes. Neste projeto, criaremos duas funções: uma retorna a contagem do total de filmes na coleção e a outra retorna o documento do filme com base no ano de lançamento.
Vamos gerar o código boilerplate para a função clicando com o botão direito do mouse no nome do pacote e selecionando New > Azure function class. Chamaremos essa classe de função de
Movies
.1 public class Movies { 2 /** 3 * This function listens at endpoint "/api/Movie". Two ways to invoke it using "curl" command in bash: 4 * 1. curl -d "HTTP Body" {your host}/api/Movie 5 * 2. curl {your host}/api/Movie?name=HTTP%20Query 6 */ 7 8 public HttpResponseMessage run( 9 HttpRequestMessage<Optional<String>> request, 10 final ExecutionContext context) { 11 context.getLogger().info("Java HTTP trigger processed a request."); 12 13 // Parse query parameter 14 String query = request.getQueryParameters().get("name"); 15 String name = request.getBody().orElse(query); 16 17 if (name == null) { 18 return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build(); 19 } else { 20 return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build(); 21 } 22 } 23 }
Agora, vamos:
- Atualize o parâmetro
@FunctionName
deMovies
paragetMoviesCount
. - Renomeie o nome da função de
run
paragetMoviesCount
. - Remova as variáveis
query
ename
, pois não temos nenhum parâmetro de consulta.
Nosso código atualizado fica assim:
1 public class Movies { 2 3 4 public HttpResponseMessage getMoviesCount( 5 HttpRequestMessage<Optional<String>> request, 6 final ExecutionContext context) { 7 context.getLogger().info("Java HTTP trigger processed a request."); 8 9 return request.createResponseBuilder(HttpStatus.OK).body("Hello").build(); 10 } 11 }
Para nos conectar ao MongoDB Atlas usando o driver Java, primeiro precisamos de uma connection string que possa ser encontrada quando pressionamos para nos conectar ao cluster em nossa conta do Atlas. Para obter detalhes, você também pode consultar a documentação.
Usando a connection string, podemos criar uma instância de
MongoClients
que pode ser usada para abrir a conexão a partir do database
.1 public class Movies { 2 3 private static final String MONGODB_CONNECTION_URI = "mongodb+srv://xxxxx@cluster0.xxxx.mongodb.net/?retryWrites=true&w=majority"; 4 private static final String DATABASE_NAME = "sample_mflix"; 5 private static final String COLLECTION_NAME = "movies"; 6 private static MongoDatabase database = null; 7 8 private static MongoDatabase createDatabaseConnection() { 9 if (database == null) { 10 try { 11 MongoClient client = MongoClients.create(MONGODB_CONNECTION_URI); 12 database = client.getDatabase(DATABASE_NAME); 13 } catch (Exception e) { 14 throw new IllegalStateException("Error in creating MongoDB client"); 15 } 16 } 17 return database; 18 } 19 20 /*@FunctionName("getMoviesCount") 21 public HttpResponseMessage run( 22 @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, 23 final ExecutionContext context) { 24 context.getLogger().info("Java HTTP trigger processed a request."); 25 26 return request.createResponseBuilder(HttpStatus.OK).body("Hello").build(); 27 }*/ 28 }
Podemos consultar nosso banco de dados para obter o número total de filmes da collection, conforme mostrado abaixo.
1 long totalRecords=database.getCollection(COLLECTION_NAME).countDocuments();
Código atualizado para a função
getMoviesCount
é assim.1 2 public HttpResponseMessage getMoviesCount( 3 4 5 6 HttpRequestMessage<Optional<String>> request, 7 final ExecutionContext context) { 8 9 if (database != null) { 10 long totalRecords = database.getCollection(COLLECTION_NAME).countDocuments(); 11 return request.createResponseBuilder(HttpStatus.OK).body("Total Records, " + totalRecords + " - At:" + System.currentTimeMillis()).build(); 12 } else { 13 return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR).build(); 14 } 15 }
Copie a URL da saída do console e cole-a no Postman para validar a saída.
Vamos implantar isso na Azure cloud em uma máquina
Linux
. Clique emAzure Explore
e selecione o Aplicativo de Funções para criar uma máquina virtual (VM).Agora clique com o botão direito do mouse na função do Azure e selecione Criar.
Altere a plataforma para
Linux
com Java 1.8
.Se, por algum motivo, você não quiser alterar a plataforma e quiser usar o sistema operacional Windows, adicione a rota DNS padrão antes de fazer uma solicitação de rede.
1 System.setProperty("java.naming.provider.url", "dns://8.8.8.8");
Após alguns minutos, você notará a VM que acabamos de criar em
Function App
. Agora, podemos implantar nosso aplicativo nele.Pressione Executar para implantá-lo.
Quando a implantação for bem-sucedida, você encontrará o
URL
da função sem servidor.Novamente, copiaremos esse
URL
e validaremos usando o Postman.Com isso, conectamos com sucesso nossa primeira função com o MongoDB Atlas. Agora, vamos para o próximo nível. Criaremos outra função que retorna um documento de filme com base no ano de lançamento.
Vamos adicionar o código boilerplate novamente.
1 2 public HttpResponseMessage getMoviesByYear( 3 4 5 6 HttpRequestMessage<Optional<String>> request, 7 final ExecutionContext context) { 8 9 }
Para capturar o ano de entrada do usuário que será usado para consultar e coletar informações da collection, adicione este código:
1 final int yearRequestParam = valueOf(request.getQueryParameters().get("year"));
Para usar essas informações em query, criamos um objeto
Filters
que pode passar como entrada para a funçãofind
.1 Bson filter = Filters.eq("year", yearRequestParam); 2 Document result = collection.find(filter).first();
O código atualizado é:
1 2 public HttpResponseMessage getMoviesByYear( 3 4 5 6 HttpRequestMessage<Optional<String>> request, 7 final ExecutionContext context) { 8 9 final int yearRequestParam = valueOf(request.getQueryParameters().get("year")); 10 MongoCollection<Document> collection = database.getCollection(COLLECTION_NAME); 11 12 if (database != null) { 13 Bson filter = Filters.eq("year", yearRequestParam); 14 Document result = collection.find(filter).first(); 15 return request.createResponseBuilder(HttpStatus.OK).body(result.toJson()).build(); 16 } else { 17 return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Year missing").build(); 18 } 19 }
Agora vamos validar isso com o Postman.
A última etapa para tornar nosso aplicativo pronto para produção é proteger a conexão
URI
, pois ela contém credenciais e deve ser mantida privada. Uma maneira de protegê-la é armazená-la em uma variável de ambiente.A adição de uma variável de ambiente na função Azure também pode ser feita por meio do portal do Azure e do plugin Azure IntelliJ. Por enquanto, usaremos o plug-in Azure IntelliJ, então Go e abra o Azure Explore no IntelliJ.
Em seguida, selecionamos
Function App
e clicamos com o botão direito do mouse em Show Properties
.Isso abrirá uma guia com todas as propriedades existentes. Adicionamos nossa propriedade a ele.
Agora podemos atualizar nosso código de função para usar essa variável. de
1 private static final String MONGODB_CONNECTION_URI = "mongodb+srv://xxxxx:xxxx@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority";
para
1 private static final String MONGODB_CONNECTION_URI = System.getenv("MongoDB_Connection_URL");
Depois de reimplantar o código, estamos prontos para usar esse aplicativo na produção.
Grato por ler — esperemos que você ache este artigo informativo! O código fonte completo do aplicativo pode ser encontrado no GitHub.
Se você está procurando algo semelhante usando o runtime Node.js, confira o outro tutorial sobre o assunto.
Com o MongoDB Atlas no Microsoft Azure, os desenvolvedores recebem acesso à plataforma de dados de desenvolvedor mais abrangente, segura, escalável e baseada em cloud do mercado. Agora, com a disponibilidade do Atlas no Azure Marketplace, nunca foi tão fácil para os usuários começarem a construir com o Atlas enquanto simplificam os processos de aquisição e cobrança. Comece hoje mesmo por meio da listagem do Atlas no Azure Marketplace.
Se você tiver alguma dúvida ou comentário, pode compartilhá-los no fórum do MongoDB ou enviar um tweet para mim @codeWithMohit.