首页 > 其他分享 >.NET 服务发现

.NET 服务发现

时间:2024-04-02 14:56:23浏览次数:19  
标签:解析器 发现 服务 配置 端点 NET 解析 选择器

.NET 服务发现

https://learn.microsoft.com/en-us/dotnet/core/extensions/service-discovery?tabs=dotnet-cli

目前该包处于预览状态

在本文中,我将为你介绍如何使用 Microsoft.Extensions.ServiceDiscovery 库,服务发现是开发者使用逻辑名称而不是物理地址 ( IP 地址和端口) 来使用外部服务的方式。

入门

为了在 .NET 中使用服务发现,首先需要安装 Microsoft.Extensions.ServiceDiscovery NuGet 包,使用如下的命令

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

使用示例

在项目的 Program.cs 中,调用 AddServiceDiscovery() 扩展方法,以添加服务发现的功能到 Host 中,它会配置默认的服务端点解析器。

builder.Services.AddServiceDiscovery();

然后,通过在每个 IHttpClientBuilder 上调用 UseServiceDiscovery() 扩展方法来添加服务发现的支持。

builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
    {
        client.BaseAddress = new("http://catalog");
    })
    .UseServiceDiscovery();

另外,你还可以通过为所有的 HttpClient 实例默认增加服务发现的支持,

builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // Turn on service discovery by default
    http.UseServiceDiscovery();
});

通过配置来解析服务端点

AddServiceDiscovery() 扩展方法默认提供了基于配置的解析器支持。该解析器通过 .NET 的配置系统来获得端点信息。库支持通过来自 appsettings.json、环境变量、或者其它的 IConfiguration 源的配置信息。

下面的示例演示了如何为名为 catalog 的服务通过 appsettings.json 来配置服务端点:

{
  "Services": {
      "catalog": [
        "localhost:8080",
        "10.46.24.90:80",
      ]
    }
}

上面的示例为名为 catalog 的服务配置了两个服务端点:localhost:808010.46.24.90:80。每当解析 catalog 的时候,就会选中这两个端点之一。

如果服务发现是通过 IServiceCollection 上的 AddServiceDiscoveryCore() 方法添加的,那么基于配置端点解析可以通过调用 IServiceCollection 上的 AddConfigurationServiceEndPointResolver() 扩展方法来添加。

配置

基于配置的解析器使用 ConfigurationServiceEndPointResolverOptions 类型进行配置,它支持下列配置方式:

  • SectionName: 配置包含服务端点的配置节的名称,默认为 Services
  • ApplyHostNameMetadata: 用来决定是否主机名的元数据需要用于解析端点的委托,默认该函数返回 false

如果需要使用这些配置,可以调用应用程序的 Program 文件中的 Startup 类型中 IServiceCollection 上的 Configure() 扩展方法。

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ConfigurationServiceEndPointResolverOptions>(
    static options =>
    {
        options.SectionName = "MyServiceEndpoints";
    
        // Configure the logic for applying host name metadata
        options.ApplyHostNameMetadata = static endpoint =>
        {
            // Your custom logic here. For example:
            return endpoint.EndPoint is DnsEndPoint dnsEp
                && dnsEp.Host.StartsWith("internal");
        };
    });

上面的示例展示了配置自定义的服务配置节名称,以及提供了对于使用主机名元数据的自定义条件。

使用平台提供的服务发现机制来解析服务端点

特定的平台,诸如 Azure Container Apps,还有 Kubernetes (当正确配置之后),会提供在不需要客户端库提供的服务器发现支持的情况下提供服务发现的支持。当应用部署在这样的场景下,使用平台内置的机制会更有优势。而 Pass-through 解析器就是为此场景而设计,它支持取代解析器,比如基于配置的解析器,在不同的环境下,比如在开发者的机器上。重要的是,这种灵活性可以在不需要修改任何代码或者实现某种条件检查的情况下达到。

该 Pass-through 解析器不使用外部解析,而是通过返回诸如 DnsEndPoint 通过服务名返回的端点。

当通过调用 AddServiceDiscovery() 扩展方法使用服务发现支持的时候,Pass-through 提供器是被默认配置的。

如果服务发现是通过 IServiceCollection 上的 AddServiceDiscoveryCore() 方法添加的,那么 Pass-through 提供器可以通过调用 IServiceCollection 上的 AddPassThroughServiceEndPointResolver () 扩展方法来添加。

使用端点选择器的负载均衡

每当通过 HttpClient 管线解析一个端点的时候,就会从对应请求服务的所有已知端点中选择其一。如果存在多个端点可用,那么可能希望通过在所有端点中均衡流量。为达到此目的,可以使用定制的 端点选择器,默认情况下,端点被轮流选择。为了使用不一样的端点选择器,为 UseServiceDiscovery() 方法提供一个 IServiceEndPointSelector 实例。例如,为了从一组解析的端点中随机选择端点,可以指定 RandomServiceEndPointSelectorProvider.Instance 作为端点选择器。

builder.Services.AddHttpClient<CatalogServiceClient>(
        static client => client.BaseAddress = new("http://catalog")
    )
    .UseServiceDiscovery(RandomServiceEndPointSelectorProvider.Instance);

NuGet 包 Microsoft.Extensions.ServiceDiscovery 包含了如下的端点选择器:

  • PickFirstServiceEndPointSelectorProvider.Instance: 选择第一个,总是选择第一个端点
  • RoundRobinServiceEndPointSelectorProvider.Instance: 轮流选择, 转圈选择端点
  • RandomServiceEndPointSelectorProvider.Instance: 随机,随机选择端点
  • PowerOfTwoChoicesServiceEndPointSelectorProvider.Instance: 二次幂选择,基于二次幂算法选择最少使用的端点来进行负载均衡。在提供的任一终结点没有 IEndPointLoadFeature 功能时,降级为随机选择终结点。

端点选择器通过 IServiceEndPointSelectorProvider 实例来创建,比如上面列出的这些选择器。Provider 的 CreateSelector() 方法在创建选择器的时候被调用,得到一个 IServiceEndPointSelector。然后当需要解析的时候,一套已知的端点被提供给 IServiceEndPointSelector 实例,使用 IServiceEndPointSelector.SetEndPoints() 方法完成。为了从集合中选择一个端点,则 IServiceEndPointSelector.GetEndPoint() 方法被调用,返回单个的 ServiceEndPoint 实例。传递给 GetEndPoint() 方法的参数 context 值,用于提供额外的对于选择器有用的上下文信息。例如,在 HttpClient 中,HttpRequestMessage 被传递进来。还没有一个 IServiceEndPointSelector 的实现检查该上下文,现在你可以忽略它,除非你在使用某个选择器,并确实使用它。

解析的顺序

当解析服务端点的时候,每个被注册的解析器按照注册的顺序被调用,并有机会修改返回给调用者的 ServiceEndPoint 集合,在 Microsoft.Extensions.ServiceDiscovery 系列包中的提供器在被调用的时候,如果已经有端点在集合中,就会跳过解析。例如,考虑一个场景,注册了如下的提供器:

  • Configuration
  • DNS SRV
  • Pass-through

当解析发生的时候,这些提供器按顺序被调用。如果 Configuration 提供器没有发现合适的端点,则 DNS SRV 进行解析,可能会增加一个或者多个端点,如果 DNS SRV 提供器增加了一个端点到集合中,那么 Pass-through 提供器就会跳过解析并立即返回。

标签:解析器,发现,服务,配置,端点,NET,解析,选择器
From: https://www.cnblogs.com/haogj/p/18110550

相关文章

  • centos7.9部署nginx服务
    首先,确保你已经安装了CentOS7.9,并且已经连接到互联网。下载Nginx的压缩包,可以在官方网站(https://nginx.org/en/download.html)上找到最新的稳定版本。使用以下命令下载压缩包:wgethttps://nginx.org/download/nginx-1.19.2.tar.gz也可用Xftp上传nginx-1.19.2.tar.gz包......
  • 中国联通提供漏洞扫描服务有哪些优势
    产品优势1.强大的漏洞管理平台:Tenable.SC中国联通选择与业界权威的Tenable合作,引入其旗舰产品Tenable.SC作为漏洞管理核心平台。Tenable.SC以其卓越的性能和市场领先地位,赢得了监管机构的广泛认可,被誉为扫描速度最快、扫描准确率最高的产品。在Gartner连续多年的报告中,Tenable......
  • 宿迁腾讯云代理商:购买腾讯云服务器地域选择
    目录宿迁腾讯云代理商:购买腾讯云服务器地域选择宿迁腾讯云代理商:购买腾讯云服务器地域选择腾讯云的优势:如何选择服务器地域:总结:宿迁腾讯云代理商:购买腾讯云服务器地域选择简介:飞机@luotuoemo本文由(腾讯云国际站代理商:【金推云】www.jintui.cn)撰写宿迁腾讯云代理......
  • 从零开始构建gRPC的Go服务
    介绍ProtocolBuffersandgRPC是用于定义通过网络有效通信的微服务的流行技术。许多公司在Go中构建gRPC微服务,发布了他们开发的框架,本文将从gRPC入门开始,一步一步构建一个gRPC服务。背景之前在B站看过一个gRPC教学视频,尝试跟着视频做但踩了不少的坑,因此决定自己动手从官......
  • [实验室服务器使用]使用VSCode、PyCharm、MobaXterm和CMD连接远程服务器
    实验室服务器使用:使用VSCode、PyCharm、MobaXterm和CMD连接远程服务器在进行实验室工作时,远程连接服务器是常见的需求之一。本篇文章根据个人的一些使用介绍使用不同工具连接服务器的方法,并提供优化功能,使服务器能够使用本机代理的说明。准备服务器账号信息Host(主机):10.......
  • 手动搭建 物流单据识别api服务 部署教程 Java
    最近遇到一个项目需求,需要自动化识别快递面单上的人名、电话、地址、邮编等信息。查询了很多方案,都不太满意。调研了使用付费api,如快递100和百度的api等。最大的问题是速度不行,本项目每天要识别上百万的面单信息,api接口速度跟不上。其次是各家解析的正确率也达不到预期。于是乎,......
  • SMTP服务器搭建关键步骤?如何配置服务器?
    SMTP服务器搭建的注意事项?怎么快速搭建SMTP服务器?电子邮件已经成为我们日常工作和生活中不可或缺的一部分。SMTP服务器作为电子邮件发送的核心组件,其搭建过程至关重要。下面,AokSend就来详细探讨一下SMTP服务器搭建的关键步骤。SMTP服务器搭建:明确需求在搭建SMTP服务器之前,......
  • C# .NET6 WebAPI JWT身份验证服务
    自定义扩展类usingMicrosoft.AspNetCore.Authentication;usingMicrosoft.AspNetCore.Authentication.JwtBearer;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.AspNetCore.Mvc.ModelBinding;usingSystem.Text.Json;namespaceDemo{///<summary>///......
  • ios 之 netty版本swiftNio(socket创建)
    SwiftNio简介用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这就像Netty,但是为Swift写的。Xcode引入swiftNio        在实际写代码前,......
  • C# .NET6 WebAPI 全局异常过滤器
    自定义返回级别namespaceDemo{///<summary>///自定义返回级别///</summary>publicenumResultLevel:int{///<summary>///正确///</summary>OK=0,///<summary>......