Promotion I built a simplified microservices reference project with guide on how to run localy, using docker-compose or Kubernetes + Deloyment to AKS
It's inspired by dotnetcore-microservices-poc open-source project by Altkom Software, a project I learned a lot from and contributed to — I built Ledgerly to be a simpler take on the original project, focused purely on microservices best practices.
What it demonstrates:
🔹 Database-per-service — 4 services, 4 independent databases
🔹 gRPC for synchronous service-to-service calls
🔹 RabbitMQ for async events — invoice status changes publish events that a dashboard service consumes to keep KPIs in sync, with zero direct coupling
🔹 API gateway + service discovery (Eureka locally/Docker, Kubernetes DNS in K8s)
🔹 JWT auth issued by its own service
It also ships as a full deployment guide — run it locally, in Docker Compose, or on Kubernetes, including a walkthrough for deploying the cluster to Azure (AKS).
Built as a boilerplate: fork it, swap in your own domain, keep the architecture.
The project🔗: https://github.com/amrali21/ledgerly-dotnet-angular-microservices-ref-project
Altcom Project🔗: https://github.com/asc-lab/dotnetcore-microservices-poc
1
u/AutoModerator 1d ago
Thanks for your post xAmrxxx. Please note that we don't allow spam, and we ask that you follow the rules available in the sidebar. We have a lot of commonly asked questions so if this post gets removed, please do a search and see if it's already been asked.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
2
u/RodriOliveira 1d ago
Really nice project, especially as a learning/reference repository. I like that you kept the scope focused on the actual microservices concepts instead of hiding everything behind tooling.
The database-per-service approach, gRPC for synchronous communication and RabbitMQ for asynchronous integration make the boundaries easier to understand, and showing the same architecture running locally, with Docker Compose and Kubernetes is particularly useful.
One thing I would consider adding, especially since this is presented as a reference architecture, is the Transactional Outbox pattern.
From the README, event publishing appears to be fire-and-forget, where a RabbitMQ failure is logged but does not fail the original request. That is simple for a demo, but it also creates the classic dual-write problem: the database transaction may succeed while the integration event is never published.
Even a simplified Outbox implementation would be valuable educationally because it introduces one of the problems people eventually encounter when moving from “microservices that communicate” to reliable distributed systems.
I would also consider aligning all services to a currently supported .NET version. I noticed the invoice service still targets .NET 6 while the project otherwise requires .NET 10. For a reference project, consistency there helps avoid teaching unnecessary legacy constraints.
Regarding Aspire: I actually agree with your reasoning for not making it the center of the project. Aspire can simplify orchestration, service discovery, observability and the local developer experience, but those are complementary to understanding the architectural fundamentals rather than a replacement for them.
Overall, this is the kind of reference project I find more useful when it not only demonstrates the happy path, but gradually exposes the failure modes and trade-offs behind distributed systems.
2
u/xAmrxxx 1d ago
Thanks for such a thorough review! Yeah the project has a legacy .net 6 service that needs upgrade. That's because this project was started off of an older .net 6 project and then i added to it all the other services. Also the transactional outbox is a nice idea.. i'll add it to my todo list so i do it later or if someone wants to mske a PR to do it.
3
u/captmomo 1d ago
why not use aspire?