Un microservice Go démontrant une architecture "Dual API" avec une API REST et une API gRPC pour le suivi de portefeuille crypto en temps réel.
Ce projet illustre comment une seule logique métier peut servir deux types de clients :
- API REST : Pour les interfaces web et les intégrations simples
- API gRPC : Pour la communication machine-à-machine haute performance
┌─────────────────┐ ┌─────────────────┐
│ Client REST │ │ Client gRPC │
└─────────┬───────┘ └─────────┬───────┘
│ │
▼ ▼
┌─────────────────────────────────────────┐
│ Dual API Server │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ REST API │ │ gRPC API │ │
│ │ Port 8080 │ │ Port 9090 │ │
│ └──────┬──────┘ └─────────┬───────┘ │
│ │ │ │
│ └─────────┬─────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Business Logic │ │
│ │ (Portfolio) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ CoinGecko API │
│ (Prix crypto temps réel) │
└─────────────────────────────────────────┘
- Docker et Docker Compose
- Go 1.24+ (pour le développement local)
# Utiliser l'image pré-construite depuis Docker Hub
docker pull idablaq/dual-api-crypt:latest
# Lancer le conteneur
docker run -d -p 8080:8080 -p 9090:9090 --name dual-api-crypt idablaq/dual-api-crypt:latest# Cloner le projet
git clone https://github.com/xAPT42/Dual-api-crypt.git
cd Dual-api-crypt
# Construire et lancer
docker-compose up --build# Installer les dépendances
go mod tidy
# Générer le code gRPC
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/portfolio.proto
# Lancer l'application
go run cmd/server/main.gocurl http://localhost:8080/portfolioRéponse :
{
"value": 12543.67,
"currency": "EUR",
"timestamp": "2024-01-15T10:30:00Z"
}curl http://localhost:8080/healthgrpcurl -plaintext localhost:9090 listgrpcurl -plaintext localhost:9090 portfolio.PortfolioService/GetPortfolioValueLe portefeuille est défini dans le code et contient :
- Bitcoin : 0.5 BTC
- Ethereum : 5.0 ETH
- Cardano : 1000 ADA
- Solana : 50 SOL
- Chainlink : 100 LINK
dual-api-crypto/
├── api/ # Contrats gRPC
│ ├── portfolio.proto # Définition du service
│ ├── portfolio.pb.go # Code généré
│ └── portfolio_grpc.pb.go
├── cmd/server/ # Point d'entrée
│ └── main.go # Serveurs REST et gRPC
├── internal/service/ # Logique métier
│ └── portfolio.go # Calcul du portefeuille
├── Dockerfile # Image Docker
├── docker-compose.yml # Orchestration
├── go.mod # Dépendances Go
└── README.md # Documentation
- Go 1.24 : Langage principal
- gRPC : Communication haute performance
- Protocol Buffers : Sérialisation efficace
- Docker : Conteneurisation
- CoinGecko API : Données crypto temps réel
# Test de base
curl -X GET http://localhost:8080/portfolio
# Test avec jq pour un affichage formaté
curl -s http://localhost:8080/portfolio | jq# Installer grpcurl
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
# Lister les services
grpcurl -plaintext localhost:9090 list
# Appeler la méthode
grpcurl -plaintext localhost:9090 portfolio.PortfolioService/GetPortfolioValueLe service expose un endpoint de santé sur /health pour le monitoring.
Le projet utilise GitHub Actions pour automatiser le build et le push des images Docker vers Docker Hub :
-
Déclenchement :
- Push sur la branche
main→ taglatest - Tags Git (ex:
v1.0.0) → tags versionnés - Pull Requests → build de test uniquement
- Push sur la branche
-
Multi-architecture : Les images sont buildées pour
linux/amd64etlinux/arm64 -
Cache : Utilise GitHub Actions cache pour accélérer les builds
Pour activer le workflow, configurez les secrets suivants dans votre dépôt GitHub :
- Allez dans
Settings→Secrets and variables→Actions - Ajoutez les secrets suivants :
DOCKERHUB_USERNAME: Votre nom d'utilisateur Docker HubDOCKERHUB_TOKEN: Votre token d'accès Docker Hub (créer un token sur hub.docker.com)
Les images sont disponibles sur : idablaq/dual-api-crypt
# Dernière version
docker pull idablaq/dual-api-crypt:latest
# Version spécifique
docker pull idablaq/dual-api-crypt:v1.0.0- Utilisateur non-root dans le conteneur
- Certificats SSL pour les requêtes HTTPS
- Headers CORS configurés
- Timeouts configurés
- Fork le projet
- Créer une branche feature (
git checkout -b feature/AmazingFeature) - Commit les changements (
git commit -m 'Add some AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Ce projet démontre :
- Architecture Dual API : Une logique métier, deux interfaces
- gRPC vs REST : Quand utiliser chaque technologie
- Microservices : Design et implémentation
- Docker : Conteneurisation d'applications Go
- API externes : Intégration avec CoinGecko
Développé avec ❤️ pour démontrer les architectures microservices modernes