Summary
Replace direct HTTP calls between services with Dapr Service Invocation for automatic mTLS, retries, service discovery, and observability.
Current State
- Services call each other via direct HTTP (e.g.,
httpx.post("http://notification-service:8001/..."))
- No automatic retries on transient failures
- No mTLS between services
- Service URLs hardcoded or in config
- No distributed tracing propagation
Proposed Architecture
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ API Service │────►│ Dapr │────►│ Dapr │────►│ Notification │
│ │ │ Sidecar │ │ Sidecar │ │ Service │
│ │ │ (mTLS) │ │ (mTLS) │ │ │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────────┘
# Instead of:
await httpx.post("http://notification-service:8001/notify", json=data)
# Use Dapr Service Invocation:
await dapr_client.invoke_method("notification-service", "notify", data)
Benefits
| Feature |
Direct HTTP |
Dapr Invocation |
| mTLS |
Manual setup |
Automatic ✅ |
| Retries |
Manual implementation |
Built-in ✅ |
| Service Discovery |
Hardcoded URLs |
Automatic ✅ |
| Load Balancing |
External LB needed |
Built-in ✅ |
| Tracing |
Manual propagation |
Automatic ✅ |
| Circuit Breaker |
Manual implementation |
Configurable ✅ |
Implementation Steps
Acceptance Criteria
Technical Notes
# Dapr Service Invocation example
from dapr.clients import DaprClient
async with DaprClient() as client:
# Invoke method on another service
response = await client.invoke_method(
app_id="notification-service",
method_name="notify",
data=json.dumps(payload),
content_type="application/json",
)
# Dapr retry policy (resiliency.yaml)
apiVersion: dapr.io/v1alpha1
kind: Resiliency
metadata:
name: service-resiliency
spec:
policies:
retries:
default:
policy: constant
maxRetries: 3
duration: 1s
Labels
enhancement learning dapr security observability phase-v2
📚 Learning Goal: Dapr Service Invocation Building Block + Resiliency Patterns
Summary
Replace direct HTTP calls between services with Dapr Service Invocation for automatic mTLS, retries, service discovery, and observability.
Current State
httpx.post("http://notification-service:8001/..."))Proposed Architecture
Benefits
Implementation Steps
dapr_invoke.pyutility moduleAcceptance Criteria
Technical Notes
Labels
enhancementlearningdaprsecurityobservabilityphase-v2📚 Learning Goal: Dapr Service Invocation Building Block + Resiliency Patterns