首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年09月08日 23:51

简介

在现代微服务架构中,服务发现(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 发起请求,并返回响应内容。

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

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

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

From:https://www.cnblogs.com/kklldog/p/18403778/service-discovery
本文地址: http://www.shuzixingkong.net/article/1842
0评论
提交 加载更多评论
其他文章 C++17: 用折叠表达式实现一个IsAllTrue函数
前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C++新特性知识,适合对C++进阶知识有一定了解的人。这样一种从实际问题来学习和运用知识的过程还是挺有趣的,特此整理分
C++17: 用折叠表达式实现一个IsAllTrue函数 C++17: 用折叠表达式实现一个IsAllTrue函数
代码整洁之道--读书笔记(5)
代码整洁之道 简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。 本书适合所有程序员阅读,
代码整洁之道--读书笔记(5) 代码整洁之道--读书笔记(5)
《痞子衡嵌入式半月刊》 第 107 期
痞子衡嵌入式半月刊: 第 107 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回
《痞子衡嵌入式半月刊》 第 107 期 《痞子衡嵌入式半月刊》 第 107 期 《痞子衡嵌入式半月刊》 第 107 期
什么样的人生才是幸福的一生?(与孩子争执过后有感而写)
围绕着你考研和工作的问题和你争执不下,我仔细想了一下,这种争执看似是因为考研或工作的方向,其实是我们两个人关于人生幸福观的不同观点的碰撞。 那么作为一个人,到底未来怎样的生活才能使自己舒服惬意也就是幸福? 我觉得你的观点可能是高薪有钱,生活休闲,这样就是一种幸福。你如今所有的努力和辛苦都是在为这种生
《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上
⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#128031; 摸鱼小网站地址 学代码 → &#128187; 源码库地址 一、前言 到这一篇我们终于把环境搭好,也做好了几个热搜小组件,为了让我们方便展示成果或者方便自己摸鱼,我们需要将这个小网站部署上云。整体流程并不复杂,但
《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上 《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上 《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上
GitHub Copilot 典型使用场景实践
GitHub Copilot 是一款 AI 结对程序员,可帮助您更快、更少地编写代码。近期我们一直在使用GitHub Copilot协助开发编码工作,总结了一些实际场景的用法,可能在目前网络中很多的博客中都没有提及到,本文一一分享给你。
GitHub Copilot 典型使用场景实践 GitHub Copilot 典型使用场景实践 GitHub Copilot 典型使用场景实践
上周热点回顾(9.2-9.8)
热点随笔: &#183;&#160;写在临近40岁的年龄&#160;(薰衣草的旋律)&#183;&#160;40岁大龄失业程序猿,未来该何去何从&#160;(牛初九)&#183;&#160;博客园20年纪念T恤上架:艰难的时光,燃烧的希望&#160;(博客园团队)&#183;&#160;一场 Kaf
深入理解Argo CD工作原理
1. ArgoCD 的架构 ArgoCD 是一个 Kubernetes 原生的持续交付工具,它通过监控 Git 仓库中的应用定义来自动部署应用到 Kubernetes 集群。其核心架构由以下几个关键组件构成: API Server: ArgoCD 的 API 入口,提供了外部接口以便用户或外部工具与
深入理解Argo CD工作原理 深入理解Argo CD工作原理