Esta es la novena entrega de nuestra serie sobre patrones de arquitectura de microservicios. En capítulos previos, hemos abordado aspectos como la comunicación sincrónica y asíncrona, la orquestación de procesos y la resiliencia ante fallos. Si quieres un panorama aún más amplio de cómo diseñar, desplegar y operar microservicios de manera profesional, te invitamos a revisar los posts anteriores:

  1. Patrones de arquitectura de microservicios, ¿qué son y qué ventajas nos ofrecen?
  2. Patrones de arquitectura: organización y estructura de microservicios
  3. Patrones de arquitectura: comunicación y coordinación de microservicios
  4. Patrones de arquitectura de microservicios: SAGA, API Gateway y Service Discovery
  5. Patrones de arquitectura de microservicios: Event Sourcing y arquitectura orientada a eventos (EDA)
  6. Patrones de arquitectura de microservicios: comunicación y coordinación con CQRS, BFF y Outbox
  7. Patrones de microservicios: escalabilidad y gestión de recursos con escalado automático
  8. Patrones de arquitectura: de monolitos a microservicios

En el ecosistema moderno de TI, los microservicios se han convertido en una de las estrategias predilectas para diseñar y escalar aplicaciones complejas.

En este artículo abordaremos en detalle un patrón arquitectónico clave, se trata del patrón de configuración externalizada (Externalized Configuration) y veremos:

El contexto de eCommerce resulta idóneo para ilustrar este patrón, por eso lo utilizaremos como en el resto de posts de la serie, pues suele implicar múltiples dominios y servicios especializados: un catálogo de productos (catalog), un módulo de pedidos (orders), un servicio de pagos (payment), un servicio de logística (shipping), entre otros. Cada uno con sus propias dependencias, configuraciones y diferentes APIs expuestas que consumen el resto de módulos.

Retos de un entorno de microservicios en la gestión de la configuración

Antes de entrar en materia, conviene reforzar por qué este patrón es tan necesario en una arquitectura de microservicios:

Con estos antecedentes en mente, pasemos directamente a desgranar el patrón y su implementación con especial foco en ejemplos técnicos.

Configuración externalizada (Externalized Configuration)

Estructura de la configuración externalizada en microservicios

*El almacenamiento no tiene por qué ser en el cloud.

1 Fundamentos del patrón

La configuración externalizada se basa en la idea de que toda la información variable o sensible de un servicio debe residir fuera del propio binario. Esto implica que credenciales de bases de datos, tokens de pasarelas de pago, URLs de dependencias o parámetros de negocio no deben “incrustarse” en el código fuente o en los ficheros de configuración internos del proyecto, sino que deben ser proporcionados en tiempo de despliegue o, idealmente, gestionados por un servicio aparte.

2 Beneficios clave

  1. Seguridad y gobernanza
  1. Flexibilidad de despliegue
  1. Mantenibilidad y escalabilidad

3 Métodos para externalizar la configuración

A grandes rasgos, existen tres aproximaciones habituales: variables de entorno, ficheros externos y servicios de configuración centralizada. Veamos cada una con mayor profundidad.

  1. Variables de entorno

Docker: al arrancar un contenedor con docker run, podemos definir:

docker run -d \
  -e DB_USER=admin \
  -e DB_PASS=secret123 \
  -e SPRING_PROFILES_ACTIVE=prod \
  --name orders-service \
  myrepo/orders-service:latest

Aquí, DB_USER y DB_PASS se leen dentro del servicio con System.getenv(), o mediante las propiedades en Spring Boot (spring.datasource.username=${DB_USER}, etc.)

Kubernetes: se usa un ConfigMap para variables genéricas y un Secret para credenciales o valores sensibles.
Un ejemplo de Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: orders-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: orders-service
  template:
    metadata:
      labels:
        app: orders-service
    spec:
      containers:
      - name: orders-service
        image: myrepo/orders-service:latest
        env:
          - name: DB_USER
            valueFrom:
              configMapKeyRef:
                name: orders-config
                key: db-user
          - name: DB_PASS
            valueFrom:
              secretKeyRef:
                name: orders-secrets
                key: db-pass

De este modo, cada pod hereda la configuración adecuada.

Ventajas:

Limitaciones:

Ficheros externos versionados

Otra opción consiste en almacenar los parámetros en ficheros de configuración (YAML, JSON, Properties) ubicados fuera de la carpeta principal del servicio, pero accesibles en tiempo de ejecución.

Por ejemplo, en application-prod.yml podríamos tener:

payment:
  provider: "Stripe"
  api-key: "sk_live_XYZ123"
catalog:
  url: "http://catalog-service:8080"

Estos ficheros se pueden montar como volumen en contenedores Docker, descargar en tiempo de despliegue desde un repositorio Git independiente (GitOps) e integrar con frameworks (Spring Boot permite importar ficheros adicionales con spring.config.additional-location).

Ventajas:

Inconvenientes:

Servicios de configuración centralizada

Para grandes ecosistemas de microservicios, un servidor de configuración se convierte en una pieza fundamental. Algunas herramientas populares:

Ventajas:

Desventajas:

3 Ejemplo detallado en un eCommerce con Spring Boot y Kubernetes

Imagina que nuestra plataforma eCommerce se compone de cuatro microservicios:

  1. Config Server:
server:
  port: 8888
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/config-repo
          default-label: main
  1. Repositorio Git “config-repo”:
catalog:
  db:
    url: "jdbc:postgresql://prod-db-host/catalog"
    user: "catalog_user"
    pass: "SuperSecretPass"
  cache-ttl: 300
  1. catalog-service (microservicio en Spring Boot)
spring:
  application:
    name: catalog-service
  cloud:
    config:
      uri: http://config-server:8888
      profile: prod
      label: main
  1. Despliegue en Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: catalog-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: catalog-service
  template:
    metadata:
      labels:
        app: catalog-service
    spec:
      containers:
      - name: catalog-service
        image: myrepo/catalog-service:latest
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: "prod"
          - name: SPRING_CLOUD_CONFIG_URI
            value: "http://config-server:8888"
  1. Cambio en la configuración:

Este flujo se repite para orders-service, payment-service y así sucesivamente, manteniendo la configuración en un lugar central y versionado. A medida que la plataforma crece, esta práctica se vuelve fundamental para la gobernanza y la seguridad.

Beneficios de la configuración externalizada

Buenas prácticas generales

Conclusiones y siguientes pasos

Las arquitecturas de microservicios brindan escalabilidad y flexibilidad, pero exigen prácticas de gestión y verificación sólidas para mantener la coherencia en un entorno distribuido. Para elaborar una solución más efectiva a los problemas habituales sería:

En la siguiente entrega veremos Consumer-Driven Contract Testing (CDCT) y, si tienes algún comentario, te leemos 👇.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete