Armazenamento de mídia contínuo: integrando o armazenamento de Blobs do Azure e o MongoDB com o Spring Boot
Avalie esse Tutorial
De mídias sociais a serviços de streaming, muitos aplicativos exigem uma mistura de diferentes tipos de dados. Se você estiver projetando um aplicativo que exija o armazenamento de imagens ou vídeos, uma boa ideia é armazenar sua mídia usando um serviço especialmente projetado para lidar com grandes objetos de dados não estruturados.
Seu MongoDB database não é o melhor lugar para armazenar seus arquivos de mídia diretamente. O tamanho máximo do documento BSON é de 16MB. Isso ajuda a garantir que um único documento não possa usar uma quantidade excessiva de RAM ou, durante a transmissão, uma quantidade excessiva de largura de banda. Isso fornece um obstáculo, pois esse limite pode ser facilmente superado por imagens ou vídeos.
O MongoDB fornece GridFS como uma solução para esse problema. O MongoDB GridFS é uma especificação para armazenar e recuperar arquivos grandes que excedem o limite de tamanho do documento BSON e funciona dividindo o arquivo em partes e armazenando cada parte como um documento separado. Em uma segunda coleção, ele armazena os metadados desses arquivos, incluindo de quais partes cada arquivo é composto. Embora isso possa funcionar para alguns casos de uso, muitas vezes, é uma boa ideia usar um serviço dedicado a armazenar grandes arquivos de mídia e vincular a eles em seu documento MongoDB. O Armazenamento de Blobs do Azure é otimizado para armazenar grandes quantidades de dados não estruturados e projetado para casos de uso, como fornecer imagens diretamente para um navegador, streaming de vídeo e áudio etc. Dados não estruturados são dados que não estão em conformidade com um modelo ou formato de dados específico, como dados binários (como armazenamos nossos arquivos de mídia).
Neste tutorial, vamos construir uma Java API com Spring Boot que permite a você carregar seus arquivos, juntamente com quaisquer metadados que deseja armazenar. Quando você carrega seu arquivo, como uma imagem ou vídeo, ele será carregado no Azure Blob Storage. Ele armazenará os metadados, juntamente com um link para onde o arquivo está armazenado, em seu MongoDB database. Dessa forma, você obtém todos os benefícios dos MongoDB enquanto aproveita o modo como o Azure Blob Storage lida com esses arquivos grandes.
Se você é um desenvolvedor experiente ou está apenas começando, este guia foi desenvolvido para fornecer o conhecimento necessário para criar um back-end de gerenciamento de mídia que não seja apenas escalável, mas também otimizado para desempenho.
Vamos nos aprofundar nos pré-requisitos necessários para seguir este tutorial e, passo a passo, criaremos um sistema resiliente, eficiente e pronto para lidar com as demandas de um aplicativo moderno orientado a mídia.
- Java 11 ou superior
- Maven ou Gradle, mas este tutorial fará referência ao Maven
- Um cluster MongoDB implementado e configurado; se precisar de ajuda, confira nosso tutorial do MongoDB Atlas sobre como começar
Existem algumas maneiras diferentes de configurar seu armazenamento do Azure , mas usaremos o Portal do Microsoft Azure . Entre com sua conta doAzure e você será direcionado para a página inicial. Na parte superior da página, o Atlas Search "Contas de armazenamento."
Selecione "Storage Accounts. " "Storage accounts (classic) " não tem todas as funcionalidades necessárias para este tutorial.
Isso levará você para a página onde você criará uma conta de armazenamento (ou usará uma existente). Vamos configurar essa conta de armazenamento para ser aberta e acessível a qualquer pessoa que saiba a URL. Isso é adequado para esta demonstração, mas para a produção, você deve configurar isso para permitir apenas o acesso de pessoas/redes específicas. Saiba mais sobre como fazer isso na documentação do Microsoft Azure.
Selecione a assinatura e o grupo de recursos que deseja usar e dê um nome à sua conta de armazenamento. As configurações de região, desempenho e redundância dependem de seus planos com esse aplicativo, mas as camadas mais baixas têm todos os recursos de que precisamos.
Em redes, selecione para habilitar o acesso público de todas as redes. Isso pode não ser desejável para produção, mas para acompanhar este tutorial, ele nos permite ignorar as regras de configuração para acesso à rede.
Para todo o resto, podemos aceitar as configurações padrão. Depois que sua conta de armazenamento for criada, navegaremos até o recurso. Você pode fazer isso clicando em “Go to resource,” ou retornando à página inicial e ela será listada em seus recursos.
O próximo passo é configurar um container. Um container organiza um conjunto de blobs, semelhante a um diretório em um sistema de arquivos. Uma conta de armazenamento pode incluir um número ilimitado de containers, e um container pode armazenar um número ilimitado de blobs. Na folha esquerda, selecione a guia container e clique na opção mais container. Um menu será exibido onde você nomeia seu container (e configura o nível de acesso se não desejar o padrão, privado). Agora, vamos lançar nosso container!
Para conectar seu aplicativo ao Armazenamento Azure, crie seu
Shared Access Signature
(SES). O SA permite que você tenha controle granular sobre como seu cliente pode acessar os dados. Selecione "Shared access signature " no menu da face esquerda e configure-o para permitir os serviços e tipos de recursos que você deseja permitir. Para este tutorial, selecione "Object " nos tipos de recursos permitidos. O Object é para APIs em nível de blob, permitindo operações em blobs individuais, como carregar, baixar ou excluir uma imagem. O restante das configurações que você pode deixar como configuração padrão. Se você quiser saber mais sobre quais configurações são mais adequadas para seu aplicativo, consulte a documentação da Microsoft. Depois de defini-lo com as configurações desejadas, clique em "Generate SAS and connection string. " Seu ASS será gerado abaixo desse botão.Agora que temos nossa conta de armazenamento do Azure e cluster MongoDB configurados, vamos configurar nossa API. O que precisaremos é de uma forma de fazer upload de arquivos para nossa conta do Blob Storage e rastrear os metadados desse arquivo em uma coleção em nosso MongoDB database.
Para configurar nosso projeto, vamos usar o Spring Initializr. Isso gerará nosso arquivo pom.xml, que conterá nossas dependências para nosso projeto.
Para este projeto, você deseja selecionar as opções na captura de tela abaixo e criar um JAR:
- Projeto: Maven
- Linguagem: Java
- Dependências: Spring Web, Spring Data MongoDB e Azure Storage
- Gerar: JAR
Abra o projeto Maven no IDE de sua escolha e vamos escrever algum código!
Vamos precisar de algumas strings e chaves para nos conectar ao Azure Blob Storage e ao nosso MongoDB database. Para obter sua cadeia de conexão do MongoDB, faça login no MongoDB Atlas e clique em "Connect. " Se precisar de ajuda, confira nosso guia nos Docs.
Adicione isto ao seu arquivo
application.properties
. Aqui também definiremos o nome do banco de dados e a porta na qual desejamos executar nosso aplicativo. Não se preocupe se o banco de dados ou a coleção que usamos ainda não existir. No momento em que enviarmos nossos dados para ele, o MongoDB o criará.1 spring.data.mongodb.uri=mongodb+srv://<username>:<password>@<cluster>.mongodb.net/ 2 spring.data.mongodb.database=userPosts 3 server.port=8080
Em seguida, precisamos adicionar nossas informações do Azure Blob Storage. Adicionaremos a assinatura de acesso compartilhado e a string de conexão que geramos anteriormente e o nome do nosso container.
1 azure.blob-storage.connection-string=<connection.string> 2 spring.cloud.azure.storage.blob.container-name=<container.name>
Agora que temos tudo o que precisamos para nos conectar ao nosso blob e banco de dados, precisamos criar um endpoint para carregar uma imagem armazenada localmente e rastrear os metadados da imagem. Primeiro, vamos criar um modelo para os metadados da nossa imagem. Vamos criar um pacote em nosso projeto chamado
com.example.azureblob.model
e adicionar nossa classe ImageMetadata.java
.1 2 public class ImageMetadata { 3 4 5 private String id; 6 private String caption; 7 private String imageUrl; 8 9 // getters and setters 10 }
Dica: os IDEs mais populares terão atalhos para gerar getters e setters.
No início de nosso documento, usamos a anotação
@Document
para que o Spring Boot saiba a qual coleção em nosso MongoDB database esses dados serão adicionados. O MongoDB criará esta collection se ela ainda não existir. A anotação@Id
indica o que será utilizado como _id
. Se você não atribuir um _id
, o MongoDB gerará automaticamente um para cada novo documento.Adicionamos alguns campos que descrevem nossa imagem sendo carregada, incluindo o URL em que ela será armazenada. Essa URL será gerada quando inserirmos nossa imagem em nosso armazenamento de blobs.
A próxima etapa é usar este modelo e interagir com nossos dados no banco de dados. No Spring Boot, usamos uma interface de repositório. Ele tem todas as operações CRUD (create, read, update, delete) de que precisaremos. Vamos criar um pacote chamado
com.example.azureblob.repository
e adicionar nossa interface ImageMetadataRepository.java
.1 package com.example.azureblob.repositories; 2 3 import com.example.azureblob.models.ImageMetadata; 4 import org.springframework.data.mongodb.repository.MongoRepository; 5 6 public interface ImageMetadataRepository extends MongoRepository<ImageMetadata, String> { 7 }
Nosso repositório estenderá MongoRepository. Com o MongoRepository, você não precisa fornecer código de implementação para muitos métodos CRUD básicos para seu banco de MongoDB database, como salvar, findById, findAll, delete etc. O MongoDB gera automaticamente a implementação necessária com base nos nomes e convenções dos métodos.
Agora que temos o repositório configurado, é hora de configurar nossa camada de serviço. Ela atua como intermediária entre nosso repositório (camada de acesso a dados) e nosso controlador (pontos de extremidade REST) e contém a lógica comercial dos aplicativos. Criaremos outro pacote
com.example.azureblob.service
e adicionaremos nossa classe ImageMetadataService.java
.1 2 public class ImageMetadataService { 3 4 5 private ImageMetadataRepository imageMetadataRepository; 6 7 8 private String containerName; 9 10 11 private String connectionString; 12 13 private BlobServiceClient blobServiceClient; 14 15 16 public void init() { 17 blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient(); 18 } 19 20 public ImageMetadata save(ImageMetadata metadata) { 21 return imageMetadataRepository.save(metadata); 22 } 23 24 public List<ImageMetadata> findAll() { 25 return imageMetadataRepository.findAll(); 26 } 27 28 public Optional<ImageMetadata> findById(String id) { 29 return imageMetadataRepository.findById(id); 30 } 31 32 public String uploadImageWithCaption(MultipartFile imageFile, String caption) throws IOException { 33 String blobFileName = imageFile.getOriginalFilename(); 34 BlobClient blobClient = blobServiceClient.getBlobContainerClient(containerName).getBlobClient(blobFileName); 35 36 blobClient.upload(imageFile.getInputStream(), imageFile.getSize(), true); 37 38 String imageUrl = blobClient.getBlobUrl(); 39 40 ImageMetadata metadata = new ImageMetadata(); 41 metadata.setCaption(caption); 42 metadata.setImageUrl(imageUrl); 43 44 imageMetadataRepository.save(metadata); 45 46 return "Image and metadata uploaded successfully!"; 47 } 48 }
Aqui temos alguns de nossos métodos configurados para encontrar nossos documentos no MongoDB database e salvar nossos metadados. Nosso método
uploadImageWithCaption
contém a integração com o Azure Blob Storage. Aqui você pode ver que criamos um BlobServiceClient
para interagir com o Azure Blob Storage. Depois de conseguir carregar a imagem, ele obtém a URL do blob carregado. Em seguida, ele armazena isso, junto com nossos outros metadados para a imagem, em nosso MongoDB database.Nossa última etapa é configurar um controlador para estabelecer nossos endpoints para o aplicativo. Em um aplicativo Spring Boot, os drivers lidam com solicitações, processam dados e produzem respostas, tornando possível expor APIs e construir aplicativos web. Crie um pacote
com.example.azureblob.service
e adicione a classe ImageMetadataController.java
.1 2 3 public class ImageMetadataController { 4 5 6 private ImageMetadataService imageMetadataService; 7 8 9 public String uploadImageWithCaption( MultipartFile imageFile, String caption) throws IOException { 10 return imageMetadataService.uploadImageWithCaption(imageFile, caption); 11 } 12 13 14 public List<ImageMetadata> getAllImageMetadata() { 15 return imageMetadataService.findAll(); 16 } 17 18 19 public ImageMetadata getImageMetadataById( String id) { 20 return imageMetadataService.findById(id).orElse(null); 21 } 22 }
Aqui podemos recuperar todos os nossos documentos de metadados ou Atlas Search por
_id
e podemos fazer upload de nossos documentos.Isso deve ser tudo de que você precisa para carregar seus arquivos e armazenar os metadados no MongoDB. Vamos testá-lo! Você pode usar sua ferramenta favorita para testar API, mas usarei um comando cURL.
1 curl -F "image=mongodb-is-webscale.png" -F "caption=MongoDB is Webscale" http://localhost:8080/blob/upload
Agora, vamos verificar como isso fica em nosso banco de dados e no armazenamento Azure. Se procurarmos em nossa coleção no MongoDB, podemos ver nossos metadados, incluindo a URL da imagem. Aqui temos apenas alguns campos, mas, dependendo do seu aplicativo, você pode querer armazenar informações como quando o documento foi criado, o tipo de arquivo dos dados que estão sendo armazenados ou até mesmo o tamanho do arquivo.
Se quisermos ver como isso fica em nosso blob, podemos Go ao nosso Azure e verificar nosso container. E aqui está a nossa imagem!
Conforme demonstrado neste tutorial, a integração do Azure Blob Storage com uma API Java alimentada pelo Spring Boot fornece uma solução ideal para armazenar arquivos de mídia grandes, como imagens e vídeos. O Azure Blob Storage, a solução de armazenamento de objetos baseada na cloud da Microsoft, gerencia adequadamente grandes quantidades de dados não estruturados. Quando combinado com o gerenciamento eficiente do banco de dados do MongoDB, os usuários se beneficiam de uma ferramenta poderosa que facilita o upload de arquivos e o armazenamento de metadados pertinentes.
Neste tutorial, orientamos você na configuração de um MongoDB Atlas cluster e na configuração do Azure Storage. Demonstramos como construir uma API Java para interagir perfeitamente com ambas as plataformas. Além disso, detalhamos as etapas essenciais, desde o trabalho de base no Spring Initializr até a finalização dos endpoints em nosso controlador.
Se o seu objetivo é criar uma plataforma de mídia sofisticada, um sistema de gerenciamento de conteúdo ou qualquer aplicativo que envolva o armazenamento de grandes arquivos de mídia, este tutorial fornece as etapas para começar. Ao aproveitar a capacidade combinada do Azure Blob Storage e do MongoDB com uma API Java do Spring Boot, os desenvolvedores podem criar aplicativos escaláveis, eficientes e resilientes para a web moderna.
Quer saber mais sobre o que você pode fazer com o Microsoft Azure e o MongoDB? Confira alguns de nossos artigos no Centro de Desenvolvedores, como How to Use Azure Functions with MongoDB Atlas in Java.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.