簡體   English   中英

如何在 ASP.net 內核中在運行時更新 HttpClient 基地址

[英]How to update HttpClient base address at runtime in ASP.net core

我使用 ASP.net 核心 API 創建了幾個微服務
這些微服務之一返回其他微服務的確切地址
如果地址更改,如何在不重新啟動的情況下更新任何這些微服務的地址

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient("MainMicroservice", x =>
        {
            x.BaseAddress = new Uri("http://mainmicroservice.com");
        });
        services.AddHttpClient("Microservice1", x =>
        {
            x.BaseAddress = new Uri("http://microservice1.com");
        });
        services.AddHttpClient("Microservice2", x =>
        {
            x.BaseAddress = new Uri("http://microservice2.com");
        });
        services.AddHttpClient("Microservice3", x =>
        {
            x.BaseAddress = new Uri("http://microservice3.com");
        });
    }
}
public class Test
{
    private readonly IHttpClientFactory _client;

    public Test(IHttpClientFactory client)
    {
        _client = client;
    }

    public async Task<string> Test()
    {
        var repeat = false;

        do
        {
            try
            {
                return await _client
                    .CreateClient("Microservice1")
                    .GetStringAsync("Test")
                    .ConfigureAwait(false);
            }
            catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound)
            {
                var newAddress = await _client
                    .CreateClient("MainMicroservice")
                    .GetStringAsync("Microservice1")
                    .ConfigureAwait(false);

                //todo change address of microservice1

                repeat = true;
            }
        } while (repeat);
    }
}

如果您遲早(更早地)構建基於微服務的解決方案,您將遇到一個服務需要與另一個服務通信的情況。 為了做到這一點,調用者必須知道目標微服務在網絡中的確切位置,它們在其中運行。

您必須以某種方式提供目標微服務偵聽請求的IP 地址端口 您可以使用配置文件或環境變量來做到這一點,但這種方法有一些缺點和限制。

  1. 首先是您必須為所有環境維護和正確部署配置文件:本地開發、測試、預生產和生產。 在添加新服務或將現有服務移動到不同節點時忘記更新任何這些配置將導致在運行時發現錯誤。
  2. 其次,更重要的問題是它僅適用於static 環境,這意味着您無法動態添加/刪除節點,因此您將無法動態擴展系統。 自主擴展和部署給定微服務的能力是基於微服務架構的關鍵優勢之一,我們不想失去這種能力。

因此我們需要引入服務發現 服務發現是一種允許服務找到彼此的網絡位置的機制。 這種模式有許多可能的實現。

我們有兩種類型的服務發現:客戶端和服務器端,您可以在 ASP.NET 項目中找到一個很好的 NuGet package 來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM