一、C#云原生应用的“骨架”:ASP.NET Core + Kubernetes
1.1 ASP.NET Core Web API 示例
// Startup.cs 配置类(ASP.NET Core 3.1+)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 添加Swagger文档支持
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "C#云原生API", Version = "v1" });
});
// 添加性能监控中间件(用于暴露指标给Prometheus)
services.AddApplicationInsightsTelemetry(); // 可选:集成Azure Application Insights
services.AddMetrics(); // 使用Microsoft.AspNetCore.Diagnostics.Metrics
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "C#云原生API v1"));
}
// 暴露指标端点(/metrics),供Prometheus抓取
app.UseMetricsAllForced();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
// 示例控制器:模拟高并发场景
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
public IActionResult CreateOrder([FromBody] OrderModel model)
{
// 模拟耗时操作(如数据库写入)
Thread.Sleep(50); // 50ms延迟,模拟真实业务逻辑
// 记录订单处理时间(用于自定义指标)
Metrics.CreateTimer("order_processing_seconds").Record(TimeSpan.FromMilliseconds(50));
return Ok(new { Message = "订单已创建", OrderId = Guid.NewGuid() });
}
}
// OrderModel.cs 数据模型
public class OrderModel
{
public string UserId { get; set; }
public decimal Amount { get; set; }
}
代码解析:
services.AddMetrics()
:引入指标中间件,用于暴露/metrics
端点。Metrics.CreateTimer()
:记录订单处理时间,供Prometheus抓取。Thread.Sleep(50)
:模拟业务逻辑耗时,用于测试高并发场景。
1.2 Docker容器化部署
# Dockerfile:构建C#应用镜像
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["OrderService.csproj", "./"]
RUN dotnet restore "./OrderService.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "OrderService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "OrderService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "OrderService.dll"]
代码解析:
- 多阶段构建减少镜像体积。
EXPOSE 80
暴露HTTP端口。- 最终镜像仅包含运行时依赖。
二、Kubernetes自动扩缩容:从HPA到自定义指标
2.1 Kubernetes Deployment + HPA
# order-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 2 # 初始副本数
strategy:
type: RollingUpdate # 滚动更新策略
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: your-registry/order-service:latest
ports:
- containerPort: 80
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
---
# order-service-hpa.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80 # CPU使用率超过80%触发扩容
代码解析:
minReplicas
和maxReplicas
定义扩缩容边界。averageUtilization: 80
:CPU使用率超过80%时触发扩容。
扩展玩法:
- 自定义指标:用Prometheus监控订单量,触发扩缩容。
- 冷却时间:避免频繁扩缩容(默认缩容冷却时间为5分钟)。
2.2 自定义指标扩缩容(基于订单量)
# order-service-hpa-custom.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: order_processing_seconds_count
target:
averageValue: 100 # 每个Pod每秒处理订单数低于100时扩容
代码解析:
order_processing_seconds_count
:从/metrics
端点获取的自定义指标。averageValue: 100
:每个Pod每秒处理订单数低于100时触发扩容。
三、监控与告警:Prometheus + Grafana 的“监控双雄”
3.1 Prometheus 配置
# prometheus.yml
scrape_configs:
- job_name: 'order-service'
metrics_path: '/metrics'
static_configs:
- targets: ['order-service:80'] # 抓取order-service的/metrics端点
代码解析:
metrics_path: '/metrics'
:指向ASP.NET Core暴露的指标端点。targets: ['order-service:80']
:Kubernetes服务名+端口。
3.2 Grafana 面板配置(JSON片段)
{
"panels": [
{
"type": "graph",
"title": "订单处理时间(秒)",
"targets": [
{
"expr": "rate(order_processing_seconds_count[5m])",
"refId": "A"
}
]
},
{
"type": "singlestat",
"title": "当前Pod数量",
"targets": [
{
"expr": "count(kube_pod_status{pod!~'prometheus.*'})",
"refId": "B"
}
]
}
]
}
代码解析:
rate(order_processing_seconds_count[5m])
:计算过去5分钟订单处理速率。count(kube_pod_status{pod!~'prometheus.*'})
:统计当前运行的Pod数量。
四、C#云原生应用的“高级玩法”
4.1 服务熔断与降级
// OrderService.cs
public class OrderService
{
private readonly ResiliencePipeline _pipeline;
public OrderService()
{
_pipeline = new ResiliencePipelineBuilder()
.AddCircuitBreaker(new CircuitBreakerStrategyOptions
{
ShouldHandle = new PredicateBuilder().Handle<Exception>(),
FailureThreshold = 0.5, // 错误率超过50%触发熔断
SamplingDuration = TimeSpan.FromSeconds(10),
MinimumThroughput = 10,
BreakDuration = TimeSpan.FromSeconds(30)
})
.Build();
}
public async Task<Order> CreateOrderAsync(OrderModel model)
{
return await _pipeline.ExecuteAsync(() =>
{
// 调用外部服务(如库存服务)
// 模拟随机失败
if (new Random().NextDouble() < 0.3)
{
throw new Exception("库存服务不可用");
}
return new Order { Id = Guid.NewGuid(), UserId = model.UserId, Amount = model.Amount };
});
}
}
代码解析:
CircuitBreakerStrategyOptions
:配置熔断策略。FailureThreshold: 0.5
:错误率超过50%时熔断。BreakDuration: 30s
:熔断后等待30秒尝试恢复。
4.2 服务注册与发现(Consul)
// Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseConsul()
.UseHealthChecks("/health"); // 健康检查端点
// Consul配置(appsettings.json)
{
"Consul": {
"Address": "http://consul-server:8500",
"ServiceName": "order-service",
"ServiceId": "order-service-${random-string}",
"Port": 80,
"Check": {
"Http": "http://localhost:80/health",
"Interval": "10s",
"Timeout": "5s"
}
}
}
代码解析:
UseConsul()
:注册服务到Consul。UseHealthChecks("/health")
:暴露健康检查端点。
五、实战案例:电商系统的弹性伸缩
5.1 高并发场景下的扩缩容策略
# order-service-hpa-multi-metric.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
- type: Pods
pods:
metric:
name: order_processing_seconds_count
target:
averageValue: 50 # 每个Pod每秒处理订单数低于50时扩容
代码解析:
- 同时监控CPU、内存和订单处理量。
- 多个指标取最大值触发扩缩容。
C#在云原生领域的潜力远不止于此。从自动扩缩容到服务熔断,再到自定义指标监控,C#开发者完全可以构建出媲美Java生态的云原生系统。