Health Checks in ASP.NET Core for .NET Microservices: Product and Order Services

DotNet Full Stack Dev
3 min readAug 7, 2024

--

In a microservices architecture, ensuring that each service is running and healthy is crucial for maintaining the overall system’s reliability. ASP.NET Core provides built-in support for health checks, allowing you to monitor the health of your services. This guide will walk through implementing health checks for two .NET microservices, Product and Order services.

Embark on a journey of continuous learning and exploration with DotNet-FullStack-Dev. Uncover more by visiting our https://dotnet-fullstack-dev.blogspot.com reach out for further information.

Setting Up Health Checks in ASP.NET Core

ASP.NET Core’s health checks feature provides a way to report the health of your application. Health checks can be used to check the status of various aspects of your application, such as the database connection, external API availability, and more.

Step-by-Step Implementation

1. Create Product and Order Services

Assume you already have two microservices: Product and Order. We’ll add health checks to these services.

2. Install Required Packages

First, install the necessary NuGet package for health checks:

dotnet add package Microsoft.AspNetCore.Diagnostics.HealthChecks

3. Configure Health Checks in Startup.cs

In each service, configure health checks in the Startup.cs file.

Product Service

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();

// Add health checks
services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy())
.AddSqlServer(Configuration.GetConnectionString("ProductDatabase"), name: "ProductDB-check");
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();

// Map health checks
endpoints.MapHealthChecks("/health");
});
}
}

Order Service

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();

// Add health checks
services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy())
.AddSqlServer(Configuration.GetConnectionString("OrderDatabase"), name: "OrderDB-check");
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();

// Map health checks
endpoints.MapHealthChecks("/health");
});
}
}

4. Implement Custom Health Checks

You can also implement custom health checks if you have specific requirements. Here’s an example of a custom health check for the Product service:

public class CustomProductHealthCheck : IHealthCheck
{
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
// Custom logic to check health
bool isHealthy = true; // Replace with actual logic

if (isHealthy)
{
return Task.FromResult(HealthCheckResult.Healthy("Product service is healthy"));
}
else
{
return Task.FromResult(HealthCheckResult.Unhealthy("Product service is unhealthy"));
}
}
}

Register the custom health check in the Startup.cs:

services.AddHealthChecks()
.AddCheck<CustomProductHealthCheck>("custom_product_check");

5. Run and Test Health Checks

Run the services and test the health check endpoints:

  • For Product Service: http://localhost:<port>/health
  • For Order Service: http://localhost:<port>/health

You should see a JSON response indicating the health status of the service.

6. Aggregating Health Checks with Kubernetes or Docker

When deploying to Kubernetes or Docker, you can use readiness and liveness probes to ensure that your services are healthy.

Kubernetes Example

apiVersion: apps/v1
kind: Deployment
metadata:
name: product-service
spec:
replicas: 1
selector:
matchLabels:
app: product-service
template:
metadata:
labels:
app: product-service
spec:
containers:
- name: product-service
image: your-docker-image
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10

Conclusion

Implementing health checks in ASP.NET Core for microservices like Product and Order services is straightforward and enhances the reliability of your system. By configuring health checks, you can monitor the status of your services and integrate them with orchestration tools like Kubernetes for robust deployment strategies. This ensures that your microservices are running smoothly and can handle requests efficiently, maintaining the overall health of your application.

--

--

DotNet Full Stack Dev
DotNet Full Stack Dev

Written by DotNet Full Stack Dev

Join me to master .NET Full Stack Development & boost your skills by 1% daily with insights, examples, and techniques! https://dotnet-fullstack-dev.blogspot.com

No responses yet