ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
背景
笔者所在的公司正在进行微服务改造,这其中服务治理组件是必不可少的组件之一,在一番讨论之后,最终决定放弃 Zookeeper 而采用 Consul 作为服务治理框架基础组件。主要原因是 Consul 自带健康检查,通过该功能可以比较方便的监控应用的运行状态,从而更好的运维整个系统。但在实际实施过程中笔者发现,目前网络上所能看到的很多资料,没有比较清晰的解释 Consul 的运行方式,特别是当用户对于 Zookeeper 主动通知的方式比较熟悉之后,对于 Consul 这种每次都通过 HTTP 调用获取服务信息的方式还是存在很多疑惑的,比如:这样的方式在调用链中,不是会导致 HTTP 调用链增加一倍吗?
多数据中心
关于Consul,首先介绍最常见的一副图:

该图表示 Consul 支持的一个重要的功能———多数据中心,这也是很多服务注册发现工具所不具备的,通过上述图中我们可以解读出如下一些信息:
- Cosnul 分为 Server 和 Client,多数据中心的实现主要依靠两个数据中心的 Server 进行通信,并且每个数据中心有各自的主节点,也就是各自选举。
- Client 与 Server 之间通过8300端口,TCP协议进行RPC交互。
- Client 与其他实例之间通过 8301 以 TCP/UDP 协议进行 LAN GOSSIP 交互
上图解释了 Consul 集群各个 Server 之间的关系,那么 Server 和 Client 之间的关系又是怎样呢?在理解这个问题之前,要先理解一个概念——反熵。
反熵
1. 概念
如果用一句话来概括那大概就是:分而治之,Server 将服务的管辖权(健康检查,服务注册等功能)层层下放给 Client,而 Client 在需要时(例如健康检查失败,新的服务注册等)将所管辖范围内的服务信息进行转发或上报。
关于反熵更加详细的内容,可以参考园子里 波斯码 所写的文章——Consul的反熵,此文对于反熵的解释非常到位, 感兴趣的同学可以进一步阅读。
这个特点也决定了 Consul 服务的注册和健康检查方式:所有操作都是通过 Consul Client 来实现的。如下图所示:

根据上图所示有个重要的概念:
1. 如果我们通过 Client 获取 Agent 上的服务时,则只能返回当前这个 Consul Client 中所注册的所有服务
2. 而如果我们通过 Client 获取 Catalog 上的服务时,则可以获取到所有注册服务。
事实上即使我们需要获取 Catalog 中的信息时,也不是直接与 Consul Server 交互,而是通过当前服务器 Consul Client 转发请求获取。同时取决于反熵概念,如果我们把每台服务器看作管理辖区的最小单位,那么则需要在每台机器上部署 Consul Client,用它来管理这台服器上所有的服务。
2. 问题
如果按照上述信息实施部署,那么我们来看下假如 APP1 调用 APP2 时,具体的调用顺序时怎样的:

如上图所示,这样的部署其实会带来一些问题:
- 每台机器上都需要部署 Consul Client
- 服务请求链路成倍增加了
问题1: 部署成本增加,实际上是一次性工作,况且假如你是容器化部署的话,那这个问题基本可以忽略。
问题2: 调用链路增加的确会带来很多问题,主要是在调用 APP2 之前增加了 ① ② 两步,其中步骤 ① 为本机 HTTP 调用,步骤 ② 为 Consul集群内部的 RPC 调用,经过笔者实际测试这个调用耗时在毫秒级,除非对于性能要求很高的情况下,普通的调用链路请求是可以容忍的,而笔者所在公司的方案目前也是基于此方案。如果不能容忍,那只能牺牲部分一致性,在本地进行缓存,并设定合理的同步周期。
上述问题笔者认为是 Consul 反熵机制所带来的缺陷:只有通过主动请求 Consul Server 才能获取所有服务的信息,而又缺少比较好的通知机制,导致应用程序无法缓存服务信息。 而相比较于 Zookeeper,由于有了更好的通知机制,使各个应用程序可以缓存服务列表信息,只有当收到通知时,才主动更新服务信息。同时 zookeeper 是长连接,当服务在出现问题时可以更加及时获取到变化,而Consul 必须要依赖健康检查,而健康检查是有周期性的。当然凡事都各有利弊,但我们要知晓个中优缺点,才能更加合理使用。
通知机制——Consul Watch
Consul 可以通过配置 Agent 对以下类型的数据进行监控,并且同样受反熵机制的影响,如果想监控集群下所有服务,那么需要将监控配置放在服务端:
- key – 监视指定K/V键值对
- keyprefix – Watch a prefix in the KV store
- services – 监视服务列表
- nodes – 监控节点列表
- service – 监视服务实例
- checks- 监视健康检查的值
- event – 监视用户事件
Consul 主要提供2种通知方式:
- script:当发生变化时执行一段脚本(可以是放在服务器中的任何可执行脚本,例如 py sh 等)
- HTTP endpoint:当发生变化时请求配置的http地址
例如在 Consul 配置文件创建 watch.json ,重启 Consul 后生效
vi /data/consul/config/watch.json
{
"watches": [
{
"type": "services",
"handler_type": "http",
"http_handler_config": {
"path": "http://192.168.1.1:8080/services",
"method": "POST"
}
},
{
"type": "nodes",
"handler_type": "http",
"http_handler_config": {
"path": "http://192.168.1.1:8080/nodes",
"method": "POST"
}
},
{
"type": "checks",
"handler_type": "http",
"http_handler_config": {
"path": "http://192.168.1.1:8080/checks",
"method": "POST"
}
}
]
}
结语
相信有了这些概念的初步理解,可以在初次接触 Consul 时减少一些疑惑。笔者在这个过程中,从博客园一些同学的文章中收益匪浅,特别是 波斯玛 同学的3篇文章,值得详细阅读,这里也推荐大家一并学习。
参考资料:
https://www.cnblogs.com/bossma/tag/Consul/
https://www.cnblogs.com/sunsky303/p/9209024.html
https://blog.csdn.net/iamonlyme/category_9266562.html
ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇的更多相关文章
- ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...
- Asp.net core 向Consul 注册服务
Consul服务发现的使用方法:1. 在每台电脑上都以Client Mode的方式运行一个Consul代理, 这个代理只负责与Consul Cluster高效地交换最新注册信息(不参与Leader的选 ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- asp.net core 和consul
consul集群搭建 Consul是HashiCorp公司推出的使用go语言开发的开源工具,用于实现分布式系统的服务发现与配置,内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Valu ...
- .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡
本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...
- 实战中的asp.net core结合Consul集群&Docker实现服务治理
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
- Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践
相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...
- Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践
相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...
随机推荐
- 【ASP.NET Core学习】Web API
这里介绍在ASP.NET Core中使用Web API创建 RESTful 服务,本文使用VSCode + NET Core3.0 创建简单Rest API 格式化输出 JSON Patch请求 Op ...
- PowerMock学习(十一)之Mock private methods的使用
Mock private methods 就是mock私有方法啦,学到这不难发现,我们其实大部分都是通过反射去完成单元测试的,但是在实际中,某个类中的私有方法,个人不建议使用反射来测试,因为有时候会 ...
- __dict__和dir()的区别
__dict__和dir()的区别 dir() 一般用来查看模块的属性 __dict__从某方面上来说是dir()的子集 可以直接打印dir(),显示的是当前执行文件所有的属性 __dict__ __ ...
- tcp协议传输方法&粘包问题
socket实现客户端和服务端 tcp协议可以用socket模块实现服务端可客户端的交互 # 服务端 import socket #生成一个socket对象 soc = socket.socket(s ...
- Spring IOC容器装配Bean_基于注解配置方式
bean的实例化 1.导入jar包(必不可少的) 2.实例化bean applicationContext.xml(xml的写法) <bean id="userDao" cl ...
- js递归优化
递归优化 递归在我们平时撸码中会经常用到,不过可能很多人不知道递归的弊端,就是会导致调用栈越来越深.如果没有节制的使用递归可能会导致调用栈溢出. 那什么是递归呢? 递归调用是一种特殊的嵌套调用,是某个 ...
- Thinkphp5.1 导入第三方包的问题
一般刚接触tp5.1的,会很不适应,虽然版本号只是比5.0多了0.1,但是差别挺大,废弃了不少方法,官方的教程又很简单,很多东西没说全,在此鄙视一下框架作者,最起码体谅一下小白嘛,搞了好多天才把5.1 ...
- 转:Spring事务管理
spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.Tran ...
- 纯CSS与HTML实现垂直时间轴
原创YouTube HTML源码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- shell 数组作为函数形参
问题描述: 把字符串tarFile和数组slaves_hostIP传入函数processArray中并输出结果. #!/bin/bash function processArray() { tarFi ...