spring cloud原理_consul 服务治理原理简介和环境搭建

consul原理简介

服务发现和治理

在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性

97d30c24391186f88bddc1e7a7cf99cc.png
  • 服务发现以及注册:

当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康。

  • 服务调用:

当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp table),从temp table表中任选一个· Producer 的 IP 和 Port, 然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新

consule 核心 agent组件

Agent是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。每个Consul agent维护它自己的服务集合以及检查注册和健康信息。agent负责执行自己的健康检查和更新本地状态 其中,Agent 根据节点的性质,分为: Agent Server 和 Agent Client

  • Agent Client

client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。

  • Agent Server

server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。

概念简介

  • CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。简单的说,client 处理健康检查,注册服务等,但是这个注册只是转发到server中,如果有成千上万的服务,分别启动多个client,可以减少server 压力
  • SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
  • SERVER-LEADER 中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

consul 通信接口

  1. RPC

用于内部通讯Gossip/日志分发/选主等

  1. HTTP API

服务发现/健康检查/KV存储等几乎所有功能, 默认端口为8500

  • 2.3 Consul Commands (CLI)

consul命令行工具可以与consul agent进行连接,提供部分consul的功能。

实际上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯。

  • 2.4 DNS

仅用于服务查询

例如: dig @127.0.0.1 -p 8600 web.service.consul

我们可以通过cosul提供的DNS接口来获取当前的服务“web”对应的可用节点

Consul 内部端口使用汇总

fd01dbe82d780cf4d13cb1b171feab00.png

Consul 请求调用链路

a94ec3edfe2e976cbdc4801fcd3d6247.png

consul 去中心化思想实现

consul 使用了基于gossip协议的Serf实现,Serf是一个服务发现,编配工具,它去中心化,不像集中式结构那样统一分配管理; Serf提供成员关系,纠错检查,广播等功能。gossip协议主要是基于UDP,实现任意node-to-node间的通信。Consul正是使用serf 提供的gossip协议来管理成员和广播消息到集群。

gossip 协议(gossip protocol)是基于流行病传播方式的节点或者进程之间信息交换的协议,来确保网络中所有节点的数据一样。其中节点间的交互方式主要以下有三种:

  • Push:发起信息的节点 A 随机选择联系节点 B,并向B发送自己的信息,节点 B 在收到信息后,更新比自己新的数据,一般拥有新信息的节点才会作为发起节点。
  • Pull:发起信息的节点 A 随机选择联系节点 B,并从对方获取信息。一般无新信息的节点才会作为发起节点。
  • Push&Pull:发起信息的节点 A 向选择的节点 B 发送信息,同时从对方获取数据,用于更新自己的本地数据。

综述consul内部原理

bfbfe8a2bbab1ead14d20f981dd90cd6.png

1,服务器 Server1、Server2、Server3 上分别部署了 Consul Server, 组成了Consule集群,通过raft选举算法, server2成为leader节点。

2,服务器 Server4 和 Server5 上通过 Consul Client 分别注册 Service A、B、C,(服务A,B,C注册到 Consul 可以通过 HTTP API(8500 端口)的方式,也可以通过 Consul 配置文件的方式。)

3,Consul Client将注册信息通过 RPC 转发到 Consul Server,服务信息保存在 Server 的各个节点中,并且通过 Raft 实现了强一致性。

4,服务器 Server6 中 Program D 要访问 Service B,此时 Program D 先访问本机 Consul Client 提供的 HTTP API,Consul Client 会将请求转发到 Consul Server。Consul Server 查询到 Service B 并返回,最终 Program D 拿到了 Service B 的所有部署的 IP 和端口,根据负载均衡策略,选择Service B 的其中一个并向其发起请求。

如果服务发现采用的是 DNS 方式,则 Program D 中使用 Service B 的服务发现域名,域名解析请求首先到达本机 DNS 代理,然后转发到本机 Consul Client,consul Client 会将请求转发到 Consul Server。随后的流程和上述一直。

consul环境搭建

consul 安装

下载页面

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

abd55c0cd0eb306b562ad4e1994b6d8d.png

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

79fd6aab2b7e293451d2652a651df983.png

配置环境变量

sudo vim /etc/paths.d/user_mengfanxiao

f701af82e6dedc388c436c4e32fdea0b.png

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

317cffb07cf069c1d12066b4641fc22e.png
  • 查看成员

consul members

379d7c79040ab9b81bf868e80afdfc47.png
  • 创建服务

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

  • 先关闭之前的代理

46f7eb5afcecc765c956ca0eee42aa3a.png
  • 启动代理

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

795c4ff677b8f23f339e2493d3971d03.png
  • 通过DNS查询服务

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

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

109c0a5fbd88ddc45b30dfd80e12e489.png

2⃣️

dig @127.0.0.1 -p 8600 service2.service.consul

10727001bee0eee9c142280ab8f43d9a.png
  • Http查询

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

86ddba132e8180afb5b32cf197f3a3f5.png
  • 查询健康

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

f3997793b2de446fca82108c94ebc9d4.png

Consul Web界面

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

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

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

85e0927bacdcee83fd591ebb434d7b31.png

Docker consul安装

consul 服务发现 集群 docker 版

下载镜像

docker pull consul

52df96f6413c9c3482f050ae1145567f.png

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

fe7b3844ffe42417152e6a5072c8de63.png
  • 上述操作的执行情况

4ac571274838c40dd8108e7574b75861.png
  • 把节点加入集群

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

1⃣️

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

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

consul join $JOIN_IP

  • 查看节点

docker exec node1 consul members

118e34ac121227804d4e9cd86866e9e1.png

参考文献

https://blog.csdn.net/fenglailea/article/details/79093848 https://blog.csdn.net/fenglailea/article/details/79098246 https://blog.csdn.net/jiangqingyao/article/details/92856466

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值