當前位置: 妍妍網 > 碼農

使用 Microsoft.Extensions.ServiceDiscovery 進行服務發現並呼叫

2024-06-24碼農

簡介

在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴寫死的地址。以前如果你搜 .NET Service Discovery,大機率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Microsoft.Extensions.ServiceDiscovery。這個包出自 Aspire 計畫,提供了一個簡便的方式在 .NET 中實作服務發現。

安裝 Nuget 包

首先,需要安裝 Microsoft 提供的 Service Discovery 包。使用以下命令添加包到你的計畫中:

dotnet add package Microsoft.Extensions.ServiceDiscovery

這一步確保你的計畫具有使用 Service Discovery 所需的依賴項。

配置和註冊服務

接下來,需要在計畫中配置和註冊 Service Discovery。開啟 Program.cs Startup.cs 檔,並添加以下程式碼:

builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(static http =>
{
http.AddServiceDiscovery();
});

這段程式碼將 Service Discovery 註冊到依賴註入容器中,並配置預設的 HTTP 客戶端使用 Service Discovery。

配置伺服端點

為了讓 Service Discovery 知道如何找到其他服務,需要在配置檔(如 appsettings.json )中定義伺服端點。例如:

{
"Services": {
"weatherReport": {
"http": [
"localhost:5089",
"127.0.0.1:5089"
],
"https": []
}
}
}

在這個配置中,我們定義了名為 weatherReport 的服務的 HTTP 端點。Service Discovery 將使用這些資訊來尋找和存取該服務。

使用服務名進行 HTTP 呼叫

配置完成後,可以透過 服務名稱 進行 HTTP 呼叫。以下程式碼展示了如何使用 IHttpClientFactory 進行服務呼叫:

app.MapGet("/report"async (IHttpClientFactory factory) =>
{
conststring serviceName = "weatherReport";
var client = factory.CreateClient();
var response = await client.GetAsync($"http://{serviceName}/weatherforecast");
var content = await response.Content.ReadAsStringAsync();
return content;
});

這段程式碼建立了一個 HTTP 客戶端,透過服務名 weatherReport 發起請求,並返回響應內容。

啟動服務後嘗試進行呼叫:

透過觀察日誌可以看到 http://weatherreport/weatherforecast 被轉換成 http://127.0.0.1:5089 或 http://localhost:5089 的 http 呼叫。

負載均衡

如果服務配置了多個 endpoint 。那麽進行服務呼叫的時候我們往往需要按實際情況配置 Load-balancing 的策略:

builder.Services.AddHttpClient<CatalogServiceClient>(
static client => client.BaseAddress = new("http://weatherReport"));
.AddServiceDiscovery(RandomServiceEndpointSelector.Instance);

  • PickFirstServiceEndpointSelectorProvider.Instance: 總是呼叫第一個

  • RoundRobinServiceEndpointSelectorProvider.Instance: 輪詢呼叫

  • RandomServiceEndpointSelectorProvider.Instance: 隨機呼叫

  • PowerOfTwoChoicesServiceEndpointSelectorProvider.Instance:解釋太長看英文原文吧。Power-of-two-choices, which attempts to pick the least heavily loaded endpoint based on the Power of Two Choices algorithm for distributed load balancing, degrading to randomly selecting an endpoint when either of the provided endpoints do not have the IEndpointLoadFeature

  • 總結

    Service Discovery 是實作微服務架構的重要元件。在 .NET 中,透過簡單的配置和使用,可以不用 hardcode IP 跟 port 而使用服務名,可以大大簡化服務間的呼叫。同時還能配置不同的呼叫策略,進行負載均衡。