找回密码
 立即注册
首页 业界区 安全 .NET微服务之环境准备

.NET微服务之环境准备

翱龟墓 前天 18:05
第三章 .NET 技术栈与环境准备

其实.net的环境搭建比较简单只需要下载对相对的版本和包就行了,没有nodejs这么多要设置的地方.
3.1 我们为何选择 .NET

3.1.1 .NET平台演进:从.NET Framework到.NET

.NET的演进历程可以说是微软拥抱开源和跨平台的缩影。
.NET Framework(传统时代)

  • 发布时间:2002年,那个ASP.NET Web Forms还盛行的年代
  • 特点:深度集成Windows生态,CLR+BCL的经典组合
  • 局限性:Windows绑定,闭源,更新周期长
  • 现状:维护模式,新项目不建议使用
.NET Core(跨平台革命)

  • 发布时间:2016年,微软的惊鸿一瞥
  • 特点:模块化设计,真正的跨平台支持
  • 里程碑:.NET Core 3.1成为众多企业的首选LTS版本
.NET(统一平台)

  • 发布时间:从.NET 5.0开始,微软完成了大一统
  • 目标:一个平台,统治所有应用场景
  • 版本策略:每年一个新版本,每两年一个LTS版本
从 .NET Framework 到 .NET Core:最早的项目紧紧绑在 Windows 上,部署一次就像搬家。Core 出现后,我第一次在 Linux 服务器上跑起了 ASP.NET Core,性能翻了一倍,部署脚本也终于写成了一行。
统一后的 .NET 版本线:从 .NET 5 开始,微软把 Framework 与 Core 的差异收拢。现在的基本操作是:生产线用 LTS(例如 .NET 8),预研用最新 Current 版,遇到 Breaking Change 先在预研环境踩坑。
生态系统的成熟:NuGet 包的活跃度是我们判断技术成熟度的指标之一。与 Java 社区相比,.NET 的包管理稍显克制,但常用库稳定、文档齐全,升级节奏可控。
graph LR    A[传统 .NET Framework] -->|迁移压力| B[.NET Core 1~3]    B -->|性能提升| C[.NET 5 统一平台]    C -->|LTS 节奏| D[.NET 6 / .NET 8]    C -->|快速试水| E[.NET 7 / .NET 9]    style A fill:#f7f4ea,stroke:#a58b5c    style B fill:#e8f4ff,stroke:#4a90e2    style C fill:#eaf7f0,stroke:#3fa46a    style D fill:#d7f0d8,stroke:#327c45    style E fill:#fdf0d5,stroke:#d18f1f3.1.2 C#语言特性与优势

C#是我最钟爱的语言之一,它就像一瓶陈年红酒,越品越香。从最初的1.0到现在的12.0,每一次版本更新都带来惊喜。
为什么我喜欢C#:

  • 现代与成熟并存:既有新语言的活力,又有老牌语言的稳重
  • 面向对象+函数式:完美的编程范式融合
  • 类型安全:编译时就能发现大部分问题
  • 性能卓越:JIT编译器和GC的性能优化让人印象深刻
  • 异步编程:async/await让异步代码像同步一样优雅
实战中常用的现代特性:
记录类型(Records)
在DDD中,值对象和DTO的定义变得异常简单:
  1. // 定义一个不可变的值对象
  2. public record ProductId(Guid Value);
  3. public record Money(decimal Amount, string Currency);
  4. // 定义DTO
  5. public record CreateProductRequest(string Name, string Description, Money Price);
  6. public record ProductDto(Guid Id, string Name, string Description, Money Price);
  7. // 使用示例
  8. var productId = new ProductId(Guid.NewGuid());
  9. var price = new Money(99.99m, "USD");
  10. var request = new CreateProductRequest("MacBook Pro", "Apple's flagship laptop", price);
  11. // 非破坏性修改
  12. var updatedRequest = request with { Description = "Apple's premium laptop" };
复制代码
模式匹配
让复杂的条件逻辑变得清晰:
  1. public class DiscountService
  2. {
  3.     public decimal CalculateDiscount(Product product, Customer customer) => (product, customer) switch
  4.     {
  5.         // 高价值商品 + VIP客户
  6.         ({ Price: > 1000 }, { IsVip: true }) => 0.2m,
  7.         
  8.         // 高价值商品
  9.         ({ Price: > 1000 }, _) => 0.1m,
  10.         
  11.         // VIP客户
  12.         (_, { IsVip: true }) => 0.15m,
  13.         
  14.         // 新品
  15.         ({ IsNew: true }, _) => 0.05m,
  16.         
  17.         // 默认情况
  18.         _ => 0m
  19.     };
  20. }
复制代码
全局using指令
减少样板代码:
  1. // GlobalUsings.cs
  2. global using System;
  3. global using System.Collections.Generic;
  4. global using System.Linq;
  5. global using System.Threading.Tasks;
  6. global using Microsoft.Extensions.Logging;
  7. // 项目文件中的配置
  8. <ItemGroup>
  9.   <Using Include="Microsoft.AspNetCore.Mvc" />
  10.   <Using Include="Microsoft.EntityFrameworkCore" />
  11. </ItemGroup>
复制代码
3.1.3 ASP.NET Core:微服务架构的利器

ASP.NET Core是我构建微服务的首选框架。它就像瑞士军刀,功能强大且设计精良。
核心优势:

  • 跨平台部署:Windows、Linux、macOS通吃
  • 性能怪兽:TechEmpower基准测试中常年霸榜
  • 模块化设计:按需引用,避免不必要的开销
  • 内置依赖注入:开箱即用,告别第三方容器
  • 中间件管道:请求处理流程清晰可控
实际项目中的配置示例:
  1. // Program.cs - .NET 6+的简化配置
  2. var builder = WebApplication.CreateBuilder(args);
  3. // 配置服务
  4. builder.Services.AddControllers();
  5. builder.Services.AddEndpointsApiExplorer();
  6. builder.Services.AddSwaggerGen(c =>
  7. {
  8.     c.SwaggerDoc("v1", new() { Title = "Product API", Version = "v1" });
  9. });
  10. // 配置DbContext
  11. builder.Services.AddDbContext<ProductDbContext>(options =>
  12.     options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
  13. // 注册应用服务
  14. builder.Services.AddScoped<IProductRepository, ProductRepository>();
  15. builder.Services.AddScoped<IProductService, ProductService>();
  16. // 配置AutoMapper
  17. builder.Services.AddAutoMapper(typeof(Program));
  18. // 配置HttpClient
  19. builder.Services.AddHttpClient<IInventoryService, InventoryService>(client =>
  20. {
  21.     client.BaseAddress = new Uri(builder.Configuration["Services:Inventory"]);
  22. });
  23. var app = builder.Build();
  24. // 配置请求管道
  25. if (app.Environment.IsDevelopment())
  26. {
  27.     app.UseSwagger();
  28.     app.UseSwaggerUI();
  29. }
  30. app.UseHttpsRedirection();
  31. app.UseAuthorization();
  32. app.MapControllers();
  33. app.Run();
复制代码
控制器实现:
  1. [ApiController]
  2. [Route("api/[controller]")]
  3. public class ProductsController : ControllerBase
  4. {
  5.     private readonly IProductService _productService;
  6.     private readonly IMapper _mapper;
  7.     private readonly ILogger<ProductsController> _logger;
  8.     public ProductsController(
  9.         IProductService productService,
  10.         IMapper mapper,
  11.         ILogger<ProductsController> logger)
  12.     {
  13.         _productService = productService;
  14.         _mapper = mapper;
  15.         _logger = logger;
  16.     }
  17.     [HttpGet("{id}")]
  18.     public async Task> GetById(Guid id)
  19.     {
  20.         try
  21.         {
  22.             var product = await _productService.GetByIdAsync(id);
  23.             if (product == null)
  24.                 return NotFound();
  25.             return Ok(_mapper.Map<ProductDto>(product));
  26.         }
  27.         catch (Exception ex)
  28.         {
  29.             _logger.LogError(ex, "Error getting product {ProductId}", id);
  30.             return StatusCode(500, "Internal server error");
  31.         }
  32.     }
  33.     [HttpPost]
  34.     public async Task> Create(CreateProductRequest request)
  35.     {
  36.         try
  37.         {
  38.             var product = await _productService.CreateAsync(request);
  39.             var productDto = _mapper.Map<ProductDto>(product);
  40.             
  41.             return CreatedAtAction(
  42.                 nameof(GetById),
  43.                 new { id = product.Id },
  44.                 productDto);
  45.         }
  46.         catch (ValidationException ex)
  47.         {
  48.             return BadRequest(ex.Message);
  49.         }
  50.         catch (Exception ex)
  51.         {
  52.             _logger.LogError(ex, "Error creating product");
  53.             return StatusCode(500, "Internal server error");
  54.         }
  55.     }
  56. }
复制代码
3.1.4 开发环境配置

推荐的开发工具:

  • Visual Studio 2022:调试体验无敌,适合偏 Windows 的用户,最近出了vs2026 的预览版,可以用来试试,还行就是界面有点像rider了。。
  • Rider:跨平台一致,Git 工具顺手。
  • VS Code + OmniSharp:轻量但需要精心配置插件,个人不建议这么用,如果你用ai+vscode 的话随意。
  • dotnet CLI 套件:dotnet new, dotnet restore, dotnet build 是日常三件套;dotnet watch 是本地调试的提速利器,据我所知基本没人用命令开发吧,除非你用的命令行系统那当我没说。
小贴士:团队约定“任何命令都要能在 dotnet --list-sdks 中的最低版本跑通”,否则 CI 会第一时间把问题暴露出来。
3.1.5 操作系统与运行时


  • 操作系统选择:开发机我主要用的还是Windows。部署的话一般用WinServer的IIS 、PM2, Linux 正常直接部署或者用 Docker、podman ,本人没有mac,不知道mac有没有什么问题
  • SDK 管理:都是直接下载基本没有过锁死版本的体验,理论上来说都是要用 .config/dotnet-tools.json 与 .global.json 一并提交,锁死版本,防止出现版本冲突的,但是正常开发嘛有没有什么要求,懂得都懂。
项目结构建议:
  1. src/
  2. ├── ProductService/          # 产品服务
  3. ├── OrderService/           # 订单服务
  4. ├── InventoryService/       # 库存服务
  5. ├── Shared/                 # 共享库
  6. │   ├── Common/            # 通用工具
  7. │   ├── Events/            # 集成事件
  8. │   └── Models/            # 共享模型
  9. tests/
  10. ├── ProductService.Tests/
  11. ├── OrderService.Tests/
  12. └── IntegrationTests/
  13. docker-compose.yml
  14. Directory.Build.props       # MSBuild属性
  15. NuGet.config               # NuGet配置
复制代码
NuGet包管理:
  1. <Project>
  2.   <PropertyGroup>
  3.     <TargetFramework>net8.0</TargetFramework>
  4.     <ImplicitUsings>enable</ImplicitUsings>
  5.     <Nullable>enable</Nullable>
  6.     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  7.   </PropertyGroup>
  8.   <ItemGroup>
  9.     <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
  10.     <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
  11.     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
  12.     <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
  13.   </ItemGroup>
  14. </Project>
复制代码
小结

环境准备不仅仅是“装一堆软件”,它是一次团队共同语言的对齐,但对于大部分开发者来说就是装一堆软件,除非公司要求版本控制比较严格。
                      团队常用的 .NET 环境拓扑    开发者电脑  Windows / macOS  Visual Studio / Rider  dotnet SDK 8.0 LTS    预研测试环境  Docker Compose  SQL Server / PostgreSQL  集成 Serilog + Seq    生产 Kubernetes  Azure AKS / 阿里云 ACK  蓝绿发布 + 金丝雀  集中日志与追踪        统一工具链  dotnet tool restore · dotnet workload restore · git hooks  所有脚本在 CI 中复用,确保“在任何机器上都能一键跑通”。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册