consul 原理简述

  • 图中有两个数据中心,分别为Datacenter1和Datacenter2 Consul非常好的支持多个数据中心,每个数据中心内,有客户端和服务器端,服务器一般为3~5个,这样可以在稳定和性能上达到平衡,因为更多的机器会使数据同步很慢。不过客户端是没有限制的,可以有成千上万个。

  • 数据中心内的所有节点都会加入到Gossip协议。这就意味着有一个Gossip池,其中包含这个数据中心所有的节点。

  • 客户端不需要去配置服务器地址信息,发现工作会自动完成。

  • 检测故障节点的工作不是放在服务器端,而是分布式的;这使得失败检测相对于本地化的心跳机制而言,更具可拓展性。

  • 在选择leader这种重要的事情发生的时候,数据中心被用作消息层来做消息广播。

  • 每个数据中心内的服务器都是单个Raft中节点集的一部分。这意味着他们一起工作,选择一个单一的领导者——一个具有额外职责的选定的服务器。leader负责处理所有查询和事务。事务也必须作为同步协议的一部分复制到节点集中的所有节点。由于这个要求,当非leader服务器接收到RPC请求时,就会将请求其转发给集群leader。

  • 服务器端节点同时也作为WAN Gossip池的一部分,WAN池和LAN池不同的是,它针对网络高延迟做了优化,而且只包含其他Consul服务器的节点。这个池的目的是允许数据中心以最少的消耗方式发现对方。启动新的数据中心与加入现有的WAN Gossip一样简单。因为这些服务器都在这个池中运行,它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心中的随机服务器。那个服务器可能会转发给本地的leader。

  • 这样会使数据中心的耦合非常低。但是由于故障检测,连接缓存和复用,跨数据中心请求相对快速可靠。

  • 总的来说,数据不会在不同的数据中心之间做复制备份。当收到一个请求处于别的数据中心的资源时,本地的Consul服务器会发一个RPC请求到远端的Consul服务器,然后返回结果。如果远端数据中心处于不可用状态,那么这么资源也会不可用,但这不影响本地的数据中心。在一些特殊的情况下,有限的数据集会被跨数据中心复制备份,比如说Consul内置的ACL复制能力,或者像consul-replicate这样的外部工具。

consul环境搭建

consul 安装

下载页面

https://www.consul.io/downloads.html

mac 下载版本

https://releases.hashicorp.com/consul/1.7.3/consul_1.7.3_darwin_amd64.zip

创建文件夹存放consul可执行文件

/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin

配置环境变量

sudo vim /etc/paths.d/user_mengfanxiao

source /etc/profile

启动参数说明

  • -dev 开发者模式 该节点的启动不能用于生产环境,因为该模式下不会持久化任何状态 该启动模式仅仅是为了快速便捷的启动单节点consul

  • -ui 启动自有主机的界面

  • -bootstrap-expect 1 集群节点,表示等待多少个节点再启动,这里是1个,一个就启动

  • -bind=127.0.0.1 绑定IP ,本机IP地址,内网IP

  • -advertise-wan=10.23.123.12 绑定外网ip

  • -node=node1 节点名称,如果没有,默认是主机名

  • -server 设置为服务端

  • -data-dir /tmp/consul 数据存储目录为 /tmp/consul

  • -datacenter=dc1 数据中心

启动

  • agent可以运行在server或者client模式

consul agent -dev -server -bootstrap-expect 1 -data-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/data -node=node1

  • 查看成员

consul members

  • 创建服务

mkdir -p /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d

1⃣️ 创建一个web服务

echo '{"service": {"name": "web", "tags": ["rails"], "port": 801}}' >/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/web.json

2⃣️ 创建一个service2服务

echo '{"service": {"name": "service2", "tags": ["rails"], "port": 802}}' >/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/service2.json

  • 先关闭之前的代理

  • 启动代理

consul agent -dev -config-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/

  • 通过DNS查询服务

服务的DNS名称是 NAME.service.consul 服务名称为service2、web

1⃣️ Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具

2⃣️

dig @127.0.0.1 -p 8600 service2.service.consul

  • Http查询

curl http://localhost:8500/v1/catalog/service/service2

  • 查询健康

curl 'http://localhost:8500/v1/health/service/service2?passing'

Consul Web界面

  • 加入 -ui 参数, 启动自有主机的界面

consul agent -dev -ui -config-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/

  • 在浏览器访问 http://localhost:8500/ui

Docker consul安装

consul 服务发现 集群 docker 版

下载镜像

docker pull consul

consul 服务端

  • 服务端node1

docker run -d --name node1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node1 -bootstrap-expect=2

  • 查看node1的ip

JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"

  • 服务端node2

docker run -d --name node2 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node2 -join $JOIN_IP

  • 服务端node3

docker run -d --name node3 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node3 -join $JOIN_IP

consul客户端

  • 客户端node4

docker run -d --name node4 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -node=node4 -join $JOIN_IP

  • 客户端node11 带ui

docker run -d --name node11 -p 8400:8400 -p 8500:8500 -p 8600:53/udp -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -ui -node=node11 -client=0.0.0.0 -join $JOIN_IP

  • 上述操作的执行情况

  • 把节点加入集群

在创建docker容器时忘记加入-join $JOIN_IP这个参数了,那么就可以用以下方法加入集群

1⃣️

docker exec node20 consul join $JOIN_IP node20 要改为 你需要加的那个容器节点名字

2⃣️ 或者进入该容器内部执行

consul join $JOIN_IP

  • 查看节点

docker exec node1 consul members

参考文献

https://blog.csdn.net/fenglailea/article/details/79093848 https://blog.csdn.net/fenglailea/article/details/79098246 https://www.consul.io/docs/internals/architecture.html

原理介绍的比较详细的一篇文章 https://blog.csdn.net/jiangqingyao/article/details/92856466

Consul服务治理原理简介及使用过程相关推荐

  1. java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...

    Consul 是什么 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License ...

  2. Spring Cloud(二)Consul 服务治理实现

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性. Consul 简介 Consul 是 HashiCo ...

  3. Spring Cloud(二) Consul 服务治理实现

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性. Consul 简介 Consul 是 HashiCo ...

  4. CountDownLatch原理简介和使用过程

    前言 本文介绍下面试的高能考点 countDownLatch 的原理和应用 countDownLatch具有的功能 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这 ...

  5. Redis分布锁原理简介和实现过程

    前言 这篇文章介绍下如何实现redis来实现分布式锁及原理简介 原理简介 redis 获取分布式锁使用lua脚本的命令 setnx pexpire(提供了毫秒的过期时间,expire提供了基于秒的过期 ...

  6. Go 使用consul服务治理 rpc通讯

    本篇使用到了RPC通讯 可以看这里 搭建consul集群可以使用这个 docker-compose 一键生成 服务端代码 package mainimport ("fmt"&quo ...

  7. Redlock原理简介和实现过程

    前言 上篇文章介绍了通过SET key_name my_random_value NX PX 30000 NX 表示if not exist 就设置并返回True,否则不设置并返回False PX 表 ...

  8. 微服务消息推送的Consul服务治理发现

    1:新建信息服务项目 MsgService 右键新建项目选择下图所示的选项  下一步然后选择ASP.NET Core2.1的Api 2: 在MsgService 项目的控制器中新建Api控制器 Ema ...

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

    一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Co ...

最新文章

  1. 一线技术管理者究竟在管什么事?
  2. 使用 Stream API 高逼格 优化 Java 代码!
  3. poj2823 Sliding Window
  4. 树的度,结点,叶子结点,二叉树
  5. 姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖
  6. php获得可靠的精准的当前时间 ( 通过授时服务器 )
  7. Javascript中最常用的经典技巧
  8. linux shell脚本 检查IP地址格式
  9. Java并发编程实战——并发编程的优缺点
  10. bandzip关闭右键新建文件夹选项方法步骤
  11. 使用freessl免费证书
  12. N-S图、PAD图(例题)
  13. 西西里2286. Stack Implementation
  14. 点猫科技与Aqara绿米达成战略合作,助推校内人工智能教育普及
  15. html/template 和 text/template区别
  16. MyEclipse热部署----使用工具 JRebel
  17. Niushop 商品海报
  18. 编写测试用例需要考虑的一些因素
  19. 0004-python第三天:基本数据类型
  20. JAVA编程_05_超市奖票兑换

热门文章

  1. 大学计算机课程设计日历,课程设计题三:日历和数字钟
  2. linux挂载华为存储fc,linux 挂载存储设备
  3. 判断大小_美人计 | 学会这招大小骨架判断法,我知道自己不是胖了
  4. OSChina 周六乱弹 —— 运维狗的背锅日常
  5. Spring与Web整合
  6. 第十三篇:multimap容器和multiset容器中的find操作
  7. 7-5-无向图生成树-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
  8. 【Objective-C】Http常用API、同步请求与异步请求[转]
  9. 如何在eclipse中使用XYLayout布局?在此介绍如何把XYLayout导入到eclipse .
  10. Deep learning:十(PCA和whitening)