设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 34|回复: 0

.Net中使用Consul实现服务高可用的方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:302
  • 最近打卡:2023-08-27 01:45:31
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
33
主题
31
精华
0
金钱
413
积分
72
注册时间
2023-8-13
最后登录
2025-9-8

发表于 2025-9-1 01:36:30 | 显示全部楼层 |阅读模式

一、目的

在微服务架构中,为了保证服务的高可用,通常需要在服务使用中,通过负载均衡配置,来分发流量和提高系统可用性扩展系统服务的吞吐能力。并消除系统中的单点故障,提升应用系统的可用性。一般来说Nginx就可以实现负载均衡的功能。但是,因为Nginx无法灵活的动态添加服务,因此一般在微服务架构中,会通过一些中间件来实现,服务发现的框架常用的有:consul、zookeeper等。

这里主要介绍的是在.Net环境下Consul实现服务发现等相关功能。

二、Consul概述

Consul是一个分布式、高度可用的数据中心感知服务发现平台,包括简单的服务注册、运行状况检查、故障检测和密钥值存储。 它基于这样一个前提:数据中心中的每个节点都运行一个 Consul 代理,并充当服务器或客户端。 每个代理通过可缩放的 gossip 协议进行通信。

1.png

三、安装和部署

3.1 下载Consul

Consul官网地址:Consul | HashiCorp Developer,Consul安装非常简单,在官网,点击download

2.png

ps:这里我们可以看到Consul支持多种操作系统可选,这里我们在window上测试,这里选择windows。

3.2 安装和运行

Consul安装:下载后,解压即可。解压后只有一个consul.exe可执行文件。

3.png

Consul运行命令如下(进入CMD命令行):

  1. cd 对应盘符文件夹\consul_1.17.1_windows_amd64
  2. //启动Consul
  3. consul agent -dev
  4. //设置ip地址访问-需要时配置
  5. consul agent -dev -client=0.0.0.0
复制代码

3.3 访问Consul的UI页面

启动后会显示如下内容:

4.png

浏览器中访问地址,http://localhost:8500/判断Consul服务是否运行成功。

5.png

ps:以上是Consul基本的单机部署,为保证高可用可以对Consul进行集群部署。

四、.Net中使用Consul

4.1 安装Nuget包

在业务服务中Nuget安装: Consul,把业务服务注册到Consul中

  1. dotnet add packages Consul
复制代码

6.png

4.2 .Net注册服务

把当前服务的相关地址信息,添加到Consul中:

  1. using Consul;
  2. using Microsoft.Extensions.Configuration;
  3. using System;
  4. namespace MicroService.Framework;
  5. public static class ConsulHelper
  6. {
  7. /// <summary>
  8. /// Consul注册
  9. /// </summary>
  10. /// <param name="configuration"></param>
  11. public static void ConsulRegist(this IConfiguration configuration)
  12. {
  13. //准备链接Consul的Client
  14. ConsulClient client = new ConsulClient(c =>
  15. {
  16. c.Address = new Uri("http://localhost:8500/");
  17. c.Datacenter = "test1";
  18. });//找到consul
  19. string ip = string.IsNullOrWhiteSpace(configuration["ip"]) ? "127.0.0.1" : configuration["ip"];
  20. int port = string.IsNullOrWhiteSpace(configuration["port"]) ? 9001 : int.Parse(configuration["port"]);//命令行参数必须传入
  21. //int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);
  22. client.Agent.ServiceRegister(new AgentServiceRegistration()
  23. {
  24. ID = "service" + Guid.NewGuid(),//唯一id
  25. Name = "test_server",//Group--分组
  26. Address = ip,
  27. Port = port,
  28. //Tags = new string[] { weight.ToString() },//标签
  29. Check = new AgentServiceCheck()
  30. {
  31. Interval = TimeSpan.FromSeconds(10),//间隔10s一次
  32. HTTP = $"http://{ip}:{port}/Api/Health/Index",//健康检测接口
  33. Timeout = TimeSpan.FromSeconds(3),//检测等待时间
  34. DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(60)//失败后多久移除
  35. }
  36. });
  37. //命令行参数获取
  38. Console.WriteLine($"注册成功:{ip}:{port}");
  39. }
  40. }
复制代码

程序启动时注册一次:

7.png

4.3 服务健康检测

增加一个健康检测接口,接口映射到管道中间件中处理,自定义返回结果:

  1. public static class HealthExtention
  2. {
  3. public static void Health(this WebApplication app)
  4. {
  5. app.MapWhen(context => context.Request.Path.Equals("/Api/Health/Index"),
  6. applicationBuilder => applicationBuilder.Run(async context =>
  7. {
  8. Console.WriteLine($"This is Health Check");
  9. context.Response.StatusCode = (int)HttpStatusCode.OK;
  10. await context.Response.WriteAsync("OK");
  11. }));
  12. }
  13. }
复制代码

4.4 服务使用

运行业务服务,使用端口来区分不同的业务逻辑

  1. dotnet run --urls=http://localhost:9001 --port=9001
复制代码

8.png

五、调用Consul示例

客户端需要引用Consul的组件,正常微服务模式下,客户端只需要请求网关即可,请求通过网关会转发到其他服务层。

9.png

客户端调用Consul中的服务示例

  1. //consul获取服务api/users/all也得知道
  2. string url = null;
  3. url = "http://test_server/api/users/all";//consul就像dns--只是负责解析ip:port--清单
  4. ConsulClient client = new ConsulClient(c =>
  5. {
  6. c.Address = new Uri("http://localhost:8500/");
  7. c.Datacenter = "test1";
  8. });
  9. var response = client.Agent.Services().Result.Response;//获取服务清单
  10. Uri uri = new Uri(url);
  11. string groupName = uri.Host;
  12. //服务实例
  13. AgentService agentService = null;
  14. var dictionary = response.Where(s => s.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)).ToArray();
  15. {
  16. //agentService = dictionary[0].Value;//写死第一个
  17. }
  18. {
  19. 轮询策略 也是平均,但是太僵硬了
  20. agentService = dictionary[iIndex++ % dictionary.Length].Value;
  21. }
  22. //可自定义负载策略
  23. url = $"{uri.Scheme}://{agentService.Address}:{agentService.Port}{uri.PathAndQuery}";
  24. string content = InvokeApi(url);
  25. var res = JsonConvert.DeserializeObject<IEnumerable<User>>(content);
复制代码

六、文章总结

在微服务架构中,使用Consul作为服务发现和配置管理的工具是非常常见的。Consul由HashiCorp开发,提供了一个完整的解决方案,其中包括服务发现、健康检查、键值存储以及多数据中心支持。

把之所学,以文载之~ 欢迎大家多多交流

相关引用:

  1. https://zhuanlan.zhihu.com/p/701107409
  2. 使用 Consul 作为成员管理器 - .NET | Microsoft Learn
复制代码

到此这篇关于.Net中使用Consul实现服务高可用的文章就介绍到这了,更多相关.net Consul服务高可用内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表