En pocas palabras
Runtime de aplicaciones distribuidas que ofrece bloques reutilizables para comunicación, estado y eventos.
Qué problema resuelve
Implementaciones repetidas de integración y resiliencia específicas de cada proveedor.
Cuándo utilizarlo
Microservicios con varias tecnologías. Ejemplo: publicar eventos mediante una API uniforme.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
En el Radar compartido: Trial (valoración de la edición aportada).
Cómo funciona
Expone capacidades como service invocation, pub/sub, state stores y actores a través de APIs y componentes. Habitualmente acompaña a los servicios como sidecar.
Ejemplo de uso
Un servicio de pedidos publica un evento mediante Dapr y un consumidor se suscribe. Cambiar el componente de mensajería requiere revisar entrega, orden y reintentos del nuevo backend.
Building blocks
| Bloque | Qué abstrae |
|---|---|
| Service invocation | Llamadas entre servicios con descubrimiento, mTLS y reintentos |
| Pub/sub | Publicar y suscribirse con Kafka, Pub/Sub, RabbitMQ, Service Bus… |
| State management | Almacén clave-valor con concurrencia optimista (Redis, PostgreSQL, Cosmos DB…) |
| Bindings | Entradas y salidas hacia sistemas externos (colas, cron, S3) |
| Actors | Objetos con estado y un solo hilo, activados bajo demanda |
| Workflow | Orquestación duradera de procesos largos |
| Secrets / Configuration | Lectura de secretos y configuración desde un proveedor |
| Jobs, Distributed lock, Cryptography, Conversation | Programación, bloqueos, cifrado e interfaz común a LLM |
Componentes intercambiables
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: eventos
spec:
type: pubsub.kafka
version: v1
metadata:
- name: brokers
value: kafka:9092
- name: authType
value: none
La aplicación publica siempre igual, sin depender del SDK de Kafka:
curl -X POST http://localhost:3500/v1.0/publish/eventos/credito-desembolsado \
-H 'Content-Type: application/json' -d '{"creditoId":"42"}'
En local puede ser Redis y en producción Kafka o Google Pub/Sub, cambiando solo el componente.
Resiliencia declarativa
apiVersion: dapr.io/v1alpha1
kind: Resiliency
metadata:
name: politicas
spec:
policies:
timeouts:
general: 3s
retries:
reintentoCorto:
policy: exponential
maxRetries: 3
circuitBreakers:
cbBuro:
maxRequests: 1
timeout: 30s
trip: consecutiveFailures >= 5
targets:
apps:
servicio-buro:
timeout: general
retry: reintentoCorto
circuitBreaker: cbBuro
Aplica los patrones de resiliencia fuera del código de la aplicación.
Despliegue
En Kubernetes se activa con anotaciones en el pod (dapr.io/enabled: "true", dapr.io/app-id: originacion) y el sidecar se inyecta automáticamente. En local, dapr run --app-id originacion -- java -jar app.jar. Dapr es un proyecto graduado de la CNCF.
Cuándo compensa
| Compensa | No compensa |
|---|---|
| Muchos servicios políglotas que necesitan los mismos patrones | Un par de servicios en un solo lenguaje con buenas librerías |
| Portabilidad real entre nubes o entornos | Plataforma serverless sin soporte de sidecar |
| Equipo de plataforma que mantiene los componentes | Equipos que no pueden operar otra pieza |
La abstracción tiene límites: las garantías de orden, entrega y transacciones dependen del backend elegido, no de Dapr.
Criterios de implementación
Medir la sobrecarga y configurar identidad, mTLS y secretos. Probar fallos e idempotencia; adoptar solo los bloques que reduzcan complejidad real.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.