Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Como utilizar funções do Azure com MongoDB Atlas em Java

Mohit Sharma8 min read • Published Apr 14, 2023 • Updated Apr 14, 2023
AzureAtlasJava
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Pré-requisitos

  1. 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.
  2. Uma contaMongoDB Atlas, que é um banco de dados de documentos baseado na cloud. Você pode se inscrever em uma conta gratuitamente.
  3. 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.
  4. Uma compreensão básica da linguagem de programação Java.

Função sem servidor: Olá, mundo!

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.

Instalando o plug-in do Azure

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.
IntelliJ Plugin
Com isso, estamos prontos para criar nossa primeira função Azure.

Primeira função do 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.
Assistente para novo projeto
Agora podemos editar os detalhes do projeto, se necessário, ou você pode deixá-los no padrão.
Nova função Azure do Assistente de Projeto
Na última etapa, atualize o nome do projeto e localização.
Assistente de novo projeto Criar
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.
Estrutura do projeto

Implantando e executando

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.
Console de saída Olá, mundo
Copie a URL mostrada no registro do console e abra-a no navegador para executar a função Azure.
Erro de saída do Hello World
Isso solicitará a passagem do nome como um parâmetro de query, conforme definido na função bootstrapped.
1if (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.
Saída do Hello World
Para saber mais, você também pode seguir o guia oficial.

Conectando a função sem servidor ao MongoDB Atlas

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.

Configurando uma conta Atlas

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.

Adicionando o endereço IP da função Azure no Atlas Network Config

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.
Endereço IP do Azure
Adicione-os ao IP individualmente em Acesso à rede.
Lista de permissões de IP do MongoDB

Instalando dependência para interagir com o Atlas

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 arquivobuild.gradle.
1dependencies {
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.

Construindo uma função do Azure com o Atlas

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.
1public 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 @FunctionName("Movies")
8 public HttpResponseMessage run(
9 @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 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:
  1. Atualize o parâmetro@FunctionName de Movies para getMoviesCount.
  2. Renomeie o nome da função de run para getMoviesCount.
  3. Remova as variáveisquery e name, pois não temos nenhum parâmetro de consulta.
Nosso código atualizado fica assim:
1public class Movies {
2
3 @FunctionName("getMoviesCount")
4 public HttpResponseMessage getMoviesCount(
5 @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 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.
URL de conexão da captura de tela
Usando a connection string, podemos criar uma instância de MongoClients que pode ser usada para abrir a conexão a partir do database.
1public 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.
1long totalRecords=database.getCollection(COLLECTION_NAME).countDocuments();
Código atualizado para a função getMoviesCount é assim.
1@FunctionName("getMoviesCount")
2public HttpResponseMessage getMoviesCount(
3 @HttpTrigger(name = "req",
4 methods = {HttpMethod.GET},
5 authLevel = AuthorizationLevel.ANONYMOUS
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}
Agora vamos implantar este código localmente e na cloud para validar a saída. Usaremos Postman.
Implantação local
Copie a URL da saída do console e cole-a no Postman para validar a saída.
saída local do postman
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).
Explorar o Azure
Agora clique com o botão direito do mouse na função do Azure e selecione Criar.
Crie uma nova VM
Altere a plataforma para Linux com Java 1.8.
criar vm com linux
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.
1System.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.
vm deployment
Pressione Executar para implantá-lo.
vm deployment
Quando a implantação for bem-sucedida, você encontrará o URL da função sem servidor.
Sucesso da implantação na nuvem
Novamente, copiaremos esse URL e validaremos usando o Postman.
validação do cloud 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@FunctionName("getMoviesByYear")
2public HttpResponseMessage getMoviesByYear(
3 @HttpTrigger(name = "req",
4 methods = {HttpMethod.GET},
5 authLevel = AuthorizationLevel.ANONYMOUS
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:
1final int yearRequestParam = valueOf(request.getQueryParameters().get("year"));
Para usar essas informações em query, criamos um objetoFilters que pode passar como entrada para a funçãofind.
1Bson filter = Filters.eq("year", yearRequestParam);
2Document result = collection.find(filter).first();
O código atualizado é:
1@FunctionName("getMoviesByYear")
2public HttpResponseMessage getMoviesByYear(
3 @HttpTrigger(name = "req",
4 methods = {HttpMethod.GET},
5 authLevel = AuthorizationLevel.ANONYMOUS
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.
obter filmes por produção anual
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.
Explorar o Azure
Em seguida, selecionamos Function App e clicamos com o botão direito do mouse em Show Properties.
Propriedade da VM do Azure Explore
Isso abrirá uma guia com todas as propriedades existentes. Adicionamos nossa propriedade a ele.
Explorar o Azure
Agora podemos atualizar nosso código de função para usar essa variável. de
1private static final String MONGODB_CONNECTION_URI = "mongodb+srv://xxxxx:xxxx@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority";
para
1private 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.

Resumo

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.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Aprimoramento da precisão do LLM usando o Atlas Vector Search do MongoDB e os metadados Unstructured.io


Dec 04, 2023 | 12 min read
Tutorial

Criando de um pipeline de entrega contínua em vários ambientes para o MongoDB Atlas


Jan 23, 2024 | 8 min read
Tutorial

Automação do cluster do Atlas usando triggers agendados


Jun 25, 2024 | 11 min read
Artigo

Como habilitar o teste local e automático de recursos baseados na pesquisa do Atlas


Jun 12, 2024 | 8 min read
Sumário