Muonroi.Microservices.Template
1.11.2
dotnet new install Muonroi.Microservices.Template@1.11.2
Muonroi.Microservices.Template
A .NET solution template for building distributed Microservices applications using ASP.NET Core, YARP Gateway, and the Muonroi.BuildingBlock library. Ideal for large-scale systems requiring independent scalability and deployment.
Quick Start
# 1. Install template
dotnet new install Muonroi.Microservices.Template
# 2. Create new project
dotnet new mr-micro-sln -n MyMicroservices
# 3. Setup
cd MyMicroservices/MyMicroservices
dotnet restore
# 4. Run Catalog service migrations
cd src/Services/MyMicroservices.Catalog
dotnet ef migrations add InitialCreate --project ../MyMicroservices.Data
dotnet ef database update --project ../MyMicroservices.Data
# 5. Run Catalog service
dotnet run
# 6. (Optional) Run Gateway
cd ../../Gateways/MyMicroservices.Gateway
dotnet run
Catalog Service: https://localhost:5001/swagger
Gateway: http://localhost:5067 or https://localhost:7225
Call Catalog through Gateway (routes are prefixed):
http://localhost:5067/api/v1/catalog/<endpoint>
Prerequisites
- .NET 9.0 SDK or later
- (Optional) Docker Desktop - for containerized deployment
- (Optional) EF Core CLI:
dotnet tool install --global dotnet-ef
Installation
From NuGet (recommended)
dotnet new install Muonroi.Microservices.Template
From source
git clone <your-private-url>/Muonroi.Microservices.Template.git
cd Muonroi.Microservices.Template
dotnet new install ./
Verify installation
dotnet new list | grep "mr-micro-sln"
Usage
Create new project
dotnet new mr-micro-sln -n <ProjectName> [--ui <angular|react|mvc|none>]
| Parameter | Short | Description | Default |
|---|---|---|---|
--name |
-n |
Solution/project name | (required) |
--UiFramework |
--ui |
Frontend shell scaffold (angular, react, mvc, none) |
none |
Generated UI shells use Muonroi hybrid UI engine:
- Backend metadata endpoints:
GET /api/v1/auth/ui-engine/{userId},GET /api/v1/auth/ui-engine/current - FE runtime packages:
@muonroi/ui-engine-core,@muonroi/ui-engine-angular,@muonroi/ui-engine-react - MVC runtime package:
Muonroi.Ui.Engine.Mvc - Optional UI-kit adapter package:
@muonroi/ui-engine-primeng
Template boundary:
Muonroi.Microservices.Templatekeeps scaffold/wiring fordotnet new.- Shared UI runtime core is maintained in
Muonroi.Ui.Engine. - Runtime verification should be executed on freshly generated projects under
_tmp/verify-runs, not by treating template source as production app.
Sync helper:
./scripts/sync-ui-engine.sh --ui-engine-path ../Muonroi.Ui.Engine --openapi http://localhost:5000/swagger/v1/swagger.json --framework all
Examples
# Create microservices solution
dotnet new mr-micro-sln -n ECommerceServices
# Creates: CatalogService, Gateway, docker-compose
# Create microservices solution with MVC shell starter
dotnet new mr-micro-sln -n ECommerceServices --ui mvc
Project Structure
MyMicroservices/
├── MyMicroservices.sln
├── docker-compose.yml # Multi-service orchestration
├── docker-compose.override.yml
├── src/
│ ├── Gateways/ # API Gateway Layer
│ │ └── MyMicroservices.Gateway/ # YARP Reverse Proxy
│ │ ├── appsettings.json
│ │ ├── Program.cs
│ │ └── yarp-config.json # Route configuration
│ └── Services/ # Microservices
│ ├── MyMicroservices.Catalog/ # Catalog Service
│ │ ├── appsettings.json
│ │ ├── appsettings.Development.json
│ │ ├── Controllers/
│ │ ├── Program.cs
│ │ └── Dockerfile
│ ├── MyMicroservices.Core/ # Shared domain
│ │ ├── Entities/
│ │ └── Interfaces/
│ └── MyMicroservices.Data/ # Data layer
│ ├── CatalogDbContext.cs
│ └── Repositories/
└── README.md
Configuration
Per-Service Configuration
Each microservice has its own appsettings:
{
"DatabaseConfigs": {
"DbType": "Sqlite",
"ConnectionStrings": {
"SqliteConnectionString": "Data Source=catalog.db"
}
},
"TokenConfigs": {
"Issuer": "https://catalog-service:5001",
"Audience": "https://catalog-service:5001",
"SymmetricSecretKey": "your-secret-key-minimum-32-characters!",
"UseRsa": false,
"ExpiryMinutes": 60
},
"EnableEncryption": false
}
Supported Database Types
| DbType | Connection String Key |
|---|---|
Sqlite |
SqliteConnectionString |
SqlServer |
SqlServerConnectionString |
MySql |
MySqlConnectionString |
PostgreSql |
PostgreSqlConnectionString |
MongoDb |
MongoDbConnectionString |
Gateway Configuration (YARP)
Configure service routes in src/Gateways/MyMicroservices.Gateway/appsettings.json:
{
"ReverseProxy": {
"Routes": {
"catalog-route": {
"ClusterId": "catalog-cluster",
"Match": {
"Path": "/api/v1/catalog/{**catch-all}"
},
"Transforms": [
{ "PathPattern": "{**catch-all}" }
]
}
},
"Clusters": {
"catalog-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:5000"
}
}
}
}
}
}
Notes:
- Gateway only receives traffic when you call it directly. Calling the Catalog service URL bypasses the gateway.
- The
PathPatterntransform removes/api/v1/catalogbefore forwarding to the service. - Ensure the destination scheme/port matches the Catalog service (
http://localhost:5000orhttps://localhost:5001).
Feature Flags
Toggle features per service:
{
"FeatureFlags": {
"UseGrpc": true,
"UseServiceDiscovery": true,
"UseMessageBus": true,
"UseBackgroundJobs": false,
"UseEnsureCreatedFallback": true
}
}
Enterprise Operations (E4/E5)
For each service that needs enterprise management endpoints:
{
"EnterpriseOps": {
"EnableComplianceEndpoints": false,
"EnableOperationsEndpoints": false
}
}
When enabled in a service:
EnableComplianceEndpoints: mapsMapMComplianceEndpoints()EnableOperationsEndpoints: mapsMapMEnterpriseOperationsEndpoints()
Ops scripts included in scripts/:
check-enterprise-upgrade-compat.ps1check-enterprise-slo-gates.ps1
SLO presets included in deploy/enterprise/slo-presets/:
balanced.jsonstrict.jsonregulated.json
Note: if your Muonroi.BuildingBlock package version does not include E4/E5 endpoint extensions yet, these toggles are ignored safely.
Database Migrations
Each service manages its own database:
# Catalog service migration
cd src/Services/MyMicroservices.Catalog
dotnet ef migrations add "InitialCreate" \
-p ../MyMicroservices.Data \
-o Persistence/Migrations
dotnet ef database update \
-p ../MyMicroservices.Data
Running Services
Development Mode
Run each service individually:
# Terminal 1 - Catalog Service
cd src/Services/MyMicroservices.Catalog
dotnet run
# Terminal 2 - Gateway
cd src/Gateways/MyMicroservices.Gateway
dotnet run
Docker Compose (recommended)
# Build and run all services
docker-compose up --build
# Run in background
docker-compose up -d
# Stop services
docker-compose down
# View logs
docker-compose logs -f catalog
Services will be available at:
- Gateway:
http://localhost:5067(orhttps://localhost:7225) - Catalog:
http://localhost:5000(orhttps://localhost:5001)
Microservices Architecture
Why Microservices?
- Independent Scalability - Scale services based on demand
- Technology Diversity - Use different tech stacks per service
- Fault Isolation - Service failures don't affect others
- Independent Deployment - Deploy services independently
Service Communication
Services communicate via:
- HTTP/REST - Synchronous via API Gateway
- gRPC - High-performance inter-service calls
- Message Bus - Asynchronous events (Kafka/RabbitMQ)
- Service Discovery - Dynamic service location (Consul)
Adding New Service
Create service folder under
src/Services/:src/Services/ └── MyMicroservices.Orders/ # New service ├── Controllers/ ├── Program.cs ├── Dockerfile └── appsettings.jsonAdd service to
docker-compose.yml:orders: build: context: . dockerfile: src/Services/MyMicroservices.Orders/Dockerfile ports: - "5002:80" environment: - ASPNETCORE_ENVIRONMENT=DevelopmentAdd route to Gateway
yarp-config.jsonCreate separate database for the service
Features
- Microservices Architecture - Independent, scalable services
- YARP API Gateway - Modern reverse proxy with dynamic routing
- Docker Support - Full containerization with docker-compose
- Service-per-Database - Each service owns its data
- Authentication & Authorization - JWT with distributed auth
- Structured Logging - Service-specific log files
- Caching - Redis for distributed caching
- Multi-tenancy - Tenant isolation per service
- Service Discovery - Consul integration
- Message Bus - Kafka/RabbitMQ via MassTransit
- gRPC Communication - High-performance inter-service calls
- Health Checks - Service health monitoring
- Distributed Tracing - OpenTelemetry support
Rule Engine
This template includes rule orchestration examples for real business workflows.
Quick Start
Examples in this template
src/Services/Muonroi.Microservices.Catalog/Rules/B2B/B2BRegistrationRules.cssrc/Services/Muonroi.Microservices.Catalog/Rules/ContainerValidationRule.cssrc/Services/Muonroi.Microservices.Catalog/Rules/ContainerExistenceRule.cssrc/Services/Muonroi.Microservices.Catalog/Rules/LoggingHook.cs
Centralized docs
Best Practices
✅ DO:
- Design services around business capabilities
- Use API Gateway for external clients
- Implement circuit breakers for resilience
- Use message bus for async communication
- Monitor service health and metrics
- Use separate databases per service
❌ DON'T:
- Share databases between services
- Create chatty inter-service calls
- Make synchronous calls for non-critical operations
- Deploy all services together
- Skip health checks and monitoring
Deployment
Docker Deployment
# Build images
docker-compose build
# Push to registry
docker tag myservices-catalog:latest myregistry/catalog:1.0
docker push myregistry/catalog:1.0
# Deploy to production
docker-compose -f docker-compose.prod.yml up -d
Kubernetes Deployment
See k8s/README.md for Kubernetes manifests.
Documentation
Private docs are centralized in Muonroi.Docs:
- License Capability Model
- Control Plane MVP
- Enterprise Secure Profile (E2)
- Enterprise Centralized Authorization (E3)
- Enterprise Compliance (E4)
- Enterprise Operations (E5)
Troubleshooting
"Connection string is not provided"
Ensure each service has correct DbType and connection string:
{
"DatabaseConfigs": {
"DbType": "PostgreSql",
"ConnectionStrings": {
"PostgreSqlConnectionString": "..."
}
}
}
"The input is not a valid Base-64 string"
Set "EnableEncryption": false in each service's appsettings.
Gateway not routing
Check src/Gateways/MyMicroservices.Gateway/appsettings.json routes and ensure the destination URL matches the Catalog service. Also ensure you call the gateway URL (not the Catalog URL).
Docker services not communicating
Ensure services use docker-compose network names:
"Address": "http://catalog:80" // Not localhost
Migration errors
Always specify -p and startup project for each service separately.
Edition Notes
- Template package is MIT.
- Generated services run in Free mode by default (
LicenseConfigs:LicenseFilePath = null). - If you turn on premium integrations (gRPC, message bus, distributed cache, enterprise audit/security flows), provide a paid Muonroi license with matching feature keys.
License
MIT License. See LICENSE.txt for details.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.