首页 > 其他分享 >使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用

使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用

时间:2024-09-14 16:24:23浏览次数:10  
标签:服务 HTTP 调用 http Service Extensions ServiceDiscovery Microsoft Discovery

简介

在现代微服务架构中,服务发现(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.csStartup.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) =>
{
    const string serviceName = "weatherReport";
    var client = factory.CreateClient();
    var response = await client.GetAsync($"http://{serviceName}/weatherforecast");
    var content = await response.Content.ReadAsStringAsync();

    return content;
});

这段代码创建了一个 HTTP 客户端,通过服务名 weatherReport 发起请求,并返回响应内容。

启动服务后尝试进行调用:

使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用_ide

使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用_ide_02

通过观察日志可以看到 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 而使用服务名,可以大大简化服务间的调用。同时还能配置不同的调用策略,进行负载均衡。

关注我的公众号一起玩转技术

使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用_HTTP_03

作者:Agile.Zhou


标签:服务,HTTP,调用,http,Service,Extensions,ServiceDiscovery,Microsoft,Discovery
From: https://blog.51cto.com/u_15478536/12017735

相关文章

  • Microsoft Activation Scripts
    Open-sourceWindowsandOfficeactivatorfeaturingHWID,Ohook,KMS38,andOnlineKMSactivationmethods,alongwithadvancedtroubleshooting.Method1-PowerShell(Windows8andlater)❤️OpenPowerShell(NotCMD).Todothat,right-clickontheWindows......
  • [Linux] Microsoft Teams 无法进行屏幕分享
    在Ubuntu22.04中,MicrosoftTeams无法进行屏幕分享的问题可能与桌面环境中的屏幕共享集成缺失有关。运行以下命令可以解决这个问题:sudoaptinstallxdg-desktop-portal-gnomexdg-desktop-portalxdg-desktop-portal是一个通用的桌面门户服务,它提供了一组标准接口,允许沙盒......
  • Microsoft 365 新功能速递:文档版本控制新功能发布
    51CTOBlog地址:https://blog.51cto.com/u_13969817Versionhistory(版本控制)是MicrosoftSharePoint和OneDrive中的365内置数据保护不可或缺的一部分。Versionhistory允许用户查看或还原到以前的版本,有助于撤消意外更改(无论是意外更改还是由于勒索软件等恶意活动),它还可确保......
  • Git Extensions:一个.NET开源的 Git 图形用户界面(GUI)工具
    前言今天大姚给大家分享一个.NET开源、免费的用于管理Git存储库的独立图形用户界面(GUI)工具,它还与Windows资源管理器和 MicrosoftVisualStudio(2015/2017/2019/2022)集成:GitExtensions。Git新手指南:从基础到实践的全方位教程功能介绍图形用户界面:提供一个友好的......
  • Git Extensions:一个.NET开源的 Git 图形用户界面(GUI)工具
    前言今天大姚给大家分享一个.NET开源、免费的用于管理Git存储库的独立图形用户界面(GUI)工具,它还与Windows资源管理器和MicrosoftVisualStudio(2015/2017/2019/2022)集成:GitExtensions。Git新手指南:从基础到实践的全方位教程功能介绍图形用户界面:提供一个友好的......
  • 修复Microsoft Visual C++ 2015中msvcp140_ATOMIC_WAIT.dll缺失的5大策略
    在电脑使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时,给使用者带来了很大的困扰。那么,如何解决这个问题呢?一,原因分析msvcp140_ATOMIC_WAIT.dll是MicrosoftVisualC++2015运行时库的一部......
  • Microsoft 365 解决方案:数据备份的必要性、配置架构
    51CTO博客链接:https://blog.51cto.com/u_13637423业务连续性保障是许多公司最关心的问题。如果发生加密大量数据的勒索软件攻击,或者内部意外或恶意数据删除或覆盖事件的实例,则需要能够尽快使业务恢复正常状态。这是Microsoft365备份产品提供的功能,无论是通过Microsoft365管......
  • wbemtest.exe 是 Windows 操作系统中的一个实用程序,用于测试和调试 Windows Managemen
    wbemtest.exe起源于Windows操作系统的WMI(WindowsManagementInstrumentation)框架。它首次引入于Windows2000,作为一个图形化工具,帮助用户和开发者测试和调试WMI查询、操作和配置。其目的是简化与WMI服务的交互,提供一个直观的界面用于管理和排查系统管理数据。wbemte......
  • WPF 现代化开发教程:使用 Microsoft.Extensions.Hosting 和 CommunityToolkit.Mvvm
    介绍随着WPF应用程序的复杂性增加,使用现代化的开发工具和模式变得尤为重要。本教程将指导你如何使用Microsoft.Extensions.Hosting和CommunityToolkit.Mvvm来开发一个现代化的WPF应用程序。这些工具为开发者提供了依赖注入、应用程序生命周期管理、MVVM模式支持等功能。先决......
  • C# COM interact with Excel via Com Microsoft.Office.Interop.Excel,write content
    1.AddComReference,Microsoft.Office.Interop.Excel  2.usingMicrosoft.Office.Interop.Excel;usingSystem;usingSystem.IO;usingSystem.Runtime.CompilerServices;usingExcel=Microsoft.Office.Interop.Excel;usingSystem.Reflection;namespaceConsol......