Desplegando ms-users: El Perfil Central del Ecosistema
Hasta ahora, hemos gestionado conceptos abstractos como roles, permisos e inquilinos. Ahora, desplegaremos el microservicio que les da un rostro humano: ms-users. Este componente es el corazón de la gestión de perfiles de nuestra aplicación.
Mientras que Microsoft Entra ID se encarga de la identidad (autenticación), ms-users se encarga del perfil de usuario dentro de nuestro dominio de negocio. Almacena información rica y específica de la aplicación, como su información de contacto, puesto de trabajo, foto de perfil y, lo más importante, a qué Tenants y Roles está asociado.
Un Vistazo a la Arquitectura de ms-users
Section titled “Un Vistazo a la Arquitectura de ms-users”ms-users es un servicio multifacético que utiliza los tres tipos de entrypoints para cumplir con sus diversas responsabilidades.
Flujo de la API a los Casos de Uso (CQRS)
Section titled “Flujo de la API a los Casos de Uso (CQRS)”- REST: Expone una API de gestión muy completa para operaciones CRUD sobre los usuarios y sus entidades relacionadas (asignar/remover tenants, roles, etc.).
- gRPC: Ofrece endpoints de alto rendimiento para que otros servicios internos interactúen con los usuarios (ej.
AddGroupToUser). - Async Worker: Su única y crucial tarea es escuchar el evento
UserCreatedproveniente dems-microsoft-graphy replicar el usuario en su propia base de datos.
El Modelo de Dominio
Section titled “El Modelo de Dominio”El UserAggregate es el agregado central que encapsula toda la complejidad de un perfil de usuario.
Como podemos ver, el Agregado gestiona no solo los datos básicos del usuario, sino también sus relaciones con TenantEntity, ContactInfo, JobInfo, y UserPicture, asegurando la consistencia de todas estas partes como una sola unidad transaccional.
Despliegue y Configuración Paso a Paso
Section titled “Despliegue y Configuración Paso a Paso”-
Configurando los Secretos en Vault
ms-usersnecesita las credenciales base para conectarse a RabbitMQ, Redis y MongoDB.Terminal window vault kv put -mount=inventory-keyvalue ms-users `"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 los Entrypoints con Helm Desplegaremos los tres Helm Charts para
ms-usersen el namespaceinventory.-
Preparar los Archivos
values.yamlNecesitaremos tres archivos:values-rest.yaml,values-grpc.yamlyvalues-worker.yaml. La estructura es la misma que hemos usado en los microservicios anteriores, definiendo las variables de entorno no sensibles y la conexión a Vault.values-rest.yaml ms-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-collector.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-collector.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-gatewayhttp:- name: ms-usersmatch:- uri:prefix: /ms-users/rewrite:uri: /route:- destination:host: ms-users-rest.inventory.svc.cluster.localport:number: 5000values-grpc.yaml ms-base:env:- name: RESOURCES__ENABLEvalue: "false"- 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-collector.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventorytoken: ANGq0*B2acD1n5%Fvalues-worker.yaml ms-base:env:- name: RESOURCES__ENABLEvalue: "false"- 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-collector.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventorytoken: ANGq0*B2acD1n5%F -
Ejecutar el Despliegue con Helm Instalamos los tres charts.
Terminal window # Desplegar el entrypoint RESThelm upgrade --install ms-users-rest codedesignplus/ms-users-rest -f ./values-rest.yaml --namespace inventory# Desplegar el entrypoint gRPChelm upgrade --install ms-users-grpc codedesignplus/ms-users-grpc -f ./values-grpc.yaml --namespace inventory# Desplegar el entrypoint Async Workerhelm upgrade --install ms-users-worker codedesignplus/ms-users-worker -f ./values-worker.yaml --namespace inventory


-
Parte 3: Verificación del Despliegue
Section titled “Parte 3: Verificación del Despliegue”-
Verificar los Pods en Lens En Lens, bajo “Workloads > Pods”, ahora vemos los tres nuevos pods para
ms-users-rest,ms-users-grpcyms-users-worker, todos corriendo en el namespaceinventory.
-
Verificar el
VirtualServicede Istio El Helm chart dems-users-restha creado automáticamente elVirtualServiceque 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-users/health/readyDeberías ver una respuesta “Healthy”.

-
Swagger UI: Para explorar la API de gestión, usamos la interfaz de Swagger UI:
https://services.codedesignplus.app/ms-users/index.htmlAquí puedes ver la extensa API para gestionar usuarios, asignarles roles, tenants, y actualizar toda su información de perfil.

-
Conclusión
Section titled “Conclusión”Has desplegado con éxito ms-users, el microservicio que actúa como el nexo central de la interacción del usuario con la aplicación. Hemos visto cómo su arquitectura de múltiples entrypoints le permite manejar tareas de gestión (REST), comunicación interna de alto rendimiento (gRPC) y procesamiento asíncrono de eventos (Worker).
Con ms-users en su lugar, ahora tenemos la capacidad de asociar a los usuarios con los Tenants y Roles que hemos definido anteriormente, completando el núcleo de nuestro sistema de identidad y acceso.