使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用
简介
在现代微服务架构中,服务发现(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) =>
{
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 而使用服务名,可以大大简化服务间的调用。同时还能配置不同的调用策略,进行负载均衡。
关注我的公众号一起玩转技术
使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用的更多相关文章
- .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能
首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...
- 我是服务的执政官-服务发现和注册工具consul简介
服务发现和注册 我们有了两个服务.服务A的IP地址是192.168.0.1,端口9001,服务B的IP地址192.168.0.2,端口9002.我们的客户端需要调用服务A和服务B,我们只需要在配置文件 ...
- 服务发现之eureka
一.什么是服务发现? 问题: 我们现在有多少个服务? 服务越来越多时,服务 URL 配置管理变得非常乱 服务对外的地址变了,其他所有有使用到的服务都要改地址 增加服务,增加服务实例等,都要做运维工作 ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- net core 微服务框架 Viper 调用链路追踪
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- Consul 服务注册与服务发现
上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...
- DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection
写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
随机推荐
- Spring的xml和注解对比
常用注解 bean定义 XML方式:<bean></bean> 注解方式:@Component 通用组件 @Controller(web层) @Service(service层 ...
- 使用浏览器的cookies进行登陆
1.使用浏览器Cookie登陆 In [ ]: cookie = 'uniqueVisitorId=a2151df1-4833-00ae-72e0-f4b99d2b7be2; pgv_pvid=232 ...
- [oeasy]python0094_视频游戏_双人网球_pong_atari_mos_6502_雅达利_米洛华
编码进化 回忆上次内容 上次 我们回顾了 微软之前的 比尔盖茨和保罗艾伦 mits 迎来的 是帮手 还是隐患? intel-8080 遇到了 mos-6502 底层硬件 驱动 游戏行业进化 不光是扑克 ...
- oeasy教您玩转vim - 30 - # 屏位行号
屏位行号 回忆上节课内容 上次我们主要讲的翻页 :set scrolloff=2 控制上下留天留地 上下翻页(这个最常用) ctrl + f 向下一屏 ctrl + b 向上一屏 上下移屏一行 c ...
- 【.bat】IISExpress配置通过IP访问程序
本页只记录便携运行方式脚本 详细IISExpress配置方法请看: VS的IISExpress配置通过IP访问程序 网络信息:192.168.1.45:8378 Run.bat :: run as a ...
- 假期小结8XML之LXML
这桌我初步学习了爬虫相关知识的python库LXML的一些基本用法 以下是我的部分总结 lxml是Python中一个流行的第三方库,用于处理XML和HTML数据.它提供了高效且易于使用的工具,使你能够 ...
- hbuilderx+香蕉云编生成ios证书和上架教程
现在很多公司都使用uniapp作为底层框架来开发app应用,而uniapp的开发工具hbuilderx云打包的时候,需要证书和证书profile文件. 假如是ios应用,则还需要上架到appstore ...
- P1973 [NOI2011] NOI 嘉年华
思路: 先将时间进行离散化,设总时间为 \(cnt\),然后考虑求出 \(W(l,r)\),即在时间段 \([l,r]\) 内的所有节目,可以 \(n^2\) 前缀和,也可以 \(n^3\) 暴力. ...
- 在Python中使用sqlalchemy来操作数据库的几个小总结
在探索使用 FastAPI, SQLAlchemy, Pydantic,Redis, JWT 构建的项目的时候,其中数据库访问采用SQLAlchemy,并采用异步方式.数据库操作和控制器操作,采用基类 ...
- 【Linux】Re01
一.三种网络模式 https://www.bilibili.com/video/BV1Sv411r7vd?p=7 1.桥接模式 该虚拟机和宿主机同一网段,和外部网络相通,但是占用网段地址资源,IP分配 ...