springcloud分布式之consul探索

1,050 阅读6分钟

[TOC]

之前罗列了eureka作为服务治理的整合,并简单介绍了eureka的工作原理。eureka在cap理论中遵循了AP原理。

consul安装

点我官网下载

  • 在官网下载的jar解压后里面执行一个可执行文件consul.我们将consul移动到我们自己的目录下。并形成以下文件结构方便日后调试配置。

  • conf/dev.json : 我们配置文件,我们也可以使用系统默认的。

  • data/node-id : 节点信息

  • /log/consul-**.log: 日志文件

  • dev.json里配置的都可以在consul启动命令里加入。这里放在dev.json方便我们查看配置信息

consul agent -dev -config-dir=/data/services/consul/conf

  • 以上命令就可以启动consul了。

==> Starting Consul agent...
           Version: 'v1.7.3'
           Node ID: 'ebe4a279-8e4e-dfc9-7f68-4652bfb27f3a'
         Node name: 'Consul'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 192.168.44.131 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

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

    2022-03-18T18:49:58.102-0700 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:ebe4a279-8e4e-dfc9-7f68-4652bfb27f3a Address:192.168.44.131:8300}]"
    2022-03-18T18:49:58.103-0700 [INFO]  agent.server.serf.wan: serf: EventMemberJoin: Consul.dc1 192.168.44.131
    2022-03-18T18:49:58.103-0700 [INFO]  agent.server.raft: entering follower state: follower="Node at 192.168.44.131:8300 [Follower]" leader=
    2022-03-18T18:49:58.103-0700 [INFO]  agent.server.serf.lan: serf: EventMemberJoin: Consul 192.168.44.131
    2022-03-18T18:49:58.104-0700 [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=udp
    2022-03-18T18:49:58.104-0700 [INFO]  agent.server: Adding LAN server: server="Consul (Addr: tcp/192.168.44.131:8300) (DC: dc1)"
    2022-03-18T18:49:58.104-0700 [INFO]  agent.server: Handled event for server in area: event=member-join server=Consul.dc1 area=wan
    2022-03-18T18:49:58.104-0700 [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=tcp
    2022-03-18T18:49:58.107-0700 [INFO]  agent: Started HTTP server: address=[::]:8500 network=tcp
    2022-03-18T18:49:58.108-0700 [INFO]  agent: Started gRPC server: address=[::]:8502 network=tcp
    2022-03-18T18:49:58.109-0700 [INFO]  agent: started state syncer
==> Consul agent running!
    2022-03-18T18:49:58.166-0700 [WARN]  agent.server.raft: heartbeat timeout reached, starting election: last-leader=
    2022-03-18T18:49:58.166-0700 [INFO]  agent.server.raft: entering candidate state: node="Node at 192.168.44.131:8300 [Candidate]" term=2
    2022-03-18T18:49:58.166-0700 [INFO]  agent.server.raft: election won: tally=1
    2022-03-18T18:49:58.166-0700 [INFO]  agent.server.raft: entering leader state: leader="Node at 192.168.44.131:8300 [Leader]"
    2022-03-18T18:49:58.167-0700 [INFO]  agent.server: cluster leadership acquired
    2022-03-18T18:49:58.168-0700 [INFO]  agent.server: New leader elected: payload=Consul
    2022-03-18T18:49:58.202-0700 [INFO]  agent.server.connect: initialized primary datacenter CA with provider: provider=consul
    2022-03-18T18:49:58.202-0700 [INFO]  agent.leader: started routine: routine="CA root pruning"
    2022-03-18T18:49:58.202-0700 [INFO]  agent.server: member joined, marking health alive: member=Consul
    2022-03-18T18:49:58.202-0700 [INFO]  agent: Synced node info

后台启动

nohup consul agent -dev -config-dir=/data/services/consul/conf >> /data/services/consul/log/consul.log &

  • 至此服务安装启动成功。

客户端注册

  • 这里的客户端和eureka一样。在payment-provider和order-consumer在consul看来都是客户端。这里简单描述下payment-provider的注册流程。order是一样的操作

  • 首先我们通过idea的自动提示知道springcloud的consul中的prefer-ip-address默认是关闭了。这个配置会影响到啥的。我们看看下面这张是默认注册上去的服务。

  • 没有开启prefer-ip-address的话我们注册上去的就说localhost。这个在实验场景下我们可以是在同一个ip下的。真实场景中肯定是在不同机器上的。localhost就会调不通。我们上面就是因为localhost导致后面的service checks状态是×。

  • 这个时候我们的ip注册进去了。而且services checks 也是√了。

pom引入


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

  • 这里我们不在介绍框架的基础搭建了。需要源码的直接上git

点我下载

配置文件



spring:
  cloud:
    consul:
      host: 192.168.44.131
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        register: true
        prefer-ip-address: true

启动注解

-启动类上加入@EnableDiscoveryClient

订单调用

  • 这里订单模块注册就不说勒。重复上述payment注册就行了。或者说order不注册也是可以的。因为在演示场景中是order借助consul调用payment.只需要保证payment成功注册且可以掉通就行了。

  • 我们只需要修改根地址。这里的是注册在consul中的服务名。

consul集群搭建

  • 集群和单机的区别就是多了集群组了。主要加入集群ip组

"retry_join": [ 
 "x.x.x.1",
 "x.x.x.2",
 "x.x.x.3"
 ]

  • 这里需要不同的机器上搭建。这里为了方便我们采用docker方式安装

docker安装

单机安装


docker run -d -p 8500:8500 --restart=always --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client='0.0.0.0'

可以忽略

因为docker 默认的 docker0 虚拟网卡是不支持直接设置静态ip的。所以我们先创建一个自己的虚拟网络。

sudo docker network create --subnet=172.18.0.0/24 staticnet

可能会报错 Error response from daemon: Pool overlaps with other one on this address space

这种情况我们只需要换一个ip就行了。

sudo docker network create --subnet=172.16.0.0/24 staticnet

docker 默认IP

上述操作在虚拟机中可能会破坏虚拟机的网络问题。所以笔者建议大家使用docker默认的ip就行了。


{
    "datacenter": "dc1",
    "log_level": "INFO",
    "node_name": "s_3",
    "server": true,
    "bootstrap_expect": 2,
    "bind_addr": "0.0.0.0",
    "client_addr": "0.0.0.0",
    "ui": true,
    "ports": {
        "dns": 8600,
        "http": 8500,
        "https": -1,
        "server": 8300,
        "serf_lan": 8301,
        "serf_wan": 8302
    },
    "rejoin_after_leave": true,
    "retry_join": [
        "172.18.0.5",
        "172.18.0.6",
        "172.18.0.7"
    ],
    "retry_interval": "30s",
    "reconnect_timeout": "72h"
}

  • 我们先生成以上的配置文件起名consul1.json . 复制三份node_name依次为s_1,s_2,s_3 ,只要不同就行了。 retry_join里面的IP我们先不用管。然后执行docker启动容器

  • sudo docker run -p 8500:8500 -d --name consul_s1 -v /data/services/consul/docker/consul1.json:/consul/config/basic_config_1.json consul agent -config-dir /consul/config启动第一个consul -sudo docker run -d --name consul_s2 -v /data/services/consul/docker/consul2.json:/consul/config/basic_config_1.json consul agent -config-dir /consul/config -sudo docker run -d --name consul_s2 -v /data/services/consul/docker/consul2.json:/consul/config/basic_config_1.json consul agent -config-dir /consul/config

  • 启动s2,s3. 记住s2,s3和s1不同的是不需要绑定端口。因为一台物理机只能有一个8500端口。这里为了演示只是将8500暴露出来。其他的consul的端口需要自行暴露。 -三个容器都启动好之后执行docker inspect consul1

  • 在上面我们能看到容器的ip. 这个ip我们重启重启是不会变的。删除重新生成的可能会变。这个读者可以自己测试下。

  • 然后我们将json文件中的ip换成三个容器的ip分别重启就可以了。

  • 这样我们的docker版集群搭建成功了。至于springcloud的整合无非就是在原来的地址处单机变多机。这里不掩饰了

consul 运行原理

  • consul是多数据中心的。可以理解成集群与集群可以互通组成更大的集群。在一个consul数据中心的有client和server
  • client : client是无状态的。只是负责将请求转发给server端。
  • server : server是真正持久化数据并通知其他server同步数据的服务

在数据中心的中的server是通过病毒算法进行通知数据备份的。

consul.jpg