亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解.NET?Core如何構(gòu)建一個彈性的HTTP請求機(jī)制

 更新時間:2025年01月22日 09:18:42   作者:代碼拾光  
在分布式系統(tǒng)中,服務(wù)間的依賴關(guān)系復(fù)雜,任何一個服務(wù)的故障都可能導(dǎo)致整個系統(tǒng)的不可用,這時彈性?HTTP?請求機(jī)制就可以幫助我們,下面我們就來看看.NET?Core如何構(gòu)建一個彈性的HTTP請求機(jī)制吧

1. 理解彈性 HTTP 請求機(jī)制

什么是彈性

彈性是指系統(tǒng)在面對故障或異常情況時,能夠保持或快速恢復(fù)到正常狀態(tài)的能力。在 HTTP 請求的上下文中,彈性意味著當(dāng)請求失敗時,系統(tǒng)能夠自動采取一系列措施(如重試、降級、斷路等)來確保請求最終成功或優(yōu)雅地處理失敗。

為什么需要彈性 HTTP 請求機(jī)制

在分布式系統(tǒng)中,服務(wù)間的依賴關(guān)系復(fù)雜,任何一個服務(wù)的故障都可能導(dǎo)致整個系統(tǒng)的不可用。彈性 HTTP 請求機(jī)制可以幫助我們:

  • 提高系統(tǒng)的可用性:通過重試、斷路等策略,減少因瞬態(tài)故障導(dǎo)致的系統(tǒng)不可用。
  • 增強(qiáng)用戶體驗(yàn):通過快速恢復(fù)和優(yōu)雅降級,減少用戶感知到的故障時間。
  • 降低運(yùn)維成本:通過自動化處理故障,減少人工干預(yù)的需求。

彈性機(jī)制的核心原則

  • 重試(Retry):在請求失敗時,自動重試一定次數(shù)。
  • 斷路器(Circuit Breaker):當(dāng)失敗率達(dá)到一定閾值時,暫時停止請求,避免雪崩效應(yīng)。
  • 超時(Timeout):設(shè)置請求的超時時間,避免長時間等待。
  • 降級(Fallback):當(dāng)請求失敗時,提供備用的響應(yīng)或行為。
  • 負(fù)載均衡(Load Balancing):將請求分散到多個服務(wù)實(shí)例,避免單點(diǎn)故障。

2. .NET Core 中的 HTTP 請求基礎(chǔ)

HttpClient 的使用

在 .NET Core 中,HttpClient 是用于發(fā)送 HTTP 請求和接收 HTTP 響應(yīng)的主要類。以下是一個簡單的 HttpClient 使用示例:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientApplication
{
    public static async Task Main(string[] args)
    {
        using (HttpClient client = new HttpClient())
        {
            // 發(fā)送 GET 請求
            HttpResponseMessage response = await client.GetAsync("https://******");
            if (response.IsSuccessStatusCode)
            {
                // 讀取響應(yīng)內(nèi)容
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
            }
            else
            {
                // 輸出錯誤狀態(tài)碼
                Console.WriteLine($"Error: {response.StatusCode}");
            }
        }
    }
}

HttpClientFactory 的引入

HttpClient 的直接使用存在一些問題,如 DNS 更新問題和套接字耗盡問題。為了解決這些問題,.NET Core 引入了 HttpClientFactory,它提供了更好的 HttpClient 生命周期管理和配置選項(xiàng)。

在 Startup.cs 中配置 HttpClientFactory

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 注冊 HttpClientFactory 并添加一個命名的 HttpClient
        services.AddHttpClient("ResilientClient", client =>
        {
            client.BaseAddress = new Uri("https://******"); // 設(shè)置基礎(chǔ)地址
            client.DefaultRequestHeaders.Add("Accept", "application/json"); // 設(shè)置默認(rèn)請求頭
        });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 其他中間件配置
    }
}

在控制器或服務(wù)中使用 HttpClientFactory

using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Threading.Tasks;

[ApiController]
[Route("[controller]")]
public class ResilientController : ControllerBase
{
    private readonly IHttpClientFactory _httpClientFactory;

    public ResilientController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        // 通過名稱獲取 HttpClient 實(shí)例
        var client = _httpClientFactory.CreateClient("ResilientClient");

        // 發(fā)送 GET 請求
        var response = await client.GetAsync("posts/list");
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            return Ok(content); // 返回成功響應(yīng)
        }

        return StatusCode((int)response.StatusCode); // 返回錯誤狀態(tài)碼
    }
}

優(yōu)點(diǎn):

  • 生命周期管理HttpClientFactory 自動管理 HttpClient 的生命周期,避免套接字耗盡問題。
  • 配置靈活:可以為不同的 API 配置不同的 HttpClient 實(shí)例。
  • DNS 更新支持HttpClientFactory 會定期刷新 DNS 緩存。

3. 實(shí)現(xiàn)基本的重試機(jī)制

簡單的重試邏輯

在沒有使用任何庫的情況下,我們可以通過簡單的循環(huán)來實(shí)現(xiàn)重試邏輯:

public async Task<string> GetDataWithRetryAsync(int maxRetries = 3)
{
    int retryCount = 0;
    while (true)
    {
        try
        {
            // 發(fā)送 GET 請求
            HttpResponseMessage response = await _httpClient.GetAsync("data");
            response.EnsureSuccessStatusCode(); // 確保請求成功
            return await response.Content.ReadAsStringAsync(); // 返回響應(yīng)內(nèi)容
        }
        catch (HttpRequestException)
        {
            retryCount++;
            if (retryCount >= maxRetries)
            {
                throw; // 超過重試次數(shù)后拋出異常
            }
        }
    }
}

使用 Polly 實(shí)現(xiàn)重試策略

Polly 是一個流行的 .NET 彈性庫,提供了豐富的策略來實(shí)現(xiàn)重試、斷路、超時等功能。以下是一個使用 Polly 實(shí)現(xiàn)重試策略的示例:

using Polly;
using Polly.Retry;

public class RetryService
{
    private readonly HttpClient _httpClient;
    private readonly AsyncRetryPolicy<HttpResponseMessage> _retryPolicy;

    public RetryService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        // 配置重試策略:最多重試 3 次,每次等待 2 秒
        _retryPolicy = Policy
            .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode) // 處理失敗響應(yīng)
            .Or<HttpRequestException>() // 處理請求異常
            .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 指數(shù)退避
    }

    public async Task<string> GetDataWithRetryAsync()
    {
        // 執(zhí)行重試策略
        HttpResponseMessage response = await _retryPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));
        response.EnsureSuccessStatusCode(); // 確保請求成功
        return await response.Content.ReadAsStringAsync(); // 返回響應(yīng)內(nèi)容
    }
}

重試策略的配置

Polly 允許我們靈活地配置重試策略,包括重試次數(shù)、重試間隔等。以下是一個配置指數(shù)退避重試策略的示例:

_retryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

4. 處理瞬態(tài)故障

什么是瞬態(tài)故障

瞬態(tài)故障是指那些暫時性的、通常會自動恢復(fù)的故障。例如,網(wǎng)絡(luò)抖動、服務(wù)暫時不可用等。瞬態(tài)故障的特點(diǎn)是它們通常是短暫的,重試后可能會成功。

常見的瞬態(tài)故障類型

  • 網(wǎng)絡(luò)抖動:網(wǎng)絡(luò)連接不穩(wěn)定導(dǎo)致的請求失敗。
  • 服務(wù)暫時不可用:目標(biāo)服務(wù)因負(fù)載過高或維護(hù)而暫時不可用。
  • 資源限制:目標(biāo)服務(wù)因資源限制(如 CPU、內(nèi)存)而暫時無法處理請求。

使用 Polly 處理瞬態(tài)故障

Polly 提供了多種策略來處理瞬態(tài)故障,包括重試、斷路、超時等。以下是一個結(jié)合重試和斷路策略的示例:

  // 定義重試策略,當(dāng)HTTP請求失敗時進(jìn)行重試
  var retryPolicy = Policy
      .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
      .Or<HttpRequestException>()
      // 設(shè)置重試次數(shù)為3次,每次重試的間隔時間按指數(shù)遞增(2^retryAttempt秒)
      .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

  // 定義熔斷策略,當(dāng)連續(xù)失敗次數(shù)達(dá)到閾值時,熔斷一段時間
  var circuitBreakerPolicy = Policy
      .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
      .Or<HttpRequestException>()
      .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); // 設(shè)置熔斷條件:連續(xù)失敗5次后,熔斷30秒

  // 將重試策略和熔斷策略組合成一個綜合策略
  var combinedPolicy = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);

  HttpResponseMessage response = await combinedPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

5. 實(shí)現(xiàn)斷路器模式

斷路器模式的概念

斷路器模式是一種用于防止系統(tǒng)因依賴服務(wù)故障而崩潰的設(shè)計模式。當(dāng)依賴服務(wù)的失敗率達(dá)到一定閾值時,斷路器會打開,停止所有請求,直到依賴服務(wù)恢復(fù)。

使用 Polly 實(shí)現(xiàn)熔斷策略

Polly 提供了 CircuitBreaker 策略來實(shí)現(xiàn)熔斷策略。以下是一個使用 Polly 實(shí)現(xiàn)熔斷策略的示例:

var circuitBreakerPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); // 連續(xù)失敗 5 次后,斷路器打開 30 秒

HttpResponseMessage response = await circuitBreakerPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

配置熔斷策略參數(shù)

Polly 允許我們配置熔斷策略的參數(shù),包括失敗次數(shù)閾值、斷路時間等。以下是一個配置斷路器的示例:

var circuitBreakerPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .CircuitBreakerAsync(
        exceptionsAllowedBeforeBreaking: 5, // 允許的失敗次數(shù)
        durationOfBreak: TimeSpan.FromSeconds(30) // 斷路時間
    );

6. 超時和超時策略

設(shè)置請求超時

在 HttpClient 中,我們可以通過 Timeout 屬性設(shè)置請求的超時時間:

_httpClient.Timeout = TimeSpan.FromSeconds(10); // 設(shè)置超時時間為 10 秒

使用 Polly 實(shí)現(xiàn)超時策略

Polly 提供了 Timeout 策略來實(shí)現(xiàn)超時控制。以下是一個使用 Polly 實(shí)現(xiàn)超時策略的示例:

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10)); // 設(shè)置超時時間為 10 秒

HttpResponseMessage response = await timeoutPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

超時與重試的結(jié)合

我們可以將超時策略與重試策略結(jié)合使用,以應(yīng)對因超時導(dǎo)致的請求失?。?/p>

var retryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 重試策略

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10)); // 超時策略

var combinedPolicy = Policy.WrapAsync(retryPolicy, timeoutPolicy); // 組合策略

HttpResponseMessage response = await combinedPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

7. 負(fù)載均衡與請求分流

負(fù)載均衡的基本概念

負(fù)載均衡是指將請求分散到多個服務(wù)實(shí)例,以避免單點(diǎn)故障和提高系統(tǒng)的可擴(kuò)展性。常見的負(fù)載均衡策略包括輪詢、隨機(jī)、加權(quán)輪詢等。

在 .NET Core 中實(shí)現(xiàn)負(fù)載均衡

在 .NET Core 中,我們可以通過配置多個 HttpClient 實(shí)例來實(shí)現(xiàn)負(fù)載均衡。以下是一個簡單的負(fù)載均衡示例:

public class LoadBalancer
{
    private readonly List<HttpClient> _httpClients;
    private readonly Random _random = new Random();

    public LoadBalancer(IHttpClientFactory httpClientFactory)
    {
        _httpClients = new List<HttpClient>
        {
            httpClientFactory.CreateClient("ServiceInstance1"), // 實(shí)例 1
            httpClientFactory.CreateClient("ServiceInstance2"), // 實(shí)例 2
            httpClientFactory.CreateClient("ServiceInstance3")  // 實(shí)例 3
        };
    }

    public async Task<string> GetDataAsync()
    {
        // 隨機(jī)選擇一個 HttpClient 實(shí)例
        HttpClient client = _httpClients[_random.Next(_httpClients.Count)];
        HttpResponseMessage response = await client.GetAsync("data");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

請求分流的策略

請求分流是指根據(jù)某些條件(如請求內(nèi)容、用戶身份等)將請求分發(fā)到不同的服務(wù)實(shí)例。以下是一個簡單的請求分流示例:

public async Task<string> GetDataAsync(string userId)
{
    // 根據(jù)用戶 ID 選擇不同的 HttpClient 實(shí)例
    HttpClient client = userId.StartsWith("A") ? _httpClients[0] : _httpClients[1];
    HttpResponseMessage response = await client.GetAsync("data");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}

8. 監(jiān)控與日志記錄

監(jiān)控 HTTP 請求的重要性

監(jiān)控 HTTP 請求可以幫助我們及時發(fā)現(xiàn)和解決問題,確保系統(tǒng)的穩(wěn)定性和可靠性。常見的監(jiān)控指標(biāo)包括請求成功率、響應(yīng)時間、錯誤率等。

使用 Application Insights 進(jìn)行監(jiān)控

Application Insights 是 Azure 提供的一個應(yīng)用性能管理服務(wù),可以幫助我們監(jiān)控和分析 HTTP 請求。以下是一個使用 Application Insights 監(jiān)控 HTTP 請求的示例:

public class HttpRemoteService
{
    private readonly HttpClient _httpClient;
    private readonly TelemetryClient _telemetryClient;

    public HttpRemoteService(HttpClient httpClient, TelemetryClient telemetryClient)
    {
        _httpClient = httpClient;
        _telemetryClient = telemetryClient;
    }

    public async Task<string> GetDataAsync()
    {
        var startTime = DateTime.UtcNow;
        var timer = System.Diagnostics.Stopwatch.StartNew();

        try
        {
            HttpResponseMessage response = await _httpClient.GetAsync("data");
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
        catch (Exception ex)
        {
            _telemetryClient.TrackException(ex); // 記錄異常
            throw;
        }
        finally
        {
            timer.Stop();
            _telemetryClient.TrackDependency("HTTP", "GET", "data", startTime, timer.Elapsed, true); // 記錄依賴調(diào)用
        }
    }
}

日志記錄的最佳實(shí)踐

日志記錄是監(jiān)控和調(diào)試的重要工具。以下是一些日志記錄的最佳實(shí)踐:

  • 記錄關(guān)鍵信息:如請求 URL、響應(yīng)狀態(tài)碼、響應(yīng)時間等。
  • 使用結(jié)構(gòu)化日志:便于日志的查詢和分析。
  • 避免記錄敏感信息:如密碼、令牌等。
public async Task<string> GetDataAsync()
{
    _logger.LogInformation("正在發(fā)送 HTTP GET 請求到 {Url}", "https://api.*****.com/data");

    try
    {
        HttpResponseMessage response = await _httpClient.GetAsync("data");
        response.EnsureSuccessStatusCode();
        string content = await response.Content.ReadAsStringAsync();
        _logger.LogInformation("請求成功,響應(yīng)狀態(tài)碼: {StatusCode}", response.StatusCode);
        return content;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "請求失敗: {Message}", ex.Message);
        throw;
    }
}

到此這篇關(guān)于詳解.NET Core如何構(gòu)建一個彈性的HTTP請求機(jī)制的文章就介紹到這了,更多相關(guān)NET Core構(gòu)建HTTP請求機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .Net平臺開發(fā)實(shí)踐的一些點(diǎn)滴總結(jié)(技術(shù)規(guī)范與實(shí)踐精華)

    .Net平臺開發(fā)實(shí)踐的一些點(diǎn)滴總結(jié)(技術(shù)規(guī)范與實(shí)踐精華)

    以下是本人對.Net平臺開發(fā)實(shí)踐的一些點(diǎn)滴總結(jié)。這里的技術(shù)規(guī)范主要是開發(fā)過程的代碼規(guī)范、數(shù)據(jù)庫設(shè)計規(guī)范、Com和.Net互操作規(guī)范;實(shí)踐精華是對技術(shù)實(shí)踐過程中的部分總結(jié)。
    2010-04-04
  • ASP.NET Core中使用LazyCache的全過程

    ASP.NET Core中使用LazyCache的全過程

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core中使用LazyCache的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • ASP.NET?Core?MVC中Tag?Helpers用法介紹

    ASP.NET?Core?MVC中Tag?Helpers用法介紹

    這篇文章介紹了ASP.NET?Core?MVC中Tag?Helpers的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • .net5?使用Hangfire的過程記錄

    .net5?使用Hangfire的過程記錄

    最近項(xiàng)目遇到這樣的需求,需要實(shí)現(xiàn)根據(jù)領(lǐng)取時間改變優(yōu)惠券狀態(tài)的功能,本文給大家分享.net5?使用Hangfire的過程記錄,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • 讓你的.NET程序兼容不同版本的Dll文件

    讓你的.NET程序兼容不同版本的Dll文件

    讓你的.NET程序兼容不同版本的Dll文件...
    2006-09-09
  • 集合類List與Dictonary實(shí)例練習(xí)

    集合類List與Dictonary實(shí)例練習(xí)

    本文將詳細(xì)介紹下List<>泛型集合/Dictonary<>字典/泛型集合練習(xí) /中日期轉(zhuǎn)換提取為方法以及泛型集合練習(xí)之翻譯軟件,感興趣的你可不要錯過了哈
    2013-02-02
  • ASP.NET中用js取CheckBoxList中值的方法實(shí)例

    ASP.NET中用js取CheckBoxList中值的方法實(shí)例

    用腳本取CheckBoxList中的值,并用"|"將其分開,之后將取到的值放入文本框,返回數(shù)據(jù)庫做添加或者修改
    2013-07-07
  • asp.net core標(biāo)簽助手的高級用法TagHelper+Form

    asp.net core標(biāo)簽助手的高級用法TagHelper+Form

    這篇文章主要為大家詳細(xì)介紹了asp.net core標(biāo)簽助手的高級用法TagHelper+Form,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • asp.net下的異步加載

    asp.net下的異步加載

    這篇文章主要為大家詳細(xì)介紹了asp.net的異步加載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • .net新興日志框架Serilog簡介

    .net新興日志框架Serilog簡介

    這篇文章介紹了.net下的新興日志框架Serilog,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論