Desplegando ms-filestorage: Almacenamiento de Archivos Abstraído y Resiliente
Continuamos con el despliegue de nuestro ecosistema. Ahora, abordaremos una necesidad universal en las aplicaciones modernas: la gestión de archivos. Para esta tarea, desplegaremos ms-filestorage
.
Este microservicio actúa como una capa de abstracción sobre diferentes proveedores de almacenamiento en la nube. En lugar de que cada microservicio tenga que implementar la lógica para conectarse a Azure Blob Storage, Amazon S3, o un sistema de archivos local, simplemente interactúan con la API estandarizada de ms-filestorage
.
Prerrequisitos
Section titled “Prerrequisitos”A diferencia de otros servicios que hemos desplegado, ms-filestorage
depende de un proveedor de almacenamiento en la nube externo para funcionar. En este tutorial, lo configuraremos para usar Azure Blob Storage.
Antes de continuar, necesitarás tener lo siguiente:
- Una Cuenta de Azure: Si no tienes una, puedes crear una cuenta gratuita.
- Una Cuenta de Almacenamiento (Storage Account): Dentro de tu suscripción de Azure, debes crear una “Storage Account”. Este es el recurso de Azure que contendrá tus “blobs” (archivos).
- Credenciales de Acceso: Una vez creada la cuenta de almacenamiento, necesitarás obtener dos piezas de información:
- El Nombre de la Cuenta (Account Name).
- Una Clave de Acceso (Access Key).
Con tu cuenta de almacenamiento creada y las credenciales a la mano, estás listo para continuar con el despliegue.
Un Vistazo a la Arquitectura de ms-filestorage
Section titled “Un Vistazo a la Arquitectura de ms-filestorage”Flujo de la API a los Casos de Uso (CQRS)
Section titled “Flujo de la API a los Casos de Uso (CQRS)”- Peticiones REST: La API expone endpoints clave para
Upload
(subir un archivo),Download
(descargar un archivo) y la gestión de metadatos. - Casos de Uso: La lógica se separa en Commands (
CreateFileStorage
,DeleteFileStorage
) y Queries (GetFileStorage
,Download
). LosCommands
exitosos emiten eventos comoFileStorageCreated
.
El Modelo de Dominio
Section titled “El Modelo de Dominio”El FileStorageAggregate
es el corazón del dominio. No almacena el archivo en sí, sino todos los metadatos asociados a él, incluyendo la información de cada archivo replicado (List<File>
) en los diferentes proveedores.
Parte 1: Configuración del Almacenamiento
Section titled “Parte 1: Configuración del Almacenamiento”ms-filestorage
utiliza una estrategia de configuración híbrida:
- Datos no sensibles (Variables de Entorno): Como la URL base para las descargas.
- Datos confidenciales (Vault): Como las claves de acceso a los proveedores de almacenamiento.
Variables de Configuración Clave
Section titled “Variables de Configuración Clave”FILESTORAGE__URIDOWNLOAD
: (Variable de Entorno) Esta es la URL pública base que el microservicio usará para construir los enlaces de descarga que devuelve a los clientes. Apunta a nuestro Gateway.FileStorage:AzureBlob:AccountName
: (Secreto en Vault) El nombre de tu cuenta de Azure Storage.FileStorage:AzureBlob:AccountKey
: (Secreto en Vault) La clave de acceso a tu cuenta de Azure Storage.
Despliegue y Configuración Paso a Paso
Section titled “Despliegue y Configuración Paso a Paso”-
Configurando los Secretos en Vault Añadimos las credenciales de los servicios base (RabbitMQ, Redis, Mongo) y, muy importante, las credenciales de nuestra cuenta de Azure Blob Storage.
Terminal window vault kv put -mount=inventory-keyvalue ms-filestorage `"RabbitMQ:UserName=<USERNAME_FROM_RABBITMQ_SECRET>" `"RabbitMQ:Password=<PASSWORD_FROM_RABBITMQ_SECRET>" `"Redis:Instances:Core:ConnectionString=<CONNECTION_STRING_FROM_REDIS>" `"Mongo:ConnectionString=<VAULT_TRANSIT_PASSWORD>" `"FileStorage:AzureBlob:AccountName=<ACCOUNT_NAME_FROM_AZURE_BLOB>" `"FileStorage:AzureBlob:AccountKey=<ACCOUNT_KEY_FROM_AZURE_BLOB>"Verificamos que los secretos se hayan guardado correctamente en la interfaz web de Vault.
-
Desplegando con Helm desde ArtifactHub
ms-filestorage
solo expone una API REST, por lo que desplegaremos un único Helm Chart.-
Preparar el
values-rest.yaml
Local Creamos un archivovalues-rest.yaml
con la configuración de las variables de entorno y la conexión a Vault.# values-rest.yaml para ms-filestorage-restms-base:env:- name: RESOURCES__ENABLEvalue: "true"- name: RESOURCES__SERVERvalue: "http://ms-services-grpc.inventory.svc.cluster.local:5001"# ... (otras variables de entorno como Security, Logger, etc.)- name: FILESTORAGE__URIDOWNLOADvalue: "https://services.codedesignplus.app/ms-filestorage/api/FileStorage/Download"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventoryservice: ms-filestoragetoken: <VAULT_ROOT_TOKEN>virtualService:create: truenamespace: istio-ingresshosts:- services.codedesignplus.appgateways:- istio-ingress/istio-inventory-gatewayhttp:- name: ms-filestoragematch:- uri:prefix: /ms-filestorage/rewrite:uri: /route:- destination:host: ms-filestorage-rest.inventory.svc.cluster.localport:number: 5000 -
Ejecutar el Despliegue con Helm Usamos
helm upgrade --install
para desplegar el chart en el namespaceinventory
.Terminal window helm upgrade --install ms-filestorage-rest codedesignplus/ms-filestorage-rest -f ./values-rest.yaml --namespace inventory
-
Parte 3: Verificación del Despliegue
Section titled “Parte 3: Verificación del Despliegue”-
Verificar el Pod en Lens En Lens, bajo “Workloads > Pods”, ahora vemos nuestro nuevo pod
ms-filestorage-rest
corriendo en el namespaceinventory
. -
Verificar el
VirtualService
de Istio El Helm chart ha creado automáticamente elVirtualService
que enruta el tráfico desde nuestro Gateway. -
Probar el Acceso a la API
-
Endpoint de Salud: Verificamos que el servicio está vivo accediendo a su endpoint de salud:
https://services.codedesignplus.app/ms-filestorage/health/ready
Deberías ver una respuesta “Healthy”.
-
Swagger UI: Para explorar la API, usamos la interfaz de Swagger UI:
https://services.codedesignplus.app/ms-filestorage/index.html
Aquí puedes ver los endpoints para
Upload
,Download
y la gestión de los metadatos de los archivos.
-
Conclusión
Section titled “Conclusión”Has desplegado con éxito ms-filestorage
, una pieza de infraestructura fundamental que abstrae y centraliza la gestión de archivos. Al separar esta lógica en su propio microservicio, hemos hecho que el resto de nuestros servicios de dominio sean más simples y se enfoquen únicamente en su lógica de negocio.
Con este componente en su lugar, nuestra plataforma está lista para manejar contenido multimedia, documentos y cualquier otro tipo de archivo que nuestra aplicación de inventario pueda necesitar.