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网关服务实践,敬请期待,我要睡了。
Consul服务告警之Watch机制的更多相关文章
- Redola.Rpc 集成 Consul 服务发现
Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来 ...
- Consul 服务注册与服务发现
上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...
- SpringCloud+Consul 服务注册与服务发现
SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
准备环境 安装consul之后 1. 创建一个.net core webapi 举例为UsercenterService 2. nuget引用Consul组件 https://github.com/ ...
- 【微服务No.1】Consul服务发现在windows下简单使用
基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...
- .NET Core微服务实施之Consul服务发现与治理
.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...
- (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...
- (4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费
上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...
随机推荐
- linux中的操作记录
在hadoop上运行jar文件:hadoop jar xxx.jar main路径 命令模式: 1.dd 删除光标所在的当前行 2.Ctrl+u 删除光标所在行光标之前的内容 3.命令模式下,按‘/’ ...
- vue之组件通信
vue组件通信一般分为以下几种情况: 1.父子组件通信: 2.兄弟组件通信: 3.跨多层级组件通信: 一.父子通信 父组件通过props传递数据给子组件,子组件通过emit发送事件传递数 ...
- 洛谷 P4281 [AHOI2008] 紧急集合 题解
挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解.值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为 ...
- ipcs
用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表.共享内存和信号量的信息
- Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because ...
- go语言new和make
1.new func new(Type) *Type 内建函数,内建函数 new 用来分配内存,它的第一个参数是一个类型,它的返回值是一个指向新分配类型默认值的指针! 2.make func make ...
- CF1221G Graph And Numbers(折半搜索+图论)
答案=总数-无0-无1-无2+无01+无02+无12-无012 直接详细讲无0和无2 无0为 01和11,无2为01和00,显然二者方案数相同,以下考虑无0 考虑折半搜索,后半段搜索,二进制点权0的位 ...
- app内嵌H5的上传图片的功能
1.上传组件 <!-- - hasBorder {Boolean} cell底部边框,oneline 为 true 有效 - inlineBorder {Boolean} cell底部短边框 - ...
- 在安卓手机下按钮会悬浮在键盘上,怎么解决vue.js
data里面 screenHeight: window.innerHeight mounted里面 mounted () { var that = this var u = navigator.use ...
- 基于Spring Boot+Cloud构建微云架构
前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易让你理解和操作出现偏差 ...