Consul实现服务治理1

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

https://www.cnblogs.com/edisonchou/p/9148034.html

一、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配置文件中:


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

  

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

  

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

  

  *.需要注意的是确保你的虚拟机可以访问外网,不然是发布出来Email的。

4.小结
  本篇将上篇中遗留的内容进行了弥补,下篇将开始基于Ocelot+Polly的API网关服务实践,敬请期待,我要睡了。

  

  此外,今天是高考第二天,也预祝各位高三学子高考成功,加油最后两科!

  

参考资料
桂素伟,《Ocelot+Consul实践》

卓一抗,《学习Consul》

陈冲,《Consul分布式集群搭建&简单功能测试&故障恢复》

作者:周旭龙

出处:http://edisonchou.cnblogs.com

原文地址:https://www.cnblogs.com/Leo_wl/p/9164863.html

时间: 2024-11-07 00:04:48

Consul实现服务治理1的相关文章

Consul实现服务治理

.NET Core微服务之基于Consul实现服务治理 https://www.cnblogs.com/edisonchou/p/9124985.html 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要

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

一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单. Consul用Golang实现,因此具有天然可移植性(支持Linux.windows和Ma

.NET Core微服务之基于Consul实现服务治理(续)

上一篇发布之后,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul服务注册之配置文件方式 1.1 重温Consul实验集群 这里我们有三个Consul Server节点,一个Consul Client节点,在Client节点上跑了两个ClientService实例,分别占用8810和8820端口.至于基于Ocelot的API网关服务,还没有实现,留到以后跟各位分享.这里假设我们已经启动了这几个节点,并且能够成功访问这两个ClientService实例(

实战中的asp.net core结合Consul集群&Docker实现服务治理

0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在服务器上面直接输入consul agent .... 来搭建启动consul集群,一旦把命令工具关掉,则consul无法再后台启动,尤其是在linux系统中. 如果在window系统中,采用bat文件到时可以做成开机自启,或者在linux中把命令做成一个service 服务文件来启动就可以实现后台运

简单RPC框架-基于Consul的服务注册与发现

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

1 Spring Cloud Eureka服务治理

注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作.每个微服务维护自身的数据存储.业务开发.自动化测试案例以及独立部署机制.维护自身的数据存储称为数据管理的去中心化.由于数据管理的去中心化,各个微服务的数据一致性成为一个难题,因此,需要强调的是各个服务之间进行无"事务"的调用.

Spring Cloud Consul 实现服务注册和发现

Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

微服务架构与服务治理

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.Spring Cloud AW

服务治理相关的工具

最近接触了下组内常用的一些日志分析及报警工具,发现现在一些开源社区和商业公司的产品真的很好用,想要独立搭建一个完善的后端服务,真的已经很容易了: 日志收集与分析:graylog2 + hive/presto 服务监控:sentry Rpc: thrift+consul 如今的开发环境真的已经很好了,一些初创的小团队,很容易就可以搭建一套完善的服务治理框架,从rpc通信,到日志收集分析到服务监控,从前到后都有着完善的解决方案呀 原文地址:https://www.cnblogs.com/xsirfl