GitHub地址:https://github.com/vipwan/Biwen.Microsoft.Extensions.ServiceDiscovery.Consul

使用方式

  1. 添加 NuGet 包
dotnet add package Biwen.Microsoft.Extensions.ServiceDiscovery.Consul -pre
  1. 配置好 Consul 的连接

在 Consul 中注册了名为 todo 的服务

builder.Services.AddConsul().AddConsulServiceRegistration(cfg =>
{
cfg.Meta = new Dictionary<string, string>() { { "Weight", "1" } };
cfg.ID = "SVC1";
cfg.Port = 5124;
cfg.Name = "todo";
cfg.Address = "http://127.0.0.1";
cfg.Tags = ["MicroSvc"];
cfg.Check = new Consul.AgentServiceCheck
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(15),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(15),//健康检查时间间隔,或者称为心跳间隔
HTTP = "http://127.0.0.1:5124/health",//健康检查地址
Timeout = TimeSpan.FromSeconds(5),
Method = "GET",
};
});
  1. 添加 Consule 服务发现的端点解析器
builder.Services.AddServiceDiscovery().AddConsulServiceEndPointResolver();

剩下的就一样了。

完整的示例代码


using Consul.AspNetCore;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.Extensions.ServiceDiscovery.Abstractions;
using System.Text.Json.Serialization; var builder = WebApplication.CreateSlimBuilder(args); //健康监测
builder.Services.AddHealthChecks().AddCheck("test", () =>
{
return new Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult(
Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus.Healthy, "健康检测");
}); //注册 Consul服务和发现
builder.Services.AddConsul().AddConsulServiceRegistration(cfg =>
{
cfg.Meta = new Dictionary<string, string>() { { "Weight", "1" } };
cfg.ID = "SVC1";
cfg.Port = 5124;
cfg.Name = "todo";
cfg.Address = "http://127.0.0.1";
cfg.Tags = ["MicroSvc"];
cfg.Check = new Consul.AgentServiceCheck
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(15),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(15),//健康检查时间间隔,或者称为心跳间隔
HTTP = "http://127.0.0.1:5124/health",//健康检查地址
Timeout = TimeSpan.FromSeconds(5),
Method = "GET",
};
}); // 使用Microsoft.Extensions.ServiceDiscovery实现负载均衡 & Consul
builder.Services.AddServiceDiscovery().AddConsulServiceEndPointResolver(); // 默认是轮询算法,当前包含了
// RoundRobinServiceEndPointSelectorProvider轮询,
// RandomServiceEndPointSelectorProvider随即,
// PickFirstServiceEndPointSelectorProvider第一个.
// PowerOfTwoChoicesServiceEndPointSelectorProvider选择负载最轻的端点进行分布式负载均衡,当提供的任何一个端点不具备该功能时,降级为随机选择端点 builder.Services.ConfigureHttpClientDefaults(static http =>
{
// 可以使用自己的算法 下面使用随机算法
http.UseServiceDiscovery(RandomServiceEndPointSelectorProvider.Instance);
}); //使用IHttpClientFactory
builder.Services.AddHttpClient("todo", cfg =>
{
cfg.BaseAddress = new("http://todo");
}); builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
}); var app = builder.Build(); // Consul健康监测
app.UseHealthChecks("/health"); #region apis 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 #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 app.Run(); public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false); [JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{ }

Microsoft.Extensions.ServiceDiscovery 的 Consul 实现的更多相关文章

  1. Microsoft.Extensions.Options支持什么样的配置类?

    在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统, ...

  2. asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展

    asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在 ...

  3. DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

    写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...

  4. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  5. Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。

    我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...

  6. 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0

    解决方法:工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions ...

  7. 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...

  8. 解析 Microsoft.Extensions.DependencyInjection 2.x 版本实现

    项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论 ...

  9. 使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用

    目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...

  10. Microsoft.Extensions.DependencyInjection 之三:展开测试

    目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...

随机推荐

  1. USB协议详解第10讲(USB描述符-报告描述符)

    1.报告描述符的概念和作用 开门见山,报告描述符就是描述报告(HID接口上传输事务中的数据)的一组数据结构. 首先大家可能会问,报告又是什么?我们前面讲过,USB主机一般是以中断的方式向HID设备发送 ...

  2. IOC注入分类 依赖注入

    依赖注入  也就是服务的注入 可以理解 一些服务的容器,目的:把一些全局需要使用的资源,服务放到某个接口中,使其可以在全局中使用 和前端的状态管理工具实现的功能差不多 注册服务的三种形式 单例模式Ad ...

  3. mysql基础-事务

    本篇章为初步了解mysql数据事务控制问题,事务作为MySQL的基础篇章是至关重要的一部分内容! 事务 1.事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一 ...

  4. KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  5. OpenFunction 0.6.0 发布: FaaS 可观测性、HTTP 同步函数能力增强及更多特性

    OpenFunction 是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台,旨在帮助开发者专注于业务逻辑的研发.在过去的几个月里,OpenFunction 社 ...

  6. 详解 JuiceFS 在多云架构下的数据同步与一致性

    随着大模型流行,GPU 算力资源正变得日益稀缺,传统的"算力跟着存储跑"的策略需要转变为"存储跟着算力跑".为了确保数据一致性和管理的便捷性,企业通常在特定地区 ...

  7. HTB打靶记录-Infiltrator

    nmap scan nmap -A 10.10.11.31 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-15 13:18 CST Nma ...

  8. 同步完善Docker常用操作命令

    镜像 images_name 表示镜像名 con_name表示容器名 #获取镜像 docker pull images_name #查看已有的docker镜像 docker images #删除镜像 ...

  9. UE4纯C++实现游戏快捷栏之物品读取

    我们在上一步骤中创建了快捷栏的UI界面,在这一部分我们将从Json文件中读取物品的相关信息(种类以及属性),来填充到游戏数据中进行存储以便快捷栏使用,具体分以下几部分完成. 1.Types.h: 添加 ...

  10. 干货分享:Air700ECQ的硬件设计,第三部分

    ​ 5. 电器特性,可靠性,射频特性 5.1. 绝对最大值 下表所示是模块数字.模拟管脚的电源供电电压电流最大耐受值. 表格 17:绝对最大值 参数 最小 最大 单位 VBAT -0.3 4.7 V ...