当前位置: 首页 > news >正文

第十三章 部署和性能优化

13.1 生产环境配置

环境特定配置

在不同环境中使用不同的配置文件:

  • appsettings.json:基础配置
  • appsettings.Development.json:开发环境配置
  • appsettings.Production.json:生产环境配置
// appsettings.Production.json
{"Logging": {"LogLevel": {"Default": "Warning","Microsoft.AspNetCore": "Warning"}},"ConnectionStrings": {"DefaultConnection": "Server=prod-server;Database=TodoDB;Trusted_Connection=true;"},"JWT": {"Secret": "your-super-secret-key-for-production","Issuer": "https://yourdomain.com","Audience": "https://yourdomain.com"}
}

健康检查

// 添加健康检查
builder.Services.AddHealthChecks().AddDbContext<TodoContext>().AddCheck("Database", () => {// 自定义数据库健康检查return HealthCheckResult.Healthy();});// 配置健康检查端点
app.MapHealthChecks("/health", new HealthCheckOptions
{ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

13.2 性能优化

响应缓存

// 添加响应缓存
builder.Services.AddResponseCaching();// 使用响应缓存中间件
app.UseResponseCaching();// 在控制器中设置缓存
[HttpGet]
[ResponseCache(Duration = 300)] // 缓存5分钟
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{return await _repository.GetAllAsync();
}

数据库优化

// 使用异步方法
public async Task<IEnumerable<TodoItem>> GetCompletedItemsAsync()
{return await _context.TodoItems.Where(t => t.IsComplete).AsNoTracking() // 只读查询时禁用跟踪.ToListAsync();
}// 分页查询
public async Task<PagedResult<TodoItem>> GetPagedItemsAsync(int page, int pageSize)
{var totalCount = await _context.TodoItems.CountAsync();var items = await _context.TodoItems.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();return new PagedResult<TodoItem>{Items = items,TotalCount = totalCount,Page = page,PageSize = pageSize};
}

13.3 部署到云平台

Azure App Service部署

# azure-pipelines.yml
trigger:
- mainpool:vmImage: 'ubuntu-latest'variables:buildConfiguration: 'Release'steps:
- task: DotNetCoreCLI@2displayName: 'Restore packages'inputs:command: 'restore'projects: '**/*.csproj'- task: DotNetCoreCLI@2displayName: 'Build project'inputs:command: 'build'projects: '**/*.csproj'arguments: '--configuration $(buildConfiguration)'- task: DotNetCoreCLI@2displayName: 'Run tests'inputs:command: 'test'projects: '**/*Tests.csproj'arguments: '--configuration $(buildConfiguration)'- task: DotNetCoreCLI@2displayName: 'Publish application'inputs:command: 'publish'publishWebProjects: truearguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'- task: PublishBuildArtifacts@1displayName: 'Publish artifacts'inputs:pathToPublish: '$(Build.ArtifactStagingDirectory)'artifactName: 'drop'

Docker部署

# Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["TodoApi/TodoApi.csproj", "TodoApi/"]
RUN dotnet restore "TodoApi/TodoApi.csproj"
COPY . .
WORKDIR "/src/TodoApi"
RUN dotnet build "TodoApi.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "TodoApi.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TodoApi.dll"]
# docker-compose.yml
version: '3.8'services:todoapi:build: .ports:- "8080:80"environment:- ASPNETCORE_ENVIRONMENT=Production- ConnectionStrings__DefaultConnection=Server=db;Database=TodoDB;User=sa;Password=YourPassword123;depends_on:- dbdb:image: mcr.microsoft.com/mssql/server:2022-latestenvironment:- ACCEPT_EULA=Y- SA_PASSWORD=YourPassword123ports:- "1433:1433"volumes:- sqldata:/var/opt/mssqlvolumes:sqldata:

13.4 监控和诊断

Application Insights集成

// 添加Application Insights
builder.Services.AddApplicationInsightsTelemetry();// 自定义遥测
public class TodoItemsController : ControllerBase
{private readonly TelemetryClient _telemetryClient;public TodoItemsController(TelemetryClient telemetryClient){_telemetryClient = telemetryClient;}[HttpPost]public async Task<ActionResult<TodoItem>> CreateTodoItem(TodoItem item){_telemetryClient.TrackEvent("TodoItemCreated", new Dictionary<string, string> { { "ItemName", item.Name } });// 业务逻辑...}
}

性能计数器

// 自定义性能指标
public class MetricsService
{private readonly IMetrics _metrics;private readonly Counter<int> _todoItemsCreated;public MetricsService(IMeterFactory meterFactory){var meter = meterFactory.Create("TodoApi");_todoItemsCreated = meter.CreateCounter<int>("todo_items_created");}public void IncrementTodoItemsCreated(){_todoItemsCreated.Add(1);}
}

wechat_2025-07-31_105805_938


http://www.sczhlp.com/news/7146/

相关文章:

  • 第十二章 测试和调试
  • 第十一章 API文档和Swagger
  • 多肽文库:类型与构建技术解析​
  • 在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
  • Ubuntu 22.04上Docker的安装
  • 什么是Bean?
  • 为什么要有 Buffer Pool?Mysql缓存能否替代Redis?
  • 评估LLM标注可靠性:人口偏见与模型解释
  • js实现根据汉字的拼音按照a-z的方式进行排序
  • 蚁景科技助力湖南烟草网络安全竞赛,筑牢行业安全防线
  • 【诊断】汽车电子的UDS诊断总结
  • Kali基础使用教程
  • IoC控制反转是什么意思?
  • 山东暑假集训2025 合集
  • 连接串联电路 连接并联电路
  • 那些被推迟的 C# 14 特性及其背后的故事
  • 2025长城杯半决赛-应急响应
  • 【办公自动化】使用Python来自动化处理Excel表格有哪些方法?
  • List
  • 再谈矩阵快速幂
  • 详细介绍:Vue3核心语法进阶(Props)
  • ps-insar与offset-tracking形变量与形变速率常识
  • Sunrun漏洞披露计划(VDP)正式上线 - 携手共建更安全的未来
  • FocalPO:通过聚焦正确偏好排序增强偏好优化技术
  • GitHub PR 冲突处理操作指南(基于 release 分支)
  • 统计学与运筹学的融合:驱动智能决策的核心力量
  • 5090显卡+Triton,轻松玩转GPT-OSS-20B!
  • 语音技术跨学科研究新趋势
  • 在Python代码中安全隔离依赖项的沙箱技术
  • 测度论02 勒贝格积分