.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

这篇具有很好参考价值的文章主要介绍了.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随着Aspire发布preview5的发布,Microsoft.Extensions.ServiceDiscovery随之更新,

服务注册发现这个属于老掉牙的话题解决什么问题就不赘述了,这里主要讲讲Microsoft.Extensions.ServiceDiscovery(preview5)以及如何扩展其他的中间件的发现集成 .

Microsoft.Extensions.ServiceDiscovery官方默认提供的Config,DNS,YARP三种Provider,使用也比较简单 :

builder.Services.AddServiceDiscovery();

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

builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // 全局对HttpClient启用服务发现
    http.UseServiceDiscovery();
});

然后 appsettings.json 为名为 todo 的服务配置终结点:

  "Services": {
    "todo": {
      "http": [
        "http://localhost:5124"
      ]
    }
  }

然后使用服务发现:


#region 模拟服务端的todo接口: 
var sampleTodos = new Todo[] {
    new(1, "Walk the dog"),
    new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
    new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
    new(4, "Clean the bathroom"),
    new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};

var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
    sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
        ? Results.Ok(todo)
        : Results.NotFound());
#endregion

public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}

#region 测试服务发现和负载

app.MapGet("/test", async (IHttpClientFactory clientFactory) =>
{
    //这里服务发现将自动解析配置文件中的服务
    var client = clientFactory.CreateClient("todo");
    var response = await client.GetAsync("/todos");
    var todos = await response.Content.ReadAsStringAsync();
    return Results.Content(todos, contentType: "application/json");
});

#endregion

运行程序后将会发现成功执行:
.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

当然对于这样写死配置的服务发现一点都不灵活,因此应运而生了 YARP和DNS这些Provider, 目前服务注册发现使用Consul的还是挺多的,当然还有很多其他的轮子就不赘述了,这里我们来扩展一个Consul的服务发现Provider :

实现核心接口IServiceEndPointProvider

internal class ConsulServiceEndPointProvider(ServiceEndPointQuery query, IConsulClient consulClient, ILogger logger)
        : IServiceEndPointProvider, IHostNameFeature
    {
        const string Name = "Consul";
        private readonly string _serviceName = query.ServiceName;
        private readonly IConsulClient _consulClient = consulClient;
        private readonly ILogger _logger = logger;

        public string HostName => query.ServiceName;

#pragma warning disable CA1816 // Dispose 方法应调用 SuppressFinalize
        public ValueTask DisposeAsync() => default;

        public async ValueTask PopulateAsync(IServiceEndPointBuilder endPoints, CancellationToken cancellationToken)
        {
            var flag = ServiceNameParts.TryParse(_serviceName, out var serviceNameParts);
            var sum = 0;
            if (flag)
            {
                var queryResult = await _consulClient.Health.Service(serviceNameParts.Host, string.Empty, true, cancellationToken);
                foreach (var serviceEntry in queryResult.Response)
                {
                    var address = $"{serviceEntry.Service.Address}:{serviceEntry.Service.Port}";
                    var isEndpoint = ServiceNameParts.TryCreateEndPoint(address, out var endPoint);
                    if (isEndpoint)
                    {
                        ++sum;
                        var serviceEndPoint = ServiceEndPoint.Create(endPoint!);
                        serviceEndPoint.Features.Set<IServiceEndPointProvider>(this);
                        serviceEndPoint.Features.Set<IHostNameFeature>(this);
                        endPoints.EndPoints.Add(serviceEndPoint);
                        _logger.LogInformation($"ConsulServiceEndPointProvider Found Service {_serviceName}:{address}");
                    }
                }
            }

            if (sum == 0)
            {
                _logger.LogWarning($"No ConsulServiceEndPointProvider were found for service '{_serviceName}' ('{HostName}').");
            }
        }

        /// <inheritdoc/>
        public override string ToString() => Name;
    }

实现 IServiceEndPointProviderFactory:


internal class ConsulServiceEndPointProviderFactory(IConsulClient consulClient, ILogger<ConsulServiceEndPointProviderFactory> logger) : IServiceEndPointProviderFactory
    {
        private readonly IConsulClient _consulClient = consulClient;
        private readonly ILogger<ConsulServiceEndPointProviderFactory> _logger = logger;

        public bool TryCreateProvider(ServiceEndPointQuery query, [NotNullWhen(true)] out IServiceEndPointProvider? resolver)
        {
            resolver = new ConsulServiceEndPointProvider(query, _consulClient, _logger);
            return true;
        }
    }

接着扩展一下IServiceCollection


public static IServiceCollection AddConsulServiceEndpointProvider(this IServiceCollection services)
{
	services.AddServiceDiscoveryCore();
	services.AddSingleton<IServiceEndPointProviderFactory, ConsulServiceEndPointProviderFactory>();
	return services;
}

最后添加一行代码 :

// 使用Microsoft.Extensions.ServiceDiscovery实现负载均衡
builder.Services.AddServiceDiscovery()
    .AddConfigurationServiceEndPointResolver() //config
    .AddConsulServiceEndpointProvider(); //consul

下面是Consul中注册完成的服务:
.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

然后我们请求 ./test 调用服务,观察调试日志,成功了!

.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

完整的代码:
https://github.com/vipwan/Biwen.Microsoft.Extensions.ServiceDiscovery.Consul

当然你也可以直接使用nuget引用 Biwen.Microsoft.Extensions.ServiceDiscovery.Consul 我已经发布到了nuget上 , 最后因为Aspire还在不停的迭代所以Biwen.Microsoft.Extensions.ServiceDiscovery.Consul后面还会存在一些变化, 前面的几个早期版本我都做了适配以最新的为准文章来源地址https://www.toymoban.com/news/detail-847869.html

到了这里,关于.NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .net core微服务之服务发现

    一:nacos https://nacos.io/docs/latest/what-is-nacos/ https://github.com/alibaba/nacos 二:consul https://developer.hashicorp.com/consul/docs?product_intent=consul https://github.com/hashicorp/consul 服务发现的框架常用的还有zookeeper eureka等,这里准备使用nacos 前置条件准备 docker,yaml View Code 使用docker启动mysql View C

    2024年02月20日
    浏览(19)
  • Net Core Ocelot+Consul实现网关、服务注册、服务发现

    Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微服务。 以下是Ocelot的一些主要功能: 路由管理:Ocelot允许您

    2024年01月21日
    浏览(35)
  • 持续集成部署-k8s-服务发现-Service

    在K8s中, Service 是一种可以暴露一个或多个 Pod 的稳定的网络终点,从而形成逻辑上的应用服务单元,为服务发现、负载均衡、容错等提供了基础设施支持。 Service 的主要作用包括以下几个方面: 1. 实现内部服务发现 :在K8s中,往往会有多个 Pod 运行同一种应用服务, Servi

    2024年02月08日
    浏览(45)
  • 持续集成部署-k8s-服务发现-Ingress

    Ingress 是 Kubernetes 中的一个核心组件,用于管理和暴露集群内部的服务到集群外部。它充当了一个入口( Gateway )的角色,可以将外部流量路由到集群内部的服务。 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由

    2024年02月08日
    浏览(47)
  • Microsoft.Extensions.Logging.ILogger实现按类名写入不同的日志文件

    使用Microsoft.Extensions.Logging框架可以很方便地实现按类名写入不同的日志文件。你可以通过配置LoggerProvider来实现此功能。下面是一个示例代码,演示如何按类名将日志写入不同的日志文件: 使用时,你可以在Startup类的ConfigureServices方法中注册ILoggerProvider,并指定日志文件夹路

    2024年02月04日
    浏览(31)
  • 在.NetFramework中使用Microsoft.Extensions.Configuration 读取Json和XML

    //需要安装 Microsoft.Extensions.Configuration; //Microsoft.Extensions.Configuration.json //Microsoft.Extensions.Configuration.xml //Microsoft.Extensions.Configuration.Binder; //注意: json 的key中不能出现冒号\\\":\\\" //XML的 Atrribute中不能出现 “Name”, 且不能使用根节点(从第一个子节点开始) 实体类: XML: Json:

    2024年02月11日
    浏览(31)
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)

    还是先上代码, 这是基础版本我们要达成的目标,仅需定义一个特性即可完成拦截的目标 如上是我们定义的拦截器基类,我们想要达到的目标是,只要继承该基类,并覆写InterceptAsync 方法即可实现具有特定功能的拦截类,而容器会自动代理到该拦截类,实现拦截。 这里要感

    2024年02月02日
    浏览(30)
  • 持续集成部署-k8s-服务发现-Ingress 路径匹配与虚拟主机匹配

    要使用 Ingress-Nginx 首先第一步是需要先安装它,安装的步骤可以参考:持续集成部署-k8s-服务发现-Ingress 这里我使用之前创建的 Service:持续集成部署-k8s-服务发现-Service 我这里创建的 Service 的名称是: nginx-svc 这个后面要用到。

    2024年02月07日
    浏览(32)
  • 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core

    如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle、AspectCore和DoraInterception, 我将从我当时研究的经历,以及我遇到的场景,为大家展示下 聊一聊我为什么要费时费力的整合Microsoft.Extensions.DependencyInjection和Castle.Core 直接上源码 如上所示的接口定义了一个事

    2024年02月01日
    浏览(53)
  • 不要用第三方日志包了Microsoft.Extensions.Logging功能就很强大

    在.NET中, Microsoft.Extensions.Logging是一个广泛使用的日志库,用于记录应用程序的日志信息。它提供了丰富的功能和灵活性,使开发人员能够轻松地记录各种类型的日志,并将其输出到不同的目标,包括日志文件。本文将详细介绍Microsoft.Extensions.Logging的各种基础功能以及如何按

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包