Desplegando ms-tenants: La Base del Multi-Tenancy
Llegamos a uno de los microservicios más importantes de cualquier aplicación SaaS (Software as a Service): ms-tenants
. Este componente es el corazón de la arquitectura multi-tenant, responsable de gestionar las entidades de más alto nivel de nuestra aplicación: los inquilinos.
Un “tenant” representa a un cliente o una organización individual que utiliza nuestra plataforma. ms-tenants
se encarga de mantener toda su información de perfil, su ubicación y, crucialmente, la licencia que tienen asociada.
Un Vistazo a la Arquitectura de ms-tenants
Section titled “Un Vistazo a la Arquitectura de ms-tenants”Flujo de la API a los Casos de Uso (CQRS)
Section titled “Flujo de la API a los Casos de Uso (CQRS)”- REST y gRPC:
ms-tenants
expone una API REST para la gestión y una API gRPC para la comunicación interna de alto rendimiento con otros servicios. - Casos de Uso: La lógica de negocio se separa en Commands (para crear, actualizar o eliminar tenants) y Queries (para consultar su información).
El Modelo de Dominio: Un Agregado Central
Section titled “El Modelo de Dominio: Un Agregado Central”El verdadero poder de ms-tenants
se revela en su modelo de dominio, que actúa como un nexo de unión entre diferentes contextos del negocio.
El TenantAggregate
es un agregado rico y complejo. No solo contiene la información básica del inquilino, sino que también mantiene referencias a otros dominios importantes:
License
: Cada tenant tiene una licencia asociada.Location
: Cada tenant está vinculado a una ubicación geográfica (País, Ciudad, etc.), que es gestionada porms-locations
.
Despliegue y Configuración Paso a Paso
Section titled “Despliegue y Configuración Paso a Paso”-
Configurando los Secretos en Vault
ms-tenants
requiere las credenciales base para conectarse a RabbitMQ, Redis y MongoDB.Terminal window vault kv put -mount=inventory-keyvalue ms-tenants `"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>"Verificamos que los secretos se hayan guardado correctamente en la interfaz web de Vault.
-
Desplegando con Helm desde ArtifactHub Para este tutorial, desplegaremos el entrypoint REST de
ms-tenants
.-
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-tenants-restms-base:env:- name: RESOURCES__ENABLEvalue: "true"- name: RESOURCES__SERVERvalue: "http://ms-services-grpc.inventory.svc.cluster.local:5001"- name: SECURITY__VALIDISSUERvalue: "https://devcodedesignplus.ciamlogin.com/dfee7752-2c8a-4171-ad95-62ddc82d6ed8/v2.0/"- name: SECURITY__CLIENTIDvalue: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: SECURITY__VALIDAUDIENCES__0value: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: RABBITMQ__HOSTvalue: "rabbitmq-cluster.srv-rabbitmq.svc"- name: LOGGER__OTELENDPOINTvalue: "http://inventory-opentelemetry-collector.otel-inventory.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-inventory.svc.cluster.local:4317"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventorytoken: ANGq0*B2acD1n5%FvirtualService:create: truenamespace: istio-ingresshosts:- services.codedesignplus.appgateways:- istio-ingress/istio-inventory-gatewayhttp:- name: ms-tenantsmatch:- uri:prefix: /ms-tenants/rewrite:uri: /route:- destination:host: ms-tenants-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-tenants-rest codedesignplus/ms-tenants-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-tenants-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-tenants/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-tenants/index.html
Aquí puedes ver todos los endpoints disponibles para gestionar los Tenants de la plataforma.
-
Conclusión
Section titled “Conclusión”Has desplegado con éxito ms-tenants
, el servicio que gestionará las entidades de más alto nivel en tu aplicación. Este microservicio es un excelente ejemplo de cómo el Domain-Driven Design nos ayuda a modelar contextos de negocio complejos y a establecer relaciones claras entre diferentes dominios.
Con los tenants en su lugar, ahora tenemos la entidad principal a la cual podremos asociar usuarios, aplicar licencias y configurar permisos, acercándonos cada vez más a una aplicación completamente funcional.