.NET微服务之环境准备

第三章 .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:#d18f1f

3.1.2 C#语言特性与优势

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

为什么我喜欢C#:

  1. 现代与成熟并存:既有新语言的活力,又有老牌语言的稳重
  2. 面向对象+函数式:完美的编程范式融合
  3. 类型安全:编译时就能发现大部分问题
  4. 性能卓越:JIT编译器和GC的性能优化让人印象深刻
  5. 异步编程:async/await让异步代码像同步一样优雅

实战中常用的现代特性:

记录类型(Records)
在DDD中,值对象和DTO的定义变得异常简单:

// 定义一个不可变的值对象
public record ProductId(Guid Value);

public record Money(decimal Amount, string Currency);

// 定义DTO
public record CreateProductRequest(string Name, string Description, Money Price);

public record ProductDto(Guid Id, string Name, string Description, Money Price);

// 使用示例
var productId = new ProductId(Guid.NewGuid());
var price = new Money(99.99m, "USD");
var request = new CreateProductRequest("MacBook Pro", "Apple's flagship laptop", price);

// 非破坏性修改
var updatedRequest = request with { Description = "Apple's premium laptop" };

模式匹配
让复杂的条件逻辑变得清晰:

public class DiscountService
{
    public decimal CalculateDiscount(Product product, Customer customer) => (product, customer) switch
    {
        // 高价值商品 + VIP客户
        ({ Price: > 1000 }, { IsVip: true }) => 0.2m,
        
        // 高价值商品
        ({ Price: > 1000 }, _) => 0.1m,
        
        // VIP客户
        (_, { IsVip: true }) => 0.15m,
        
        // 新品
        ({ IsNew: true }, _) => 0.05m,
        
        // 默认情况
        _ => 0m
    };
}

全局using指令
减少样板代码:

// GlobalUsings.cs
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
global using Microsoft.Extensions.Logging;

// 项目文件中的配置
<ItemGroup>
  <Using Include="Microsoft.AspNetCore.Mvc" />
  <Using Include="Microsoft.EntityFrameworkCore" />
</ItemGroup>

3.1.3 ASP.NET Core:微服务架构的利器

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

核心优势:

  1. 跨平台部署:Windows、Linux、macOS通吃
  2. 性能怪兽:TechEmpower基准测试中常年霸榜
  3. 模块化设计:按需引用,避免不必要的开销
  4. 内置依赖注入:开箱即用,告别第三方容器
  5. 中间件管道:请求处理流程清晰可控

实际项目中的配置示例:

// Program.cs - .NET 6+的简化配置
var builder = WebApplication.CreateBuilder(args);

// 配置服务
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new() { Title = "Product API", Version = "v1" });
});

// 配置DbContext
builder.Services.AddDbContext<ProductDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

// 注册应用服务
builder.Services.AddScoped<IProductRepository, ProductRepository>();
builder.Services.AddScoped<IProductService, ProductService>();

// 配置AutoMapper
builder.Services.AddAutoMapper(typeof(Program));

// 配置HttpClient
builder.Services.AddHttpClient<IInventoryService, InventoryService>(client =>
{
    client.BaseAddress = new Uri(builder.Configuration["Services:Inventory"]);
});

var app = builder.Build();

// 配置请求管道
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

控制器实现:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;
    private readonly IMapper _mapper;
    private readonly ILogger<ProductsController> _logger;

    public ProductsController(
        IProductService productService, 
        IMapper mapper, 
        ILogger<ProductsController> logger)
    {
        _productService = productService;
        _mapper = mapper;
        _logger = logger;
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<ProductDto>> GetById(Guid id)
    {
        try
        {
            var product = await _productService.GetByIdAsync(id);
            if (product == null)
                return NotFound();

            return Ok(_mapper.Map<ProductDto>(product));
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error getting product {ProductId}", id);
            return StatusCode(500, "Internal server error");
        }
    }

    [HttpPost]
    public async Task<ActionResult<ProductDto>> Create(CreateProductRequest request)
    {
        try
        {
            var product = await _productService.CreateAsync(request);
            var productDto = _mapper.Map<ProductDto>(product);
            
            return CreatedAtAction(
                nameof(GetById), 
                new { id = product.Id }, 
                productDto);
        }
        catch (ValidationException ex)
        {
            return BadRequest(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error creating product");
            return StatusCode(500, "Internal server error");
        }
    }
}

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 操作系统与运行时

  1. 操作系统选择:开发机我主要用的还是Windows。部署的话一般用WinServer的IIS 、PM2, Linux 正常直接部署或者用 Docker、podman ,本人没有mac,不知道mac有没有什么问题
  2. SDK 管理:都是直接下载基本没有过锁死版本的体验,理论上来说都是要用 .config/dotnet-tools.json.global.json 一并提交,锁死版本,防止出现版本冲突的,但是正常开发嘛有没有什么要求,懂得都懂。

项目结构建议:

src/
├── ProductService/          # 产品服务
├── OrderService/           # 订单服务
├── InventoryService/       # 库存服务
├── Shared/                 # 共享库
│   ├── Common/            # 通用工具
│   ├── Events/            # 集成事件
│   └── Models/            # 共享模型
tests/
├── ProductService.Tests/
├── OrderService.Tests/
└── IntegrationTests/
docker-compose.yml
Directory.Build.props       # MSBuild属性
NuGet.config               # NuGet配置

NuGet包管理:

<!-- Directory.Build.props -->
<Project>
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
    <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
  </ItemGroup>
</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 中复用,确保“在任何机器上都能一键跑通”。
posted @ 2025-10-23 15:45  高宏顺  阅读(11)  评论(0)    收藏  举报