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

NET_Aspire云原生微服务实战:从本地开发到生产部署完整指南

.NET Aspire 云原生微服务实战:从本地开发到生产部署完整指南

作者:Crown_22 | 云原生 & .NET 开发者 | 技术分享


前言

2024年微软正式发布 .NET Aspire——一个专为云原生应用设计的开发框架。它不是又一个微服务框架,而是解决了微服务开发中最让人头疼的问题:本地开发体验

传统微服务开发的痛点:

  • 本地启动10个服务,每个都要单独配置
  • 服务发现、数据库连接、消息队列的配置到处都是硬编码
  • 本地环境和生产环境的配置差异巨大
  • Dashboard 观测性工具部署复杂

.NET Aspire 的核心理念:用 C# 代码定义整个应用拓扑,一键启动本地开发环境,无缝迁移到生产


一、.NET Aspire 架构全景

1.1 核心组件

┌─────────────────────────────────────────────────────┐ │ .NET Aspire Dashboard │ │ (Traces, Metrics, Logs, Console) │ └──────────────────────┬──────────────────────────────┘ │ ┌──────────────────────┴──────────────────────────────┐ │ AppHost 项目 │ │ (编排器:定义所有服务和资源) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ Web API │ │ Worker │ │ Redis │ │ Postgres│ │ │ │ Service │ │ Service │ │ (资源) │ │ (资源) │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ └─────────────────────────────────────────────────────┘ │ ┌──────────────────────┴──────────────────────────────┐ │ ServiceDefaults 项目 │ │ (OpenTelemetry, 服务发现, 健康检查, 弹性策略) │ └─────────────────────────────────────────────────────┘

1.2 项目结构

MyCloudApp/ ├── src/ │ ├── MyApp.AppHost/ # 编排器项目 │ │ ├── Program.cs │ │ └── MyApp.AppHost.csproj │ ├── MyApp.ServiceDefaults/ # 服务默认配置 │ │ ├── Extensions.cs │ │ └── MyApp.ServiceDefaults.csproj │ ├── MyApp.ApiService/ # Web API 服务 │ │ ├── Program.cs │ │ └── MyApp.ApiService.csproj │ └── MyApp.WorkerService/ # 后台任务服务 │ ├── Program.cs │ └── MyApp.WorkerService.csproj ├── tests/ └── MyApp.sln

二、从零搭建 Aspire 项目

2.1 创建项目

# 安装 Aspire 工作负载dotnet workloadinstallaspire# 创建 Aspire 解决方案dotnet new aspire-starter-nMyCloudApp# 或者手动添加到现有项目dotnet new aspire-apphost-nMyApp.AppHost

2.2 AppHost 编排器

// src/MyApp.AppHost/Program.csvarbuilder=DistributedApplication.CreateBuilder(args);// 添加基础设施资源varpostgres=builder.AddPostgres("postgres").WithDataVolume().WithPgAdmin();// 开发时启用 PGAdmin 管理界面varredis=builder.AddRedis("redis").WithDataVolume();varrabbitmq=builder.AddRabbitMQ("rabbitmq").WithManagementPlugin();// 添加数据库varcatalogDb=postgres.AddDatabase("catalogdb");varorderDb=postgres.AddDatabase("orderdb");// 添加微服务varcatalogApi=builder.AddProject<Projects.MyApp_CatalogService>("catalog-api").WithReference(catalogDb).WithReference(redis).WithHttpHealthCheck("/health");varorderApi=builder.AddProject<Projects.MyApp_OrderService>("order-api").WithReference(orderDb).WithReference(rabbitmq).WithReference(catalogApi)// 服务间依赖.WithHttpHealthCheck("/health");varworkerService=builder.AddProject<Projects.MyApp_WorkerService>("worker").WithReference(rabbitmq).WithReference(redis);builder.Build().Run();

2.3 ServiceDefaults 配置

// src/MyApp.ServiceDefaults/Extensions.csusingMicrosoft.Extensions.DependencyInjection;usingMicrosoft.Extensions.Diagnostics.HealthChecks;usingOpenTelemetry;usingOpenTelemetry.Metrics;usingOpenTelemetry.Resources;usingOpenTelemetry.Trace;namespaceMicrosoft.Extensions.Hosting;publicstaticclassExtensions{publicstaticIHostApplicationBuilderAddServiceDefaults(thisIHostApplicationBuilderbuilder){builder.ConfigureOpenTelemetry();builder.AddDefaultHealthChecks();returnbuilder;}privatestaticvoidConfigureOpenTelemetry(thisIHostApplicationBuilderbuilder){builder.Logging.AddOpenTelemetry(logging=>{logging.IncludeFormattedMessage=true;logging.IncludeScopes=true;});builder.Services.AddOpenTelemetry().ConfigureResource(resource=>resource.AddService(builder.Environment.ApplicationName)).WithTracing(tracing=>tracing.AddAspNetCoreInstrumentation().AddGrpcClientInstrumentation().AddHttpClientInstrumentation().AddSource("MyApp.*")).WithMetrics(metrics=>metrics.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddRuntimeInstrumentation().AddMeter("MyApp.*"));builder.Services.AddOpenTelemetry().UseOtlpExporter();}privatestaticvoidAddDefaultHealthChecks(thisIHostApplicationBuilderbuilder){builder.Services.AddHealthChecks().AddCheck("self",()=>HealthCheckResult.Healthy());}}

三、微服务实现

3.1 Catalog Service(商品服务)

// src/MyApp.CatalogService/Program.csusingMicrosoft.EntityFrameworkCore;usingMyApp.CatalogService.Data;usingMyApp.CatalogService.Endpoints;varbuilder=WebApplication.CreateBuilder(args);// 服务注册builder.AddServiceDefaults();builder.AddNpgsqlDbContext<CatalogDbContext>("catalogdb");builder.Services.AddStackExchangeRedisCache(builder.Configuration.GetConnectionString("redis")!);builder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();varapp=builder.Build();// 中间件app.MapDefaultEndpoints();app.UseSwagger();app.UseSwaggerUI();// 数据库迁移using(varscope=app.Services.CreateScope()){vardb=scope.ServiceProvider.GetRequiredService<CatalogDbContext>();awaitdb.Database.MigrateAsync();}// 端点app.MapCatalogEndpoints();app.Run();
// src/MyApp.CatalogService/Models/Product.csnamespaceMyApp.CatalogService.Models;publicclassProduct{publicintId{get;set;}publicstringName{get;set;}=string.Empty;publicstringDescription{get;set;}=string.Empty;publicdecimalPrice{get
http://www.cnnetsun.cn/news/2696795.html

相关文章:

  • 人工智能驱动 DevOps 工具:加速软件开发全生命周期,缩短周期时间 20% - 40%
  • 车联网环境下并联混合动力客车控制策略优化方案【附仿真】“
  • 做自媒体,我的素材库从“一团乱麻”到“随用随取”
  • 如何快速掌握bert-base-thai-upos-openmind:基于BERT的泰语NLP模型完整指南
  • 全球仅17家事务所获授Sora 2建筑级渲染白名单(附内部评估矩阵表与3个准入失败真实复盘案例)
  • Mac版百度网盘极速下载优化:免费解锁SVIP加速体验完整指南
  • 如何做好经营分析?一文看懂经营分析必备的3大财务思维
  • 039、磁场定向控制原理
  • 15分钟搞定黑苹果EFI配置:OpCore-Simplify图形化工具终极指南
  • YOLO26涨点改进| ICML 2024顶会| 独家创新首发、注意力改进篇| 引入Mobile-Attention移动注意力,含二次创新多种改进点,助力目标检测、图像分割、图像分类等视觉任务高效涨点
  • 在职评职称,既要压低查重率又要降低 AI 率,有哪些真正靠谱的一站式解决方案?
  • AnnouncementClassfication实战案例:如何用Python实现公告相关性自动识别
  • KMS智能激活:一键解决Windows和Office激活难题的完整指南
  • 显卡驱动冲突的终结者:Display Driver Uninstaller (DDU) 深度重构指南
  • 终极解决方案:如何用WeChatMsg永久保存微信聊天记录并创造个人数据资产
  • GameCube黑屏故障维修指南:5A熔断器与IPL芯片虚焊修复
  • 蓝牙串口模块AT指令配置实战:从HC-05原理到SH-B30应用
  • 用火柴盒与毛线制作交互式逻辑门:从布尔代数到物理模型
  • 基于深度学习的无人机检测系统(YOLOv12完整代码+论文示例+多算法对比)
  • 别再为水质数据发愁了!用LSTM+Transformer搞定时间序列预测(附Python代码)
  • UI-TARS桌面应用深度部署指南:构建企业级视觉智能体系统
  • Linux CIFSwitch 内核新漏洞允许攻击者获得 root 权限
  • 企业内训效率提升300%?Sora 2批量生成培训视频的12个已验证生产参数,限内部技术白皮书流出
  • 抖音无水印下载终极指南:3个超简单步骤搞定视频批量保存
  • OBS多路推流插件完整指南:如何实现高效多平台直播推流
  • 3分钟掌握B站视频下载:免费获取4K大会员内容的终极解决方案
  • 92.手机系统故障深度修复:软砖/硬砖/分区损坏一站式刷机解决方案
  • 别再手动拖UI了!用Unity的Scroll Rect+Layout Group,5分钟搞定动态任务列表
  • 如何快速构建低成本超声波定向音频系统:完整实现方案
  • 独立站SEO优化怎么做?2026保姆级教程