背景

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

多数据中心

关于Consul,首先介绍最常见的一副图:



该图表示 Consul 支持的一个重要的功能———多数据中心,这也是很多服务注册发现工具所不具备的,通过上述图中我们可以解读出如下一些信息:

  1. Cosnul 分为 Server 和 Client,多数据中心的实现主要依靠两个数据中心的 Server 进行通信,并且每个数据中心有各自的主节点,也就是各自选举。
  2. Client 与 Server 之间通过8300端口,TCP协议进行RPC交互。
  3. 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 时,具体的调用顺序时怎样的:

如上图所示,这样的部署其实会带来一些问题:

  1. 每台机器上都需要部署 Consul Client
  2. 服务请求链路成倍增加了

问题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种通知方式:

  1. script:当发生变化时执行一段脚本(可以是放在服务器中的任何可执行脚本,例如 py sh 等)
  2. 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)——概念篇的更多相关文章

  1. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇

    题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...

  2. Asp.net core 向Consul 注册服务

    Consul服务发现的使用方法:1. 在每台电脑上都以Client Mode的方式运行一个Consul代理, 这个代理只负责与Consul Cluster高效地交换最新注册信息(不参与Leader的选 ...

  3. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  4. asp.net core 和consul

    consul集群搭建 Consul是HashiCorp公司推出的使用go语言开发的开源工具,用于实现分布式系统的服务发现与配置,内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Valu ...

  5. .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡

    本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...

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

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...

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

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...

  8. Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  9. Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

随机推荐

  1. Java8 Stream终端操作使用详解

    话不多说,自己挖的坑自己要填完,今天就给大家讲完Java8中Stream的终端操作使用详解.Stream流的终端操作主要有以下几种,我们来一一讲解. forEach() forEachOrdered( ...

  2. 【Android - 进阶】之PopupWindow的使用

    创建一个类继承自PopupWindow,编写自定义的PopupWindow类.示例代码如下: import android.app.Activity; import android.graphics. ...

  3. WebGPU学习(四):Alpha To Coverage

    大家好,本文学习与MSAA相关的Alpha To Coverage以及在WebGPU中的实现. 上一篇博文 WebGPU学习(三):MSAA 学习Alpha To Coverage 前置知识 WebG ...

  4. 震惊!线上四台机器同一时间全部 OOM,到底发生了什么?

    案发现场 昨天晚上突然短信收到 APM (即 Application Performance Management 的简称),我们内部自己搭建了这样一套系统来对应用的性能.可靠性进行线上的监控和预警的 ...

  5. uni-app之网络请求

    uni-app之网络请求 一,介绍 uni.request(OBJECT),发起网络请求,以下主要是一些特殊的参数说明,详细的可查看uni-app官网. 1,method的有效值必须是大写,默认GET ...

  6. mac本地搭建svn

    mac系统默认已经安装了svn,我们只需要配置并开启就可以了. 首先我们可以验证一下是否安装了svn,打开终端,输入命令 svnserve —version

  7. Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...

  8. Apache服务——个人用户主页功能

    使用Apache服务部署静态网站(二) 个人用户主页功能 Apache服务程序中有个默认未开启的个人用户主页功能,能够为所有系统内的用户生成个人网站,确实很实用哦~ 第1步:开启个人用户主页功能: [ ...

  9. 接口访问报错:The valid characters are defined in RFC 7230 and RFC 3986

    写了个接口,在测试访问的时候,需要传json串,但是后台报错了 The valid characters are defined in RFC 7230 and RFC 3986 当前使用的tomca ...

  10. mint UI MessageBox 使用

    一.全局注册 1.在main.js中引入 //引入 import { MessageBox } from 'mint-ui';   //全局使用,挂载到原型上 Vue.prototype.$messa ...