千家信息网

.NET Core微服务之怎么基于Consul实现服务治理

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了".NET Core微服务之怎么基于Consul实现服务治理",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET Core微服务
千家信息网最后更新 2026年11月01日.NET Core微服务之怎么基于Consul实现服务治理

这篇文章主要为大家展示了".NET Core微服务之怎么基于Consul实现服务治理",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET Core微服务之怎么基于Consul实现服务治理"这篇文章吧。

一、Consul服务注册之配置文件方式

1.1 重温Consul实验集群

  这里我们有三个Consul Server节点,一个Consul Client节点,在Client节点上跑了两个ClientService实例,分别占用8810和8820端口。至于基于Ocelot的API网关服务,还没有实现,留到以后跟各位分享。这里假设我们已经启动了这几个节点,并且能够成功访问这两个ClientService实例(事先把实例启动起来,可以通过IIS,也可以通过命令行启动Kerstel服务器运行)。

  实例1:192.168.80.71:8810

  

  实例2:192.168.80.71:8820

  

1.2 准备好json配置文件

  这里我准备了一个如下所示的JSON配置文件(eg.取名为services_config.json),配置了两个服务在里边:

{    "services":[        {            "id": "EDC_DNC_MSAD_CLIENT_SERVICE_01",            "name" : "CAS Client Service",            "tags": [                "urlprefix-/ClientService01"            ],            "address": "192.168.80.71",            "port": 8810,            "checks": [                {                    "name": "clientservice_check",                    "http": "http://192.168.80.71:8810/api/health",                    "interval": "10s",                    "timeout": "5s"                }            ]        },      {            "id": "EDC_DNC_MSAD_CLIENT_SERVICE_02",            "name" : "CAS Client Service",            "tags": [                "urlprefix-/ClientService02"            ],            "address": "192.168.80.71",            "port": 8820,            "checks": [                {                    "name": "clientservice_check",                    "http": "http://192.168.80.71:8820/api/health",                    "interval": "10s",                    "timeout": "5s"                }            ]        }     ]}

  至于配置文件的含义,这里不再赘述,和上一篇在代码中进行注册的items一致。

  编辑完成后,我们在Consul Client节点中新建一个文件夹,放入json配置文件,然后启动/重启Consul Client服务:

192.168.80.71>consul agent -bind 0.0.0.0 -client 192.168.80.71 -config-dir=C:\Server\Consul\config -data-dir=C:\Server\Consul\tempdata -node EDC.DEV.WebServer -join 192.168.80.100 

  

  启动之后,可以看到Consul已经通过扫描配置文件,去注册了这两个ClientService的实例。

1.3 通过WebUI查看服务状况

  

  可以看到,两个ClientService实例已经成功注册。

1.4 通过API进行服务发现

URL>192.168.80.100:8500/v1/catalog/service/CAS Client Service  

  

  可以看到返回了两个服务实例的信息,当然,这里建议服务名还是不要有空格为好。此外,在服务发现的过程中,会加以一定的负载均衡策略,从这两个服务实例中选择一个返回给服务消费端,比如:随机、轮询、加权轮询、基于性能的最小连接数等等。关于这一块,会在后面的API网关实践中跟大家分享。

二、Consul集群之Key/Value存储

  Consul除了可以实现服务注册和服务发现之外,还提供了强大的KV(Key/Value)存储。我们可以使用Consul的分层KV存储干任何事情,比如:动态配置,特征标记,协调,leader选举等。KV存储的API是基于http的。

2.1 查看所有KV

  我们可以通过命令行在consul节点中进行查询:

192.168.80.100>curl -v http://192.168.80.100:8500/v1/kv/?recurse  

  

  可以看到,返回的是404 Not Found,可见现在木有一个Key/Value存储项。

  *.关于?recurse参数=>用来指定查看多个KV

  当然我们也可以通过WebUI来查看和管理KV,如下图所示,后续我们都以Shell命令行来调用API,不会进行WebUI界面的调用。

  

2.2 新增KV

  这里假设我们要配置一个视频直播平台的账号:

192.168.80.100>curl -X PUT -d 'edisonchou' http://192.168.80.100:8500/v1/kv/web/vhallaccount

  key:vhallaccount, value:edisonchou

  添加后可以通过如下命令调用接口查看这个Key的Value

192.168.80.100>curl http://192.168.80.100:8500/v1/kv/web/vhallaccount

  

  *.由于Consul的Value是经过Base64编码的(主要是为了允许非UTF-8的字符),所以这里看到的是编码后的结果。我们可以通过解码得到最终的Value值。

2.3 验证KV是否同步

  由于我们调用的是Leader节点进行的KV存储,我们想要验证一下是否在另外两个节点进行了同步,否则KV只存在一个节点达不到同步的效果。

  192.168.80.101 节点:

  

  192.168.80.102 节点:

  

  可以看到该key值已经在集群中三个节点进行了同步。

2.4 编辑KV和删除KV

  编辑KV其实和添加KV完全一致,如下所示:

192.168.80.100>curl -X PUT -d 'andyai' http://192.168.80.100:8500/v1/kv/web/vhallaccount  

  删除KV主要用到HTTP DELETE

192.168.80.100>curl -X DELETE http://192.168.80.100:8500/v1/kv/web/vhallaccount  

  这里不再演示结果。

三、Consul服务告警之Watch机制

  熔断保护在Consul和Ocelot中都有实现,意思就是当一个服务不正常时(比如我们的一个服务实例挂了,Consul的健康检查机制检测到了),应该给系统维护人员给以告警。在Consul中,服务告警也是通过配置文件来实现的。

3.1 添加watch.json配置文件

{  "watches": [    {      "type": "checks",      "handler_type": "http",      "state": "critical",      "http_handler_config": {        "path": "http://192.168.80.71:9000/notice",        "method": "POST",        "timeout": "10s",        "header": { "Authorization": [ "token" ] }      }    }  ]}

  *.有关watch的细节,请参考:https://www.consul.io/docs/agent/watches.html

  这里编辑完成之后,就可以放到config目录下了,后面重启Consul Client Agent服务时会加载新的watches_config.json配置文件。

  

3.2 添加NoticeService服务

 新写一个ASP.NET Core WebAPI程序,其主要功能就是接受Consul POST过来的参数并调用方法发送电子邮件。

  (1)Controller编写

    [Route("api/[controller]")]    public class HomeController : Controller    {        public IConfiguration Configuration { get; }        public HomeController(IConfiguration configuration)        {            Configuration = configuration;        }        [HttpPost("/notice")]        public IActionResult Notice()        {            var bytes = new byte[10240];            var i = Request.Body.ReadAsync(bytes, 0, bytes.Length);            var content = System.Text.Encoding.UTF8.GetString(bytes).Trim('\0');            EmailSettings settings = new EmailSettings()            {                SmtpServer = Configuration["Email:SmtpServer"],                SmtpPort = Convert.ToInt32(Configuration["Email:SmtpPort"]),                AuthAccount = Configuration["Email:AuthAccount"],                AuthPassword = Configuration["Email:AuthPassword"],                ToWho = Configuration["Email:ToWho"],                ToAccount = Configuration["Email:ToAccount"],                FromWho = Configuration["Email:FromWho"],                FromAccount = Configuration["Email:FromAccount"],                Subject = Configuration["Email:Subject"]            };            EmailHelper.SendHealthEmail(settings, content);            return Ok();        }    }

  不再解释这段代码。

  (2)SendHealthEmail方法编写

    public class EmailHelper    {        public static void SendHealthEmail(EmailSettings settings, string content)        {            try            {                dynamic list = JsonConvert.DeserializeObject(content);                if (list != null && list.Count > 0)                {                    var emailBody = new StringBuilder("健康检查故障:\r\n");                    foreach (var noticy in list)                    {                        emailBody.AppendLine($"--------------------------------------");                        emailBody.AppendLine($"Node:{noticy.Node}");                        emailBody.AppendLine($"Service ID:{noticy.ServiceID}");                        emailBody.AppendLine($"Service Name:{noticy.ServiceName}");                        emailBody.AppendLine($"Check ID:{noticy.CheckID}");                        emailBody.AppendLine($"Check Name:{noticy.Name}");                        emailBody.AppendLine($"Check Status:{noticy.Status}");                        emailBody.AppendLine($"Check Output:{noticy.Output}");                        emailBody.AppendLine($"--------------------------------------");                    }                    var message = new MimeMessage();                    message.From.Add(new MailboxAddress(settings.FromWho, settings.FromAccount));                    message.To.Add(new MailboxAddress(settings.ToWho, settings.ToAccount));                    message.Subject = settings.Subject;                    message.Body = new TextPart("plain") { Text = emailBody.ToString() };                    using (var client = new SmtpClient())                    {                        client.ServerCertificateValidationCallback = (s, c, h, e) => true;                        client.Connect(settings.SmtpServer, settings.SmtpPort, false);                        client.AuthenticationMechanisms.Remove("XOAUTH2");                        client.Authenticate(settings.AuthAccount, settings.AuthPassword);                        client.Send(message);                        client.Disconnect(true);                    }                }            }            catch(Exception ex)            {                Console.WriteLine(ex.Message);            }        }

  这里使用的是MailKit库(支持.net core),可以通过NuGet搜索并安装,此外为何接受的参数属性是这些,大家可以看看Consul官方文档中watches页中的checks类型,见下图所示:

  

  (3)发布NoticeService到192.168.80.71服务器中,同样也可以加入Consul配置文件中:

View Code

  发布完成之后,重启Consul Client节点(192.168.80.71)的Consul服务,可以看到NoticeService也注册成功:

  

3.3 测试服务告警

 (1)手动在IIS中关闭一个ClientService服务,例如:这里我关闭了ClientService.01

  

 (2)查看自动发送的Email内容:从Email中我们可以知道哪个Server节点的哪个Service出了问题,并且可以大概了解原因(Check Output),这时我们的系统维护人员就该起床加班了。

  


以上是".NET Core微服务之怎么基于Consul实现服务治理"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

服务 节点 配置 文件 实例 两个 可以通过 存储 内容 命令 同步 成功 参数 篇文章 集群 一致 健康 三个 人员 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 互联网是不是新科技 迪茉互联网科技 北京互联网络科技有限公司 奇酷互联网络科技公司 丰台科技园 互联网 时间互联网络科技 哈尔滨秒房互联网科技有限公司 荆州市昕露互联网络科技有限公司 湖南一路畅行互联网科技 移动互联网科技公司 注册互联网科技公司经营范围大全 民营互联网公司国防科技 互联网数据科技专业 2021互联网科技公司排名 互联网科技实习生岗位 富国互联网科技002692 有人说阿里系是互联网科技企业 云鲸互联网络科技有限公司 10位科技互联网大佬 猪兼强互联网科技 智网互联网科技 银优互联网科技有限公司 互联网金融科技委员会 互联网公司科技股 河南猎农互联网科技有限公司 想开互联网科技公司怎么样 高科技互联网发展前景如何 徐州市互联网科技有限公司 互联网与数字科技关系
0