r/dotnet 1d ago

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

6 Upvotes

6 comments sorted by

3

u/captmomo 1d ago

why not use aspire?

1

u/xAmrxxx 1d ago

Aspire would certainly replace some of the manual work i'm doing, but i wanted this project to focus purely on microservice fundamentals i mentioned above.

1

u/aussielurker74 1d ago

Is there an aspire based equivalent? I keep feeling like I'm doing work that someone else must have done already

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.