337 lines
10 KiB
Markdown
337 lines
10 KiB
Markdown
# Client Integration Guide - Notifier Service
|
|
|
|
**Quick links for different use cases:**
|
|
|
|
## 📚 Documentation Index
|
|
|
|
### For Developers Building New Clients
|
|
|
|
1. **Start Here:** [`docs/QUICK_START_CLIENT.md`](docs/QUICK_START_CLIENT.md)
|
|
- 5-minute quick start guide
|
|
- Complete minimal working example
|
|
- Essential requirements checklist
|
|
|
|
2. **AI Assistant Prompt:** [`docs/CLIENT_INTEGRATION_PROMPT.md`](docs/CLIENT_INTEGRATION_PROMPT.md)
|
|
- Copy-paste prompt for Claude/ChatGPT/etc.
|
|
- Generates production-ready client code
|
|
- Includes all requirements and best practices
|
|
|
|
3. **Performance Deep Dive:** [`docs/GRPC_CONNECTION_OPTIMIZATION.md`](docs/GRPC_CONNECTION_OPTIMIZATION.md)
|
|
- Why long-lived connections matter (10x faster!)
|
|
- Connection pooling strategies
|
|
- Keepalive configuration
|
|
- Resilience patterns
|
|
|
|
4. **Best Practices:** [`docs/CLIENT_RECOMMENDATIONS.md`](docs/CLIENT_RECOMMENDATIONS.md)
|
|
- Advanced patterns
|
|
- Security hardening
|
|
- Observability and monitoring
|
|
- Testing strategies
|
|
|
|
### For Kubernetes Deployments
|
|
|
|
5. **CORS and Kubernetes:** [`docs/CORS_KUBERNETES_GUIDE.md`](docs/CORS_KUBERNETES_GUIDE.md)
|
|
- Do you need CORS? (Spoiler: Not for gRPC!)
|
|
- Service-to-service communication
|
|
- When CORS matters (web frontends)
|
|
|
|
6. **CORS Implementation:** [`docs/CORS_IMPLEMENTATION.md`](docs/CORS_IMPLEMENTATION.md)
|
|
- Technical details of CORS security
|
|
- Configuration examples
|
|
- Migration guide
|
|
|
|
### For Authentication & Security
|
|
|
|
7. **Authentication Guide:** [`docs/AUTH.md`](docs/AUTH.md)
|
|
- Complete auth system documentation
|
|
- API key management
|
|
- Role-based access control (RBAC)
|
|
|
|
## 🎯 Quick Decision Tree
|
|
|
|
### "I need to build a new client application"
|
|
|
|
**Option A: Using AI Assistant (Recommended)**
|
|
→ Use [`CLIENT_INTEGRATION_PROMPT.md`](docs/CLIENT_INTEGRATION_PROMPT.md)
|
|
→ Paste the prompt into Claude/ChatGPT
|
|
→ Review generated code against checklist below
|
|
|
|
**Option B: Manual Implementation**
|
|
→ Start with [`QUICK_START_CLIENT.md`](docs/QUICK_START_CLIENT.md)
|
|
→ Copy the complete example
|
|
→ Customize for your needs
|
|
→ Reference [`GRPC_CONNECTION_OPTIMIZATION.md`](docs/GRPC_CONNECTION_OPTIMIZATION.md) for performance
|
|
|
|
### "I'm deploying to Kubernetes"
|
|
|
|
→ Read [`CORS_KUBERNETES_GUIDE.md`](docs/CORS_KUBERNETES_GUIDE.md) first
|
|
→ No CORS needed for backend gRPC communication! ✅
|
|
→ Configure Kubernetes Secret for API key
|
|
→ Use service DNS: `notifier-grpc:50051`
|
|
|
|
### "My client is too slow"
|
|
|
|
→ Check [`GRPC_CONNECTION_OPTIMIZATION.md`](docs/GRPC_CONNECTION_OPTIMIZATION.md)
|
|
→ Verify you're using long-lived connections (not creating per request)
|
|
→ Add keepalive configuration
|
|
→ Consider connection pooling for high throughput
|
|
|
|
### "Authentication isn't working"
|
|
|
|
→ See [`AUTH.md`](docs/AUTH.md) for troubleshooting
|
|
→ Verify API key format: `nk_` + 64 hex characters
|
|
→ Check you're sending it in metadata with every request
|
|
→ Confirm key is active and has required roles
|
|
|
|
## ✅ Client Implementation Checklist
|
|
|
|
Use this checklist to verify your client implementation:
|
|
|
|
### Connection Management
|
|
- [ ] Using single long-lived connection (created at startup)
|
|
- [ ] Connection reused for all requests (not creating per request)
|
|
- [ ] Keepalive configured (10s ping, 3s timeout)
|
|
- [ ] Connection closed on application shutdown
|
|
- [ ] Health checks implemented (every 30-60s)
|
|
|
|
### Authentication
|
|
- [ ] API key loaded from environment variable (`NOTIFIER_API_KEY`)
|
|
- [ ] API key sent in metadata with every request
|
|
- [ ] Using correct format: `authorization: Bearer nk_...`
|
|
- [ ] No hardcoded credentials in source code
|
|
- [ ] API key masked in logs (never logged in full)
|
|
|
|
### Error Handling
|
|
- [ ] Rate limit errors retry with exponential backoff
|
|
- [ ] Authentication errors logged and not retried
|
|
- [ ] Invalid argument errors logged and not retried
|
|
- [ ] Unavailable errors retry with backoff
|
|
- [ ] Maximum retry limit enforced (3-5 attempts)
|
|
|
|
### Context & Timeouts
|
|
- [ ] Every request uses context with timeout (5-30s)
|
|
- [ ] Contexts properly cancelled with defer
|
|
- [ ] Deadline exceeded errors handled gracefully
|
|
|
|
### Security
|
|
- [ ] Credentials in Kubernetes Secret (not ConfigMap)
|
|
- [ ] No credentials in Docker image layers
|
|
- [ ] `.gitignore` excludes credential files
|
|
- [ ] No sensitive data in logs or metrics labels
|
|
|
|
### Observability
|
|
- [ ] Connection establishment logged (info level)
|
|
- [ ] Errors logged with appropriate levels
|
|
- [ ] Success responses logged (debug level)
|
|
- [ ] Metrics instrumented (if using Prometheus)
|
|
- [ ] Distributed tracing integrated (if using OpenTelemetry)
|
|
|
|
### Testing
|
|
- [ ] Unit tests with mocked client
|
|
- [ ] Retry logic tested
|
|
- [ ] Error handling tested
|
|
- [ ] Integration tests (if service available)
|
|
|
|
### Production Readiness
|
|
- [ ] Graceful shutdown implemented
|
|
- [ ] Circuit breaker pattern (optional, for resilience)
|
|
- [ ] Notification failures don't crash application
|
|
- [ ] Health check endpoint exposed (if needed)
|
|
|
|
## 🔐 API Key Management
|
|
|
|
### Getting an API Key
|
|
|
|
Contact your Notifier service administrator to create a key:
|
|
|
|
```bash
|
|
# Using the notifier CLI (if available)
|
|
notifier-cli keys create \
|
|
--client-id "my-application" \
|
|
--roles "email,slack" \
|
|
--rate-limit 1000
|
|
|
|
# Output:
|
|
# Created API key: nk_a1b2c3d4e5f6...
|
|
# Save this key securely - it won't be shown again!
|
|
```
|
|
|
|
### API Key Format
|
|
|
|
```
|
|
nk_<64 hex characters>
|
|
|
|
Example:
|
|
nk_a1b2c3d4e5f6789012345678901234567890123456789012345678901234
|
|
│ └─────────────────────────────────────────────────────────┘
|
|
│ 64 characters
|
|
└── Prefix (always "nk_")
|
|
```
|
|
|
|
### Storing API Keys
|
|
|
|
**Development:**
|
|
```bash
|
|
export NOTIFIER_API_KEY="nk_your_dev_key_here"
|
|
```
|
|
|
|
**Production (Kubernetes):**
|
|
```yaml
|
|
# 1. Create secret
|
|
kubectl create secret generic notifier-credentials \
|
|
--from-literal=api-key=nk_your_prod_key_here
|
|
|
|
# 2. Reference in deployment
|
|
env:
|
|
- name: NOTIFIER_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: notifier-credentials
|
|
key: api-key
|
|
```
|
|
|
|
### Rate Limits
|
|
|
|
Default: **100 requests per minute** (configurable per key)
|
|
|
|
When rate limit is exceeded:
|
|
- Error code: `codes.ResourceExhausted`
|
|
- Retry after: 60 seconds (check `Retry-After` header)
|
|
- Strategy: Implement exponential backoff
|
|
|
|
To request higher rate limit, contact your administrator.
|
|
|
|
## 🚀 Example Implementations
|
|
|
|
### Minimal Example (50 lines)
|
|
|
|
See [`QUICK_START_CLIENT.md`](docs/QUICK_START_CLIENT.md) for complete code.
|
|
|
|
### Production-Ready Example
|
|
|
|
Use the AI assistant prompt in [`CLIENT_INTEGRATION_PROMPT.md`](docs/CLIENT_INTEGRATION_PROMPT.md) to generate a complete implementation with:
|
|
- Connection pooling
|
|
- Retry logic
|
|
- Health checks
|
|
- Metrics
|
|
- Graceful shutdown
|
|
- Unit tests
|
|
|
|
### Language-Specific Examples
|
|
|
|
**Go:** See `QUICK_START_CLIENT.md` (complete example included)
|
|
|
|
**Python/Java/Node.js:** Use the prompt in `CLIENT_INTEGRATION_PROMPT.md` with your AI assistant and specify your language:
|
|
|
|
```
|
|
[Include the prompt from CLIENT_INTEGRATION_PROMPT.md]
|
|
|
|
Please implement this in Python using the grpcio library.
|
|
```
|
|
|
|
## 🔧 Troubleshooting
|
|
|
|
### Common Issues and Solutions
|
|
|
|
| Issue | Symptom | Solution |
|
|
|-------|---------|----------|
|
|
| **Slow performance** | 10-15ms per request | Verify using long-lived connection, not creating new connection per request |
|
|
| **Authentication failed** | `codes.Unauthenticated` | Check API key format, confirm key is active, verify metadata header |
|
|
| **Rate limit exceeded** | `codes.ResourceExhausted` | Implement exponential backoff retry, consider batching requests |
|
|
| **Connection timeout** | Requests hang indefinitely | Add keepalive configuration, set context timeout |
|
|
| **Connection dropped** | Errors after idle period | Configure keepalive: 10s ping interval |
|
|
| **Health checks failing** | Service appears down | Check network connectivity, verify service is running, check DNS resolution |
|
|
|
|
### Debug Checklist
|
|
|
|
```bash
|
|
# 1. Verify service is running
|
|
kubectl get pods -l app=notifier
|
|
kubectl get svc notifier-grpc
|
|
|
|
# 2. Check service is reachable
|
|
kubectl run -it --rm debug --image=busybox --restart=Never -- \
|
|
nslookup notifier-grpc
|
|
|
|
# 3. Test gRPC connectivity (if grpcurl installed)
|
|
grpcurl -plaintext notifier-grpc:50051 list
|
|
|
|
# 4. Verify API key
|
|
echo $NOTIFIER_API_KEY | wc -c # Should be 67 (nk_ + 64 chars + newline)
|
|
|
|
# 5. Check application logs
|
|
kubectl logs -l app=your-app --tail=100
|
|
```
|
|
|
|
## 📊 Performance Expectations
|
|
|
|
**With Long-Lived Connection (Recommended):**
|
|
- First request: ~15ms (connection setup + auth)
|
|
- Subsequent requests: ~1-2ms (auth only)
|
|
- Throughput: ~500-1000 req/s per connection
|
|
- Latency p99: <5ms
|
|
|
|
**Without Connection Reuse (Bad):**
|
|
- Every request: ~15ms (repeated connection setup)
|
|
- Throughput: ~60 req/s per connection
|
|
- Latency p99: ~20ms
|
|
|
|
**Connection Pool (High Throughput):**
|
|
- 4 connections: ~2000-4000 req/s
|
|
- Linear scaling with connection count
|
|
- Use for >1000 req/s sustained load
|
|
|
|
## 🎓 Learn More
|
|
|
|
- **gRPC Documentation:** https://grpc.io/docs/
|
|
- **Protocol Buffers:** https://protobuf.dev/
|
|
- **gRPC Best Practices:** https://grpc.io/docs/guides/performance/
|
|
- **Kubernetes Secrets:** https://kubernetes.io/docs/concepts/configuration/secret/
|
|
|
|
## 📞 Support
|
|
|
|
**Questions about:**
|
|
- API keys, rate limits, permissions → Contact Notifier admin
|
|
- Client implementation, best practices → See documentation above
|
|
- Service issues, downtime → Check service health dashboard
|
|
- Feature requests → Open issue in Notifier repository
|
|
|
|
## 📝 Quick Reference Card
|
|
|
|
```
|
|
Service: notifier-grpc:50051
|
|
Protocol: gRPC (HTTP/2)
|
|
Auth: authorization: Bearer nk_<64-hex>
|
|
Rate Limit: 100 req/min (default)
|
|
Timeout: 10s recommended
|
|
Keepalive: 10s ping, 3s timeout
|
|
Connection: Long-lived (reuse)
|
|
```
|
|
|
|
**Essential imports (Go):**
|
|
```go
|
|
import (
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/keepalive"
|
|
"google.golang.org/grpc/metadata"
|
|
pb "github.com/igodwin/notifier/api/grpc/pb"
|
|
)
|
|
```
|
|
|
|
**Minimal client setup:**
|
|
```go
|
|
// 1. Create connection with keepalive
|
|
conn, _ := grpc.Dial(address, grpc.WithKeepaliveParams(...))
|
|
|
|
// 2. Create client
|
|
client := pb.NewNotifierServiceClient(conn)
|
|
|
|
// 3. Add auth to context
|
|
ctx = metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+apiKey)
|
|
|
|
// 4. Make request
|
|
resp, err := client.SendNotification(ctx, req)
|
|
```
|
|
|
|
That's it! You're ready to integrate with the Notifier service. 🚀
|