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

news/2024/10/4 1:26:10

简介

在现代微服务架构中,服务发现(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: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 而使用服务名,可以大大简化服务间的调用。同时还能配置不同的调用策略,进行负载均衡。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/58149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第19篇 Protocol Buffers 编译器生成proto文件

1.下载 Protocol Buffers 编译器(protoc) 前往 Protocol Buffers GitHub Releases 页面。在 "Assets" 下找到适合您系统的压缩文件,通常为 protoc-{version}-win32.zip 或 protoc-{version}-win64.zip,其中 {version} 是版本号。2.解压缩 Protoc 编译器 创建一个…

Zlibrary镜像站官方网址的使用教程

Zlibrary的使用说明: 手机端 步骤一、以苹果浏览器为例,打开Z-library镜像站,搜索自己的图书,注册登录之后选择EPUB格式下载步骤二、手机打开下载的文件,即可正常阅读。电脑端 步骤一,如下图所示, 打开Zlibrary官网搜索电子书,点击自己需要的图书步骤二,如下图所示, 在…

Python实现批量提取视频

前言 最近在玩整nas,但是之前把视频和照片都上传到immich了,因为我可以直接在手机中上传照片,但是因为手机内存不够就把视频全删了的,现在只需要把视频下载下来上传到nas中就OK。但是现在问题是immich这东西不支持批量删选视频,只能全选照片和视频,而且一共有50个G的照片…

边缘计算平台:为客户端提供更快、更可靠的应用响应!

边缘计算平台是一种基于云计算技术的辅助计算系统。它可以在数据源的边缘(例如传感器、IoT设备等)进行数据的处理和分析,从而为客户端提供更快、更可靠的应用响应。与传统的云计算模式相比,边缘计算平台更加灵活和实时,它通过在分布式的边缘设备上进行计算,可以大大减少由…

1-9Java数组

Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0,number1,....,numbe…

VR虚拟现实解决方案在电商行业中的7大优势

从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有创意且令人难忘的客户体验,可以极大地提高转化率。VR 可以通过更多方式使卖家受益。从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有…

Mathematica 入门

前言 Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLAB 和 Maple 等。 MMA 官网:https://www.wolfram.com/mathematica/ MMA 的安装及激活:Mathematica安装激活极简教…

【算法笔记】位运算详解

0. 前言 突然想到位运算是个好东西,就来水一波文章了…… 注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! 本文中参考代码均使用C++编写。 废话不多说,下面步入正题。1. 基本运算 …