前言

最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结。

该篇是 Docker 实战系列的第三篇。传送门:

为什么选 Consul?

首先 Consul 有以下几个关键特性:

  • 服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
  • 健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
  • K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
  • 多数据中心:支持多数据中心,开箱即用。
  • WEB-UI:支持 WEB-UI。点点点,你就能够了解你的服务现在的运行情况,一目了然,对开发运维是非常友好的。

作为高频的提问方式,面试官永远从十万个为什么开始。但是最为程序员,还是需要知其然,知其所以然。以下是几个常用的服务发现组件的对比。

服务发现组件的选型主要从以下几个方面进行。CAP 理论、一致性算法、多数据中心、健康检查、是否支持 k8s 等。

1. CAP

一致性的强制数据统一要求,必然会导致在更新数据时部分节点处于被锁定状态,此时不可对外提供服务,影响了服务的可用性。

2. 一致性算法

Raft算法将 Server 分为三种类型:Leader、Follower 和 Candidate。Leader 处理所有的查询和事务,并向 Follower 同步事务。Follower 会将所有的 RPC 查询和事务转发给 Leader 处理,它仅从 Leader 接受事务的同步。数据的一致性以 Leader 中的数据为准实现。

以下是几种常见的一致性算法

3. 多数据中心

Consul 通过 WAN 的 Gossip 协议,完成跨数据中心的同步;而其他的产品则需要额外的开发工作来实现;

注意多数据中心和多节点是 2 个概念

Gossip 协议是 P2P 网络中比较成熟的协议。Gossip 协议的最大的好处是,即使集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。这就允许 Consul 管理的集群规模能横向扩展到数千个节点。

Consul 的每个 Agent 会利用 Gossip 协议互相检查在线状态,本质上是节点之间互 Ping,分担了服务器节点的心跳压力。如果有节点掉线,不用服务器节点检查,其他普通节点会发现,然后用 Gossip 广播给整个集群。

Consul 架构

consul 的架构是什么,官方给出了一个很直观的图片

单独看数据中心 1,可以看出 consul 的集群是由 N 个 SERVER,加上 M 个 CLIENT 组成的。而不管是 SERVER 还是 CLIENT,都是 consul 的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。

CLIENT

CLIENT 表示 consul 的 client 模式,就是客户端模式。是 consul 节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到 SERVER,本身是不持久化这些信息。

SERVER

SERVER 表示 consul 的 server 模式,表明这个 consul 是个 server,这种模式下,功能和 CLIENT 都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

SERVER-LEADER

中间那个 SERVER 下面有 LEADER 的字眼,表明这个 SERVER 是它们的老大,它和其它 SERVER 不一样的一点是,它需要负责同步注册的信息给其它的 SERVER,同时也要负责各个节点的健康监测。

Docker 环境搭建

docker-compose-consul-cluster.yml

version: '3'
services:
consul-server1:
image: consul:latest
hostname: "consul-server1"
ports:
- "8500:8500"
- "53"
volumes:
- ./consul/data1:/consul/data
command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0"
consul-server2:
image: consul:latest
hostname: "consul-server2"
ports:
- "8501:8500"
- "53"
volumes:
- ./consul/data2:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-server3:
image: consul:latest
hostname: "consul-server3"
ports:
- "8502:8500"
- "53"
volumes:
- ./consul/data3:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-node1:
image: consul:latest
hostname: "consul-node1"
command: "agent -join consul-server1 -disable-host-node-id"
depends_on:
- consul-server1
consul-node2:
image: consul:latest
hostname: "consul-node2"
command: "agent -join consul-server1 -disable-host-node-id"
depends_on:
- consul-server1

执行 docker-compose -f docker-compose-consul-cluster.yml up -d 启动,然后访问

http://localhost:8500

看到下图即启动成功

最后

Docker 实战系列皆以快速搭建学习环境为主,Consul 的特性学习及生产环境配置还任重道远。阅读过程中如有疑问或错误,还望多多指正。

公众号 【当我遇上你】

Docker实战之Consul集群的更多相关文章

  1. Docker实战之Zookeeper集群

    1. 概述 这里是 Docker 实战系列第四篇.主要介绍分布式系统中的元老级组件 Zookeeper. ZooKeeper 是一个开源的分布式协调服务,是 Hadoop,HBase 和其他分布式框架 ...

  2. Docker 容器部署 Consul 集群

    Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...

  3. 【解决】docker 容器中 consul集群问题处理

    现象描述:   node1 和node2 日志反复出现 add remove node3节点. node3 节点 一直 驳回 node1 和node2 认为node3已经dead的消息  不断重启se ...

  4. docker上搭建consul集群全流程

    consul简介: consul是提供服务发现.简单配置管理.分区部署的服务注册发现解决方案.主要特性:服务发现\健康检查\基于Key-Value的配置\支持TLS安全通讯\支持多数据中心部署 con ...

  5. Docker实战之Redis-Cluster集群

    概述 接上一篇Docker实战之MySQL主从复制, 这里是Docker实战系列的第二篇,主要进行Redis-Cluster集群环境的快速搭建.Redis作为基于键值对的NoSQL数据库,具有高性能. ...

  6. Docker实战之Kafka集群

    1. 概述 Apache Kafka 是一个快速.可扩展的.高吞吐.可容错的分布式发布订阅消息系统.其具有高吞吐量.内置分区.支持数据副本和容错的特性,适合在大规模消息处理场景中使用. 笔者之前在物联 ...

  7. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

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

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

  9. .net core结合Consul集群&Docker实现服务治理

    实战中的asp.net core结合Consul集群&Docker实现服务治理 https://www.cnblogs.com/guolianyu/p/9614050.html 0.目录 整体 ...

随机推荐

  1. Git-GitHub-GitLab三者之间的联系及区别

    在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便 ...

  2. Qt的窗口如何显示在spi屏幕上

    问题:我们可以将qt移植到H3上,但是如果要将窗口通过spi屏进行显示应该怎么做呢,和framebuffer又有什么关系? 这里只说一下qt在spi屏上显示的技术原理,具体的实现还需要自己努力. 一. ...

  3. python处理nii格式文件

    网上已经有很多代码了,但是注释的都不全,看起来很费解,我自己加了一些注释,重新发出来,尽可能的通俗易懂 读取前需要先安装库 pip install nibabel pip install matplo ...

  4. 新年在家学java之基础篇--类&方法

    面向对象 面向对象OOP,面向过程POP 面向对象三大特征 封装 继承 多态 类 类由属性(对应类中的成员变量)和行为(成员方法)来构成 类的成员变量可以先声明,不用初始化,有默认值 方法名称如果多个 ...

  5. 量化投资_TB交易开拓者A函数和Q函数详解

    //////////////////A函数详解/////////////// //A函数主要在端口上进行下单操作//////////////// A_AccountID说明 返回当前公式应用的交易帐户 ...

  6. python学习笔记(24)-类与对象

    #类与对象 #python类的语法 关键字 class #class 类名 类名的规范是:数字字母下划线组成,不能以数字开头 首字母大写 驼峰命名 #类属性 放在类里面的变量值 #类方法 放在类里面的 ...

  7. 吴裕雄--天生自然python学习笔记:人脸识别用到的特征文件haarcascade_frontalface_default.xml下载

    下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 1.找到haarcascade_frontalface_defa ...

  8. python数据类型:列表List和Set

    python数据类型:列表List, Set集合 序列是Python中最基本的数据结构 序列中每个元素都分配一个数字,表示索引 列表的数据项不需要具有相同的类型        列表中的值可以重复并且有 ...

  9. hosts原理及作用

    https://blog.csdn.net/qq_41356488/article/details/82190372 手机也可以修改hosts,但是需要root权限,百度

  10. 吴裕雄--天生自然Android开发学习:1.2.1 使用Eclipse + ADT + SDK开发Android APP

    1.前言 这里我们有两条路可以选,直接使用封装好的用于开发Android的ADT Bundle,或者自己进行配置 因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新版本 ...