springcloud分布式之consul探索
Posted 烟花散尽13141
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud分布式之consul探索相关的知识,希望对你有一定的参考价值。
文章目录
之前罗列了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是通过病毒算法进行通知数据备份的。
以上是关于springcloud分布式之consul探索的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud之学习笔记(Feign+consul)