.NET Core 中用于构建高性能 API 的高级技术

作者:微信公众号:【架构师老卢】
8-2 7:51
29

概述:在当今快节奏的技术环境中,构建高性能 API 对于提供无缝的用户体验和维护可扩展的后端系统至关重要。.NET Core 为开发强大的 API 提供了一个强大的框架,但掌握高级技术可以将你的技能提升到一个新的水平。在这篇文章中,我们将探讨几种高级技术来增强 .NET Core API 的性能、安全性和可伸缩性。高效的数据访问优化 Entity Framework Core 查询Entity Framework Core (EF Core) 是适用于 .NET Core 的强大 ORM,但低效的查询可能会导致性能瓶颈。下面是一些优化 EF Core 查询的提示:**1. 使用 AsNoTracki

在当今快节奏的技术环境中,构建高性能 API 对于提供无缝的用户体验和维护可扩展的后端系统至关重要。.NET Core 为开发强大的 API 提供了一个强大的框架,但掌握高级技术可以将你的技能提升到一个新的水平。在这篇文章中,我们将探讨几种高级技术来增强 .NET Core API 的性能、安全性和可伸缩性。

高效的数据访问

优化 Entity Framework Core 查询
Entity Framework Core (EF Core) 是适用于 .NET Core 的强大 ORM,但低效的查询可能会导致性能瓶颈。下面是一些优化 EF Core 查询的提示:

**1. 使用 AsNoTracking 进行只读查询:**默认情况下,EF Core 会跟踪对实体的更改。对于只读操作,请使用“AsNoTracking”来提高性能。

var products = await _context.Products.AsNoTracking().ToListAsync();

**2. 避免 N+1 查询问题:**使用预先加载('Include')或显式加载在单个查询中获取相关数据。

var orders = await _context.Orders  
  .Include(o => o.OrderItems)  
  .ToListAsync();

**3. 分页:**使用“跳过”和“获取”进行高效分页。

var pagedOrders = await _context.Orders  
  .Skip((pageNumber - 1) * pageSize)  
  .Take(pageSize)  
  .ToListAsync();

使用 Dapper 进行高性能数据访问
对于性能至关重要的场景,请考虑使用 Dapper,一种轻量级 ORM。Dapper 执行原始 SQL 查询并将结果映射到对象,与 EF Core 相比,提供更快的性能。

using (var connection = new SqlConnection(connectionString))  
{  
    var sql = "SELECT * FROM Products WHERE CategoryId = @CategoryId";  
    var products = await connection.QueryAsync<Product>(sql, new { CategoryId = categoryId });  
}

异步编程

利用 async/await 进行非阻塞 I/O 操作
异步编程对于构建可扩展的 API 至关重要。通过使用 'async' 和 'await',您可以执行非阻塞 I/O 操作,从而释放线程来处理其他请求。

public async Task<IActionResult> GetProduct(int id)  
{  
    var product = await _context.Products.FindAsync(id);  
    if (product == null)  
    {  
        return NotFound();  
    }  
    return Ok(product);  
}

编写高效异步代码的最佳实践

  1. **避免阻止呼叫:**避免使用“Task.Wait()”或“Task.Result”,它们会阻止调用线程。
  2. **使用 ConfigureAwait(false):**在库代码中,使用“ConfigureAwait(false)”来避免捕获同步上下文。
await SomeAsyncOperation().ConfigureAwait(false);

缓存策略

使用 MemoryCache
实现内存中缓存内存中缓存可以通过在内存中存储经常访问的数据来显著提高性能。

public class ProductService  
{  
    private readonly IMemoryCache _cache;  
  
    public ProductService(IMemoryCache cache)  
    {  
        _cache = cache;  
    }  
  
    public Product GetProduct(int id)  
    {  
        if (!_cache.TryGetValue(id, out Product product))  
        {  
            product = _context.Products.Find(id);  
            if (product != null)  
            {  
                _cache.Set(id, product, TimeSpan.FromMinutes(5));  
            }  
        }  
        return product;  
    }  
}

将分布式缓存与 Redis
结合使用对于分布式缓存,请使用 Redis 跨多个服务器存储缓存数据。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddStackExchangeRedisCache(options =>  
    {  
        options.Configuration = Configuration.GetConnectionString("RedisConnection");  
        options.InstanceName = "SampleInstance";  
    });  
}

API 安全

实现 JWT 身份验证
JWT(JSON Web 令牌)是一种用于保护 API 的常用方法。它允许无状态身份验证,其中服务器在不存储会话数据的情况下验证令牌的有效性。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)  
            .AddJwtBearer(options =>  
            {  
                options.TokenValidationParameters = new TokenValidationParameters  
                {  
                    ValidateIssuer = true,  
                    ValidateAudience = true,  
                    ValidateLifetime = true,  
                    ValidateIssuerSigningKey = true,  
                    ValidIssuer = Configuration["Jwt:Issuer"\],  
                    ValidAudience = Configuration["Jwt:Issuer"\],  
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"\]))  
                };  
            });  
}

使用 OAuth2 和 OpenID Connect
保护 APIOAuth2 和 OpenID Connect 为保护 API 和管理用户身份提供了强大的框架。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddAuthentication(options =>  
    {  
        options.DefaultScheme = "Cookies";  
        options.DefaultChallengeScheme = "oidc";  
    })  
    .AddCookie("Cookies")  
    .AddOpenIdConnect("oidc", options =>  
    {  
        options.Authority = "https://your-identity-server";  
        options.ClientId = "client-id";  
        options.ClientSecret = "client-secret";  
        options.ResponseType = "code";  
        options.SaveTokens = true;  
    });  
}

性能监控和诊断

使用 Application Insights 进行监视
Application Insights 提供了强大的工具,用于监视应用程序、诊断问题和深入了解性能。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddApplicationInsightsTelemetry(Configuration["ApplicationInsights:InstrumentationKey"]);  
}

使用 .NET Core 诊断工具
进行分析使用 .NET Core 的内置诊断工具(例如“dotnet-counters”和“dotnet-trace”CLI 工具)来分析和分析应用程序的性能。

缩放和负载均衡

使用 Kubernetes 和 Docker
进行水平扩展在 Docker 容器中部署 .NET Core 应用程序,并使用 Kubernetes 跨多个节点编排和缩放应用程序。

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: my-api  
spec:  
  replicas: 3  
  template:  
    spec:  
      containers:  
      - name: my-api  
        image: my-api-image:latest

使用 NGINX 和 Azure 负载均衡器
的负载均衡策略使用 NGINX 或 Azure 负载均衡器在应用程序的多个实例之间分配流量,从而确保高可用性和可靠性。

速率限制和限制

实施速率限制以保护 API
使用 ASP.NET 核心中间件实现速率限制,保护您的 API 免受滥用并确保公平使用。

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddRateLimiter(options =>  
    {  
        options.AddFixedWindowLimiter("fixed", limiterOptions =>  
        {  
            limiterOptions.PermitLimit = 100;  
            limiterOptions.Window = TimeSpan.FromMinutes(1);  
            limiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;  
            limiterOptions.QueueLimit = 2;  
        });  
    });  
}

使用 ASP.NET 核心中间件进行限制
实施限制以管理并发请求数并防止服务器过载。

public class ThrottlingMiddleware  
{  
    private readonly RequestDelegate _next;  
  
    public ThrottlingMiddleware(RequestDelegate next)  
    {  
        _next = next;  
    }  
  
    public async Task InvokeAsync(HttpContext context)  
    {  
        // Throttling logic here  
        await _next(context);  
    }  
}

在 .NET Core 中构建高性能 API 涉及利用高级技术进行高效的数据访问、异步编程、缓存、安全性、性能监视、缩放和速率限制。通过实施这些最佳实践,您可以确保您的 API 可靠、可扩展且安全,从而提供无缝的用户体验。采用这些高级技术来提升 .NET Core 后端开发技能,并构建在竞争激烈的技术环境中脱颖而出的 API。

阅读排行