Skip to content

Ebook cloud native architecture #42758

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
457fa91
Adding branch for ebook
Jun 24, 2024
12fe723
Powerpoint for graphic creation
Jun 28, 2024
da1ae87
Add files via upload
Jun 25, 2024
c8f4abf
Delete docs/architecture/distributed-cloud-native-apps-containers/dep…
Jun 25, 2024
ed29f9e
Delete docs/architecture/distributed-cloud-native-apps-containers/dep…
Jun 25, 2024
438413a
Delete docs/architecture/distributed-cloud-native-apps-containers/dev…
Jun 25, 2024
c53cf66
Delete docs/architecture/distributed-cloud-native-apps-containers/dis…
Jun 25, 2024
248fc12
Delete docs/architecture/distributed-cloud-native-apps-containers/dot…
Jun 25, 2024
204fe5d
Delete docs/architecture/distributed-cloud-native-apps-containers/how…
Jun 25, 2024
fe1dc9c
Delete docs/architecture/distributed-cloud-native-apps-containers/med…
Jun 25, 2024
7ad7c6b
upload of chapter 14
Jun 25, 2024
69d6469
new update of chapter 14
Jun 25, 2024
21d7c19
adding chapter 4
Jun 25, 2024
803a375
Added a section on Aspire and made corrections.
alistairmatthews Jul 10, 2024
2a02dc8
Minor revisions in style
alistairmatthews Jul 25, 2024
38cd909
Adding chapter 13 API gateways
Jun 4, 2024
f973cff
Failed to update graphics
Jun 28, 2024
c29e230
Adding chatper 12 testing apps
Jun 6, 2024
d224b67
ch12 - updated eshop references
Jun 21, 2024
273f8aa
Chapter 11 security and identity
Jun 3, 2024
343e2cd
Improving content
Jun 5, 2024
a12b00e
Improving content
Jun 5, 2024
cbec0b1
Improving content
Jun 5, 2024
24e75b4
Improving content
Jun 5, 2024
1ec76c3
Chapter 10 - Monitoring health for review
Jun 2, 2024
a0861a4
Failed to update graphics - also code needs updating
Jun 28, 2024
39f20c6
Adding resiliency chapter
Jun 3, 2024
f8414df
Update application-resiliency-patterns.md
Jun 25, 2024
c45707b
Update application-resiliency-patterns.md
Jun 25, 2024
4597014
graphic refresh - some missing
Jun 28, 2024
ce2a839
adding chapter 8 - data patterns
May 13, 2024
abc95bf
ch8 Updated eShop references
Jun 21, 2024
2339442
Not all graphics updated
Jun 28, 2024
e695f30
Aspire discussions added and other corrections.
alistairmatthews Jul 31, 2024
cccf1db
adding chapter 7
Jun 10, 2024
c074d49
updated eshop references
Jun 21, 2024
cc013c2
Graphics update - but cant do anymore
Jun 28, 2024
f06e907
Text revised for consistency with other chapters
alistairmatthews Jul 30, 2024
6c8ccd9
Adding chapter 6
Jun 6, 2024
3eef284
Updated to reference new eshop
Jun 21, 2024
1c12a62
ch6 - added link to eShop presentation
Jun 21, 2024
fcd9c81
Update front-end-client-communication.md
Jun 25, 2024
cd22220
graphics fix
Jun 28, 2024
a846c12
Added info about .NET Aspire and made other corrections
alistairmatthews Jul 17, 2024
e3d5d4d
Style corrections
alistairmatthews Jul 26, 2024
c130f5d
adding chapter 5
Jun 19, 2024
801a257
Graphics refresh
Jun 28, 2024
f15fd93
Initial corrections
alistairmatthews Jul 11, 2024
2e7fadf
Aspire communications section added.
alistairmatthews Jul 16, 2024
6f74307
adding chapter 3 ready for review
Jun 12, 2024
4ae323c
review updates
Jun 12, 2024
41c4a03
review updates
Jun 12, 2024
a76b0b9
Update orchestration.md
Jun 25, 2024
4c4adad
Update service-discovery.md
Jun 25, 2024
7582e08
Small updates and corrections
alistairmatthews Jul 10, 2024
c84a7c1
Text reviewed for consistency with other modules.
alistairmatthews Jul 25, 2024
6fbcf2e
adding chapter 2
May 13, 2024
749d01f
updates
May 13, 2024
cd3270f
fixing navigation
May 13, 2024
47a646a
image refresh
Jun 27, 2024
dec2418
Text revised for consistency with other modules.
alistairmatthews Jul 25, 2024
f1be3a2
Adding chapter 1
Jun 6, 2024
a693aec
pets and cattle update
Jun 10, 2024
d3d7c15
updated eshop link
Jun 10, 2024
1d6a2c1
review updates
Jun 11, 2024
efe2771
Updated TODO
Jul 4, 2024
f404c8f
Update graphics
Jun 27, 2024
fa042fe
Style updated and .NET Azure added
alistairmatthews Jul 22, 2024
59668e0
More Aspire additions
alistairmatthews Jul 24, 2024
4239eff
Completed links to other chapters
alistairmatthews Sep 6, 2024
fe4de58
Modified images to reflect Aspire colours
alistairmatthews Aug 21, 2024
2a0eacc
Chapter links completed.
alistairmatthews Sep 6, 2024
905aee3
Removed unused graphic
alistairmatthews Aug 22, 2024
d64ec69
Completed links to other chapters.
alistairmatthews Sep 6, 2024
2a7ce25
Style improvements
alistairmatthews Jul 26, 2024
6b5f1a4
Links to other chapters completed.
alistairmatthews Sep 6, 2024
84de5ed
Updated graphics to reflect Aspire branding
alistairmatthews Aug 23, 2024
0eb60a3
Frontend communications removed because it duplicates chapter 13
alistairmatthews Aug 27, 2024
649f91f
One link corrected
alistairmatthews Aug 27, 2024
5652316
Updated graphics to reflect Aspire colors
alistairmatthews Sep 3, 2024
6eee68e
Links to other chapters completed.
alistairmatthews Sep 6, 2024
6eb24fe
Revised graphics to reflect Aspire colors
alistairmatthews Sep 3, 2024
e2c5fd1
Completed links to other chapters.
alistairmatthews Sep 6, 2024
b0f1412
Graphics updated to reflect Aspire colors
alistairmatthews Sep 2, 2024
fcdc5f0
Small corrections
alistairmatthews Sep 5, 2024
f7740f7
Completed links to other chapters.
alistairmatthews Sep 6, 2024
7af14ac
Revised text for consistency with other modules and made corrections.
alistairmatthews Aug 13, 2024
9409caa
Removed TODO entries and made minor corrections.
alistairmatthews Aug 14, 2024
79f0202
Graphics revised to reflect Aspire branding
alistairmatthews Aug 28, 2024
41db6b8
Completed links to other chapters.
alistairmatthews Sep 6, 2024
e10f050
Text revised for consistency and other corrections.
alistairmatthews Aug 15, 2024
888f088
Updated graphics to reflect Aspire colours
alistairmatthews Aug 27, 2024
8d81236
Small corrections
alistairmatthews Sep 5, 2024
ca8dfb0
Completed links to other chapters.
alistairmatthews Sep 6, 2024
0856fef
Text corrected for style consistency and grammar.
alistairmatthews Aug 16, 2024
8ac70a7
Aspire info added and small corrections.
alistairmatthews Aug 19, 2024
6890264
Modified graphics to reflect Aspire colours
alistairmatthews Aug 27, 2024
de7902a
Completed links to other chapters.
alistairmatthews Sep 6, 2024
720cf30
Revised text for consistency.
alistairmatthews Aug 19, 2024
1fcdbff
Completed links to other chapters.
alistairmatthews Sep 6, 2024
428f026
Aspire info added and style corrections for consistency
alistairmatthews Aug 19, 2024
ba08fb9
Graphics modified to reflect Aspire branding
alistairmatthews Aug 27, 2024
a4daae6
Removed a TODO comment.
alistairmatthews Aug 27, 2024
4676309
Completed links to other chapters.
alistairmatthews Sep 6, 2024
3883629
Revised for consistency and other corrections.
alistairmatthews Aug 21, 2024
d00e8c0
Completed links to other chapters.
alistairmatthews Sep 6, 2024
470247c
Fixing build verifier errors.
alistairmatthews Sep 6, 2024
80e2c5a
Fixing markdown lint errors.
alistairmatthews Sep 6, 2024
bfefebe
A couple more build verifier fixes.
alistairmatthews Sep 6, 2024
85e8d52
Updating diagrams PowerPoint.
alistairmatthews Sep 6, 2024
bdb6354
Fixing a broken image link.
alistairmatthews Sep 6, 2024
52a3ec4
Another trying at fixing a link.
alistairmatthews Sep 6, 2024
06718d2
Another try.
alistairmatthews Sep 6, 2024
2d100d1
rename dashboard
jamesmontemagno Sep 25, 2024
1492840
Replaced .NET Aspire components with integrations.
alistairmatthews Sep 27, 2024
9c13674
Fix build issues, rename a few things and general clean up
IEvangelist Sep 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions docfx.json
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,6 @@
"docs/azure/**/*.*": "alexwolfmsft",
"docs/orleans/**/*.*": "IEvangelist",
"docs/architecture/**/**.md": "jamesmontemagno",
"docs/architecture/grpc-for-wcf-developers/**/**.md": "JamesNK",
"docs/architecture/modernize-desktop/**/**.md": "OliaG",
"docs/core/**/**.md": "gewarren",
"docs/core/compatibility/**/**.md": "gewarren",
"docs/core/deploying/**/**.md": "adegeo",
Expand Down Expand Up @@ -401,8 +399,6 @@
"_vblang/spec/*.md": "wiwagn",
"docs/ai/**/*.*": "alexwolf",
"docs/architecture/**/**.md": "jamont",
"docs/architecture/grpc-for-wcf-developers/**/**.md": "jamesnk",
"docs/architecture/modernize-desktop/**/**.md": "oliag",
"docs/azure/**/*.*": "alexwolf",
"docs/orleans/**/*.*": "dapine",
"docs/core/**/**.md": "dotnetcontent",
Expand Down
Binary file not shown.

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
---
title: Reverse proxies with YARP
description: Architecture for Distributed Cloud-Native Apps with .NET Aspire & Containers | Reverse proxies with YARP
ms.date: 01/13/2021
---
# Reverse proxies with YARP

[!INCLUDE [download-alert](../includes/download-alert.md)]

YARP is a versatile toolkit for building high-performance reverse proxy servers in .NET. Originating from the need within Microsoft to unify various teams' efforts around reverse proxy development, YARP is designed for flexibility and customization, making it suitable for a wide range of deployment scenarios. YARP is now an open-source project, allowing developers to leverage its capabilities for their own projects.

## Key Features of YARP

YARP has several key features that make it a powerful tool for building your reverse proxy servers:

- **Customizable routing**: YARP can direct incoming requests to different backend services based on URL paths, headers, or other attributes.

- **Load balancing**: YARP supports various strategies to distribute load evenly across service instances.

- **Seamless integration with ASP.NET Core middleware**: This allows for custom request/response handling.

- **Health checks**: YARP ensures traffic is only sent to healthy service instances.

- **Session affinity**: YARP can maintain user sessions with specific services when needed.

- **Cross-platform freedom**: YARP works seamlessly across Windows, Linux, and macOS.

- **Protocol prowess**: YARP embraces gRPC, HTTP/2, and WebSockets for modern communication needs.

- **Performance**: YARP is built for speed and efficiency, ensuring low latency and high throughput.

## Getting started with YARP

1. **Installation**: Add YARP to your .NET project using NuGet:

```shell
dotnet add package Yarp.ReverseProxy
```

1. **Basic Configuration**: Configure YARP in your `Startup.cs` file:

```csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddReverseProxy()
.LoadFromConfig(Configuration.GetSection("ReverseProxy"));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapReverseProxy();
});
}
```

1. **Configuration Files**: Add the YARP configuration to `appsettings.json` for basic configuration:

```json
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "/customer/{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"destination1": {
"Address": "https://example.com/api/customers/"
}
}
}
}
}
```

1. **Programmatic Configuration**: Customize the configuration dynamically with C# code:

```csharp
builder.Services.AddReverseProxy()
.LoadFromMemory(GetRoutes(), GetClusters());

...


RouteConfig[] GetRoutes()
{
return
[
new RouteConfig()
{
RouteId = "route1",
ClusterId = "cluster1",
Match = new RouteMatch
{
// Path or Hosts are required for each route. This catch-all pattern matches all request paths.
Path = "/customer/{**catch-all}"
}
}
];
}

ClusterConfig[] GetClusters()
{

return
[
new ClusterConfig()
{
ClusterId = "cluster1",
SessionAffinity = new SessionAffinityConfig { Enabled = true, Policy = "Cookie", AffinityKeyName = ".Yarp.ReverseProxy.Affinity" },
Destinations = { "destination1", new DestinationConfig() { Address = "https://example.com/api/customers" }
}
}
];
}
```

## Additional resources

- **Getting Started with YARP** \ <https://microsoft.github.io/reverse-proxy/articles/getting-started.html>

>[!div class="step-by-step"]
>[Previous](gateway-patterns.md)
>[Next](../deploying-distributed-apps/how-deployment-affects-your-architecture.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
title: Different ways to architect distributed applications
description: Architecture for Distributed Cloud-Native Apps with .NET Aspire & Containers | Different ways to architect distributed applications
ms.date: 04/06/2022
---

# Different ways to architect distributed applications

[!INCLUDE [download-alert](../includes/download-alert.md)]

In the ever-evolving landscape of software development, architects and developers are continually seeking efficient ways to design and build distributed applications. Let's explore some of the current architectural approaches. We'll delve into the characteristics, advantages, and challenges of each approach. As we navigate through these different paradigms, we'll discuss crucial aspects such as containerization, data sovereignty, scalability, and communication patterns.

Understanding these architectural styles will allow you to make informed decisions when designing robust, scalable, and maintainable distributed systems in today's cloud-native environment.

## Server-based architecture

![A diagram showing a high level image of server architecture.](media/server-architecture.png)

This is the traditional model where client machines connect to a server for processing and data storage. The server is responsible for all the processing, managing business logic, and data persistence. In this architecture, state and data management is centralized, typically using a single database. This approach simplifies data consistency but the database can become a bottleneck as the system scales. As all data is stored centrally there's no separation of data ownership among different components or services, which leads to tight coupling and makes it difficult to evolve different parts of the system independently.

While not originally designed for containers, monolithic server applications can be containerized. This process provides benefits like consistent environments and easier deployment, but it doesn't address the underlying architectural limitations of a monolithic system. Containerization in this context primarily aids in deployment and environment consistency, rather than in scalability or modularity.

In a server-based architecture, the logical and physical architectures often closely align, with most components residing on a single server or cluster. This simplicity can be an advantage for smaller applications but may limit flexibility as the application grows. The centralized nature of this architecture provides high security as all data is stored in one place, but it also creates a single point of failure and can become a performance bottleneck under high load.

## Modular monoliths

![A diagram showing a modular monolith architecture](media/modular-monolith.png)

In this architecture, the application is divided into modules. Each module is responsible for a specific feature or functionality. However, unlike microservices, these modules run in the same process and communicate directly with each other. Modular monoliths can be containerized as a single unit, which helps with deployment and scaling of the entire application, but doesn't allow for independent scaling of individual modules. In short they suffer from the same limitations as traditional monolithic server-based architectures.

While modules are separate, they typically share a common database, simplifying data management but also create a tight coupling between modules. This shared database approach makes it easier to maintain data consistency across the application but can lead to challenges as the application grows and modules become more complex. Also this means modules don't have true data sovereignty, as they don't exclusively own or control their data. This can lead to interdependencies between modules and make it challenging to evolve or replace individual modules without affecting others.

Although not as critical as in microservices, clearly defined boundaries between modules are important for maintainability in modular monoliths. These boundaries help in organizing code, reducing dependencies between modules, and making the system easier to understand and modify. However, because all modules run in the same process, there's still a risk that changes in one module can affect others, and the technology diversity is limited compared to more distributed architectures.

## Service-oriented architecture

![A diagram showing a SOA.](media/service-oriented-architecture.png)

In Service-Oriented Architecture (SOA), services are the main components. Each service encompasses an entire business process or function. For example, a customer order service would include functionality to manage not only orders but also customer information, shipping, and billing. Services communicate with each other to perform their tasks, typically using a messaging broker or a central enterprise bus.

Data management in SOA can be challenging. Traditionally, services often share databases, which can lead to tight coupling. Moving towards data sovereignty, where each service owns its data, can improve service independence but introduces challenges in maintaining data consistency across services. This shift improves service independence but introduces new challenges in maintaining data consistency across services. SOA implementations must balance the benefits of data sovereignty with the need for data sharing and consistency across business processes.

Communication is a crucial aspect of SOA. While not as granular as microservices, SOA relies heavily on inter-service communication, often through a centralized bus. This central communication mechanism can provide benefits in terms of standardization and ease of management, but it can also become a performance bottleneck and single point of failure if not designed carefully.

## Microservices

![A diagram showing a microservices based architecture.](media/microservice-architecture.png)

Microservices architecture breaks down the application into smaller, independent services that perform specific tasks. These services can be developed, deployed, and scaled independently. Microservices are well-suited for containerization, and allow each service to be deployed and scaled independently, which aligns well with cloud-native development practices.

In microservices, each service typically adheres to the principle of data sovereignty. Each microservice owns and manages its own data store, which can be a database, cache, or any other form of data storage. This sovereignty ensures that a service has complete control over its data model, storage technology, and data access patterns. It reduces coupling between services, as no service can directly access or modify another service's data. Instead, data exchange happens through well-defined APIs or messaging systems. This approach supports the independence and autonomy of each microservice, allowing teams to make decisions about data storage and management that are optimal for their specific service without affecting others. However, it also introduces challenges in maintaining data consistency across the system. Solutions to these challenges include using event-driven architectures, implementing the Saga pattern for distributed transactions, and designing for eventual consistency where appropriate.

The logical architecture of a microservices system, that us how services are conceptually organized, can be quite different from its physical architecture, that is how they're deployed. This separation allows for optimal resource utilization and adaptation to changing infrastructure requirements.

Identifying correct domain-model boundaries for each microservice is crucial to ensure each service has a well-defined responsibility and to reduce inter-service dependencies. This process often involves careful analysis of the business domain and can significantly impact the overall system design.

Communication patterns in microservices architectures are diverse. They can involve direct client-to-microservice communication or use an API Gateway pattern. Direct communication can offer lower latency but increases complexity for clients, while an API Gateway can simplify the client experience but may introduce a potential single point of failure. Additionally, microservices can communicate with each other using both synchronous (HTTP/gRPC) and asynchronous (message queues) methods, each with its own implications on system design and behavior.

### .NET Aspire and microservices

Although a microservices architecture is well suited to large apps with complex scaling needs and continuous development, you've seen that they're not always easy to manage. For example, sometimes it's hard to determine exactly which microservices and other components make up your entire app. Also, because each microservice might be written by a different team, common concerns like observability and resiliency may be implemented inconsistently or not at all.

This is where .NET Aspire comes in - it's a stack that helps you create manageable and consistent microservices, and assemble them into large apps. You can build .NET microservices without .NET Aspire, but if you do you'll have to work harder to solve common problems. For example, .NET Aspire:

- Makes it clear which microservices and other components are part of your app. You can see them in the App Host project code, and in the dashboard that appears whenever you debug your app.
- Implements observability for you using OpenTelemetry, so you can easily get data on the performance and behavior of all your microservices without requiring your development teams to build it.
- Makes it easy to use common backing services, such as databases and service buses, by providing out-of-the-box integrations for each one.
- Implements resiliency in these integrations to prevent and recover from failures, without requiring your development teams to build it.

If you've already started building and deploying microservices apps, then .NET Aspire may not help you, because it's opinionated about how they should be built and that might not match your design. However, if you're new to microservices and cloud-native design, or if you're starting an app from scratch, it can help to make the project easier and reduce development time.

>[!div class="step-by-step"]
>[Previous](why-choose-distributed-architecture.md)
>[Next](../communication-patterns/communication-patterns.md)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: Architecting distributed cloud-native applications
description: Architecture for Distributed Cloud-Native Apps with .NET Aspire & Containers | Architecting distributed cloud-native applications
ms.date: 04/06/2022
---

# Architecting distributed cloud-native applications

[!INCLUDE [download-alert](../includes/download-alert.md)]

Every application has its own unique requirements, but there are some common patterns and best practices that can help you design and build distributed cloud-native applications. In this book, we're focusing on how to architect distributed cloud-native applications by taking a microservices approach. But this approach might not be the best fit for your application. Let's look at why you might choose a distributed architecture.

- **Scalability**: Distributed architectures allow applications to scale out easily, accommodating more users and handling more requests per second. This is particularly important for applications that experience variable load.

- **Resilience**: In a distributed system, if one component fails, the others can continue to operate. This resilience can increase the overall uptime and reliability of your application.

- **Geographical distribution**: For global applications, distributed architectures can reduce latency by locating services closer to users.

- **Isolation of responsibilities**: Each service in a distributed system can be developed, deployed, scaled, and maintained independently, often by different teams. This separation can lead to increased productivity and speed of development.

- **Technology diversity**: Different services in a distributed system can use different languages, databases, and other technologies. You can choose the best performing tool for each job and the one that your team has experience with.

- **Efficient resource utilization**: Distributed architectures can make more efficient use of resources by allowing each service to scale independently based on its needs. For example, reporting services can be scaled up at the end of each month when managers build reports, while your core e-commerce services can be scaled up during peak shopping seasons.

- **Ease of deployment and updates**: With a distributed architecture, you can update a single service without having to redeploy your entire application. This independence can make deployments faster and less risky allowing for more frequent updates.

- **Data partitioning**: In a distributed system, you can partition your data across different services, which can lead to improved performance and scalability. You can also geographically partition your data to comply with data residency requirements.

- **Security**: By isolating different parts of your application into separate services, you can apply specific security measures to each service based on its needs.

In the rest of this book we'll be focusing specifically on how to design and build distributed cloud-native applications using a microservices based architecture. You'll see how the features built into .NET are designed to help you build and deploy microservices, and how to use containers to package and deploy your services successfully.

>[!div class="step-by-step"]
>[Previous](../introduction-dotnet-aspire/observability-and-dashboard.md)
>[Next](different-distributed-architectures.md)
Loading
Loading