CentOS7.5.1804 Minimal安装配置单机Consul1.2.2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lc1010078424/article/details/82467399

Eureka 2.X 停止开发,但注册中心还有更多选择:Consul 使用详解

在上个月我们知道 Eureka 2.X 遇到困难停止开发了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比:

Feature euerka Consul zookeeper etcd
服务健康检查 可配支持 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳
多数据中心 支持
kv 存储服务 支持 支持 支持
一致性 raft paxos raft
cap ap ca cp cp
使用接口(多语言能力) http(sidecar) 支持 http 和 dns 客户端 http/grpc
watch 支持 支持 long polling/大部分增量 全量/支持long polling 支持 支持 long polling
自身监控 metrics metrics metrics
安全 acl /https acl https 支持(弱)
spring cloud 集成 已支持 已支持 已支持 已支持

在以上服务发现的软件中,Euerka 和 Consul 使用最为广泛。如果大家对注册中心的概念和 Euerka 不太了解的话, 可以参考我前期的文章:Spring Cloud构建微服务架构 | 第一篇: 服务的注册与发现(Eureka) ,本篇文章主要给大家介绍 CentOS7.5.1804 Minimal上安装Consul 。

Consul 介绍

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

Consul 的优势:
  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
  • 支持健康检查。 etcd 不提供此功能。
  • 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
  • 官方提供 web 管理界面, etcd 无此功能。
  • 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。
特性:
  • 服务发现
  • 健康检查
  • Key/Value 存储
  • 多数据中心
Consul 角色
  • client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
  • server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。

Consul 客户端、服务端还支持夸中心的使用,更加提高了它的高可用性。
这里写图片描述
Consul 工作原理:
这里写图片描述

  • 1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
  • 2、Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
  • 3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
  • 4、该临时表每隔10s会更新,只包含有通过了健康检查的 Producer

Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。

Consul VS Eureka

Eureka 是一个服务发现工具。该体系结构主要是客户端/服务器,每个数据中心有一组 Eureka 服务器,通常每个可用区域一个。通常 Eureka 的客户使用嵌入式 SDK 来注册和发现服务。对于非本地集成的客户,官方提供的 Eureka 一些 REST 操作 API,其它语言可以使用这些 API 来实现对 Eureka Server 的操作从而实现一个非 jvm 语言的 Eureka Client。

Eureka 提供了一个弱一致的服务视图,尽可能的提供服务可用性。当客户端向服务器注册时,该服务器将尝试复制到其它服务器,但不提供保证复制完成。服务注册的生存时间(TTL)较短,要求客户端对服务器心跳检测。不健康的服务或节点停止心跳,导致它们超时并从注册表中删除。服务发现可以路由到注册的任何服务,由于心跳检测机制有时间间隔,可能会导致部分服务不可用。这个简化的模型允许简单的群集管理和高可扩展性。

Consul 提供了一些列特性,包括更丰富的健康检查,键值对存储以及多数据中心。Consul 需要每个数据中心都有一套服务,以及每个客户端的 agent,类似于使用像 Ribbon 这样的服务。Consul agent 允许大多数应用程序成为 Consul 不知情者,通过配置文件执行服务注册并通过 DNS 或负载平衡器 sidecars 发现。

Consul 提供强大的一致性保证,因为服务器使用 Raft 协议复制状态 。Consul 支持丰富的健康检查,包括 TCP,HTTP,Nagios / Sensu 兼容脚本或基于 Eureka 的 TTL。客户端节点参与基于 Gossip 协议的健康检查,该检查分发健康检查工作,而不像集中式心跳检测那样成为可扩展性挑战。发现请求被路由到选举出来的 leader,这使他们默认情况下强一致性。允许客户端过时读取取使任何服务器处理他们的请求,从而实现像 Eureka 这样的线性可伸缩性。

Consul 强烈的一致性意味着它可以作为领导选举和集群协调的锁定服务。Eureka 不提供类似的保证,并且通常需要为需要执行协调或具有更强一致性需求的服务运行 ZooKeeper。

Consul 提供了支持面向服务的体系结构所需的一系列功能。这包括服务发现,还包括丰富的运行状况检查,锁定,密钥/值,多数据中心联合,事件系统和 ACL。Consul 和 consul-template 和 envconsul 等工具生态系统都试图尽量减少集成所需的应用程序更改,以避免需要通过 SDK 进行本地集成。Eureka 是一个更大的 Netflix OSS 套件的一部分,该套件预计应用程序相对均匀且紧密集成。因此 Eureka 只解决了一小部分问题,可以和 ZooKeeper 等其它工具可以一起使用。

Consul 强一致性(C)带来的是:

服务注册相比 Eureka 会稍慢一些。因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 Leader 挂掉时,重新选举期间整个 Consul 不可用。保证了强一致性但牺牲了可用性。

Eureka 保证高可用(A)和最终一致性:

服务注册相对要快,因为不需要等注册信息 replicate 到其它节点,也不保证注册信息是否 replicate 成功 当数据出现不一致时,虽然 A, B 上的注册信息不完全相同,但每个 Eureka 节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求 A 查不到,但请求 B 就能查到。如此保证了可用性但牺牲了一致性。

其它方面,eureka 就是个 servlet 程序,跑在 servlet 容器中; Consul 则是 go 编写而成。

Consul 安装

参考

要想利用Consul提供的服务实现服务的注册与发现,我们需要搭建Consul Cluster 环境。

在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。

Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。

以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。

环境配置如下:

CentOS7.5.1804 Minimal

主机名称 IP 作用 是否允许远程访问
node1 192.168.8.129 consul server
node2 192.168.8.130 consul client
node3 192.168.8.131 consul client
Consul 最新版的下载地址:

https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
下载,然后unzip 解压,得到唯一,一个可执行文件

[root@oracle ~]# cd /usr/local/src
[root@oracle src]# wget https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
[root@oracle src]# unzip consul_1.2.2_linux_amd64.zip
[root@oracle src]# cp consul /usr/local/bin/

查看是否安装成功

[root@oracle ~]# cd /usr/local/src
[root@oracle src]# consul

出现如下结果,表示安装成功

Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    catalog        Interact with the catalog
    connect        Interact with Consul Connect
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators.
    intention      Interact with Connect service intentions
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    snapshot       Saves, restores and inspects snapshots of Consul server state
    validate       Validate config files/directories
    version        Prints the Consul version
    watch          Watch for changes in Consul

检查版本

[root@oracle /]# consul version
Consul v1.2.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
设置防火墙

这一步必不可少,要放开Consul默认端口8500

[root@oracle ~]# sudo vi /etc/sysconfig/iptables
添加参数
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT
[root@oracle ~]# sudo systemctl restart iptables  #重启生效

Consul常用命令

命令 解释 示例
agent 运行一个consul agent consul agent -dev
join 将agent加入到consul集群 consul join IP
members 列出consul cluster集群中的members consul members
leave 将节点移除所在集群 consul leave
consul agent 命令的常用选项

-data-dir

  • 作用:指定agent储存状态的数据目录
  • 这是所有agent都必须的
  • 对于server尤其重要,因为他们必须持久化集群的状态

-config-dir

  • 作用:指定service的配置文件和检查定义所在的位置
  • 通常会指定为”某一个路径/consul.d”(通常情况下,.d表示一系列配置文件存放的目录)

-config-file

  • 作用:指定一个要装载的配置文件
  • 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)

-dev

  • 作用:创建一个开发环境下的server节点
  • 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
  • 这种模式不能用于生产环境(因为第二条)

-bootstrap-expect

  • 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。

-node

  • 作用:指定节点在集群中的名称
  • 该名称在集群中必须是唯一的(默认采用机器的host)
  • 推荐:直接采用机器的IP

-bind

  • 作用:指明节点的IP地址
  • 有时候不指定绑定IP,会报Failed to get advertise address: Multiple private IPs found. Please configure one. 的异常

-server

  • 作用:指定节点为server
  • 每个数据中心(DC)的server数推荐至少为1,至多为5
  • 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性
  • server也是与其他DC交互的门面(gateway)

-client

  • 作用:指定节点为client,指定客户端接口的绑定地址,包括:HTTP、DNS、RPC
  • 默认是127.0.0.1,只允许回环接口访问
  • 若不指定为-server,其实就是-client

-join

  • 作用:将节点加入到集群

-datacenter(老版本叫-dc,-dc已经失效)

  • 作用:指定机器加入到哪一个数据中心中
启动consul

我的linux ip地址为:192.168.8.129

[root@oracle ~]# cd /usr/local/src
[root@oracle src]# ./consul agent -dev -ui -node=consul-dev -client=192.168.8.129

出现以下信息,说明consul已在启动

[root@oracle src]# ./consul agent -dev -ui -node=consul-dev -client=192.168.8.129
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v1.2.2'
           Node ID: '7d2b1ccb-573b-cebb-575d-b5ed49d82a14'
         Node name: 'consul-dev'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [192.168.8.129] (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:

    2018/08/14 21:42:51 [DEBUG] agent: Using random ID "7d2b1ccb-573b-cebb-575d-b5ed49d82a14" as node ID
    2018/08/14 21:42:51 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:7d2b1ccb-573b-cebb-575d-b5ed49d82a14 Address:127.0.0.1:8300}]
    2018/08/14 21:42:51 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2018/08/14 21:42:51 [INFO] serf: EventMemberJoin: consul-dev.dc1 127.0.0.1
    2018/08/14 21:42:51 [INFO] serf: EventMemberJoin: consul-dev 127.0.0.1
    2018/08/14 21:42:51 [INFO] consul: Adding LAN server consul-dev (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2018/08/14 21:42:51 [INFO] consul: Handled member-join event for server "consul-dev.dc1" in area "wan"
    2018/08/14 21:42:51 [DEBUG] agent/proxy: managed Connect proxy manager started
    2018/08/14 21:42:51 [WARN] agent/proxy: running as root, will not start managed proxies
    2018/08/14 21:42:51 [INFO] agent: Started DNS server 192.168.8.129:8600 (tcp)
    2018/08/14 21:42:51 [INFO] agent: Started DNS server 192.168.8.129:8600 (udp)
    2018/08/14 21:42:51 [INFO] agent: Started HTTP server on 192.168.8.129:8500 (tcp)
    2018/08/14 21:42:51 [INFO] agent: started state syncer
    2018/08/14 21:42:51 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2018/08/14 21:42:51 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2018/08/14 21:42:51 [DEBUG] raft: Votes needed: 1
    2018/08/14 21:42:51 [DEBUG] raft: Vote granted from 7d2b1ccb-573b-cebb-575d-b5ed49d82a14 in term 2. Tally: 1
    2018/08/14 21:42:51 [INFO] raft: Election won. Tally: 1
    2018/08/14 21:42:51 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2018/08/14 21:42:51 [INFO] consul: cluster leadership acquired
    2018/08/14 21:42:51 [INFO] consul: New leader elected: consul-dev
    2018/08/14 21:42:51 [INFO] connect: initialized CA with provider "consul"
    2018/08/14 21:42:51 [DEBUG] consul: Skipping self join check for "consul-dev" since the cluster is too small
    2018/08/14 21:42:51 [INFO] consul: member 'consul-dev' joined, marking health alive
    2018/08/14 21:42:51 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/08/14 21:42:51 [INFO] agent: Synced node info
    2018/08/14 21:42:51 [DEBUG] agent: Node info in sync
    2018/08/14 21:42:54 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/08/14 21:42:54 [DEBUG] agent: Node info in sync
验证

通过浏览器访问:http://192.168.8.129:8500/ui
出现如下图表明Consul安装启动成功
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lc1010078424/article/details/82467399