微服务 consul使用
前言
常见的注册中心有zookeeper 、eureka、consul、etcd。
从生态发展、便利性、语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩展为配置中心。
github地址:https://github.com/hashicorp/consul
consul官网:https://learn.hashicorp.com/consul
consul特性
consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:
- service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
- health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
- key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
- multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
Consul架构
Consul的微服务一般都是集群,集群由一个个的Consul节点组成,在这些Consul节点里面,分为两种角色,Server 以及 Client。
consul节点在启动时可以定义自身角色,client、server两种。
client节点只负责转发外部请求,所有注册到当前节点的服务会被转发到server节点,向server节点进行键值对的读/写,本身是不持久化这些信息,是无状态的;
server节点的职责是使用raft协议保证数据一致性,响应客户端的请求,维护集群状态,与其他数据中心交互,另外所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
节点之间通过gossip广播协议(谣言协议),进行节点之间的数据交互,最终大家达到一致。
consul概念
- Agent: Consul集群中长时间运行的守护进程,以consul agent 命令开始启动. 在客户端和服务端模式下都可以运行,可以运行DNS或者HTTP接口, 它的主要作用是运行时检查和保持服务同步。
- Client: 客户端, 无状态, 以一个极小的消耗将接口请求转发给局域网内的服务端集群.
- Server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
- Datacenter: 数据中心,多数据中心联合工作保证数据存储安全快捷
- Consensus: 一致性协议使用的是Raft Protocol
- RPC: 远程程序通信
- Gossip: 基于 Serf 实现的 gossip 协议,负责成员、失败探测、事件广播等。通过 UDP 实现各个节点之间的消息。分为 LAN 上的和 WAN 上的两种情形。
consul安装及测试安装
linux下安装
(1)进入consul官网找到自己开发平台对应的安装包下载https://www.consul.io/downloads.html
或者wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip
(2)下载完后,解压,得到一个可执行文件consul
(3)将这个文件移动到全局变量环境中
$ sudo mv consul /usr/local/bin/
(4)验证是否安装成功$ consul
window下安装
(1)进入consul官网找到自己开发平台对应的安装包下载https://www.consul.io/downloads.html
(2)下载完后,解压,得到一个可执行文件consul
(3)将这个文件移动到全局变量环境中
(4)启动consul命令:
consul agent -dev -ui -node=cy-dev:该模式不能用于生产环境,因为该模式下不会持久化任何状态,该启动模式仅仅是为了快速便捷的启动单节点consul,-node结点名为cy,-ui可以用界面访问,默认能访问。 测试地址http://localhost:8500
- 节点名称:这是代理的唯一名称。默认情况下,这是机器的主机名,但您可以使用该-node标志对其进行自定义 。
- 数据中心:这是配置代理运行的数据中心。每个节点都必须设置其它向数据中心报告。-datacenter 标志可用于设置数据中心。对于单DC配置,代理将默认为“dc1”。
- 服务器:这表明代理是以服务器还是客户端模式运行。Server: false (bootstrap: false),表示不是以服务器模式运行,事实上-dev是开发服务器模式。
- 客户端地址:这是用于代理的客户端接口的地址。这包括HTTP和DNS接口的端口。默认情况下,它只绑定到localhost。
- 群集地址:这是用于集群中的Consul代理之间通信的地址和端口集。并非所有集群中的Consul代理都必须使用相同的端口,但该地址必须可供所有其他节点访问。
consul agent常用命令解读 .修改默认端口
使用-http-port命令行参数,例如修改成8080端口
consul agent -dev -http-port .公网可访问
使用-client 0.0.0.0
consul agent -dev -http-port -client 0.0.0.0 .查看集群节点信息
consul members
Node Address Status Type Build Protocol DC Segment
n3 127.0.0.0: alive server 1.1. dc1 <all> node:节点名
Address:节点地址
Status:alive表示节点健康
Type:server运行状态是server状态
DC:dc1表示该节点属于DataCenter1 .-data-dir
作用:指定agent储存状态的数据目录,这是所有agent都必须的,对server尤其重要,因为他们必须持久化集群的状态 .-config-dir
作用:指定service的配置文件和检查定义所在的位置。目录必需为consul.d,文件内容都是json格式的数据。配置详解见官方 .-config-file
作用:指定一个要装载的配置文件 .-dev
作用:开发服务器模式,虽然是server模式,但不用于生产环境,因为不会有任何持久化操作,即不会有任何数据写入到磁盘 .-bootstrap-expect
作用: 参数表明该服务运行时最低开始进行选举的节点数,当设置为1时,则意味允许节点为一个时也进行选举;当设置为3时,则等到3台节点同时运行consul并加入到server才能参与选举,选举完集群才能够正常工作。 一般建议服务器结点3-5个。 .-node
作用:指定节点在集群中的名称,该名称在集群中必须是唯一的(默认这是机器的主机名),直接采用机器的IP .-bind
作用:指明节点的IP地址,一般是0.0.0.0或者云服务器内网地址,不能写阿里云外网地址。这是Consul侦听的地址,它必须可以被集群中的所有其他节点访问。虽然绑定地址不是绝对必要的,但最好提供一个。 .-server
作用:指定节点为server,每个数据中心(DC)的server数推荐3-5个。 .-client
作用:指定节点为client,指定客户端接口的绑定地址,包括:HTTP、DNS、RPC
默认是127.0.0.,只允许回环接口访问 .-datacenter
作用:指定机器加入到哪一个数据中心中。老版本叫-dc,-dc已经失效
consul agent常用命令解读
Consul集群
节点或五个server节点组一个集群,为什么是单数,因为集群需要选举一个leader来保证数据一致性。票数要超过半数以上才能选举为leader。
基本的命令为:
consul agent -server -bind=10.0.xx.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1
-server 表示是以服务端身份启动
-bind 表示绑定到哪个ip(有些服务器会绑定多块网卡,可以通过bind参数强制指定绑定的ip)
-client 指定客户端访问的ip(consul有丰富的api接口,这里的客户端指浏览器或调用方),0.0..0表示不限客户端ip
-bootstrap-expect= 表示server集群最低节点数为3,低于这个值将工作不正常(注:类似zookeeper一样,通常集群数为奇数,方便选举,consul采用的是raft算法)
-data-dir 表示指定数据的存放目录(该目录必须存在)
-node 表示节点在web ui中显示的名称
-config-dir 配置文件目录,里面所有以.json结尾的文件都会被加载
启动成功后,终端窗口不要关闭,可以在浏览器里,访问下,类似 http://10.0.xx.55:8500/,正常的话,应该会看到一行文字:Consul Agent。
为了防止终端关闭后,consul退出,可以在刚才命令上,加点东西,将其转入后台运行。类似:
nohup xxx > /dev/null 2>&1 &
现在我们使用四台机器创建集群:
10.0.xx.55、10.0.xx.203、10.0.xx.204、10.0.xx.205
1.启动server端
nohup consul agent -server -bind=10.0.xx. -client=0.0.0.0 -bootstrap-expect= -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1 > /dev/null >& &
nohup consul agent -server -bind=10.0.xx. -client=0.0.0.0 -bootstrap-expect= -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server2 > /dev/null >& &
nohup consul agent -server -bind=10.0.xx. -client=0.0.0.0 -bootstrap-expect= -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server3 > /dev/null >& &
注意更改bind参数的ip,以及node参数里的节点名称
2.启动client端
几乎完全一样,只是把-server 去掉,在10.0.xx.205上运行:
nohup consul agent -client=0.0.0.0 -data-dir=/data/application/consul_data/ -node=client1 -config-dir /etc/consul.d -ui > /dev/null >& &
3.组建cluster
现在我们有了3个server node + 1个client node,但是这4个节点都是相互独立的,可以在任一节点上运行:
consul members
可以看到,只有自身节点的信息。
要让自己加入集群,可以运行以下命令(假设:其它3个节点,都加入10.0.xx.205)
consul join 10.0.xx.205
成功后,会输出:
Successfully joined cluster by contacting 1 nodes.
其它2个节点(指:10.0.xx.205之外的节点)上类似上述操作,都加入集群中,完成后,可以再次验证
可以看到4台节点的信息都有了。
tips: 如果反过来,要将1个节点从集群中撤掉,可以在该节点上运行consul leave 即可。
服务注册/反注册
搭建好conusl集群后,用户或者程序就能到consul中去查询或者注册服务。
可以通过提供服务定义文件或者调用HTTP API来注册一个服务。
1.服务定义文件
在10.0.xx.205的/etc/consul.d/目录下创建一个web.json文件,内容如下:
{
"ID": "nginx1",
"Name": "nginx",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": ,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": “12h",
"HTTP": "http://localhost:5000/health",
"Interval": "1s"
}
}
2.调用HTTP API
postman(或其它rest api工具、curl都行),向 http://10.0.xx.205:8500/v1/agent/service/register ,发送以下json,http method指定为PUT, Content-Type指定为application/json
{
"ID": "nginx1",
"Name": "nginx",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 80,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": “12h",
"HTTP": "http://localhost:5000/health",
"Interval": "1s"
}
}
简单罗列了一下最常用的命令和接口api。 . consul以client和server形式启动 server: nohup /consul/consul agent -ui -config-dir=/consul/config >/consul/consul.log >& & 在/consul/config文件中可指定bind_addr为192.168.0., server属性为true client: nohup /consul/consul agent -ui -config-dir=/consul/config -join=192.168.0.100 > /consul/consul.log >& & . 列出服务: curl http://localhost:8500/v1/agent/members . 添加服务 curl --request PUT --data @test.json http://localhost:8500/v1/agent/service/register test.json文件内容: {
"ID": "nginx1",
"Name": "nginx",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": ,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": “12h",
"HTTP": "http://localhost:5000/health",
"Interval": "1s"
}
}
HTTP + Interval 是其中一种健康检查方式,这一检查默认每30秒向特定url发送一个http get请求,返回码是2XX则表示检查通过,返回429则警告请求数太多,其他则表示失败。 . 删除服务: curl --request PUT http://localhost:8500/v1/agent/service/deregister/nginx1 . 访问发现服务:dns查询 dig安装 yum install bind-utils dns发现服务: dig @127.0.0.1 -p servicename.service.consul DNS查询系统通过健康检查信息防止路由到不健康的节点,当查询完成时,任何在检查中失败的节点都会在结果中被忽略,为了简单的负载均衡,每次返回的节点集也是随机的 . checks健康检查 curl http://localhost:8500/v1/agent/checks 设置此check的状态为passing: curl http://localhost:8500/v1/agent/check/pass/nginx1 . 配置查看 curl http://localhost:8500/v1/kv/commons/test/config?raw
最常用的命令和接口api
refer:
https://cloud.tencent.com/developer/article/1033169
https://www.cnblogs.com/yjmyzz/p/replace-eureka-with-consul.html
微服务 consul使用的更多相关文章
- 微服务Consul系列之服务注册与服务发现
在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...
- .Net Core with 微服务 - Consul 配置中心
上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...
- 微服务~Consul服务注册与发现
服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利 ...
- 微服务Consul系列之服务部署、搭建、使用
使用Consul解决了哪些问题 是否在为不同环境来维护不同项目配置而发愁 是否有因为配置的更改导致代码还要进行修改.发布因为客流量大了还要规避开高峰期等到半夜来发布 微服务架构下应用的分解业务系统与服 ...
- .Net Core with 微服务 - Consul 注册中心
上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...
- 微服务Consul系列之集群搭建
在上一篇中讲解了Consul的安装.部署.基本的使用,使得大家有一个基本的了解,本节开始重点Consul集群搭建,官方推荐3-5台Server,因为在异常处理中,如果出现Leader挂了,只要有超过一 ...
- .Net Core微服务——Consul(4):主从、集群
延续上一篇的话题继续,顺便放上一篇的传送门:点这里. 集群的必要性 consul本身就是管理集群的,现在还需要给consul搞个集群,这是为啥?因为consul单点也容易挂啊!万一管理集群的consu ...
- 使用 Consul 作为 Python 微服务的配置中心
使用 Consul 作为 Python 微服务的配置中心 Consul 作为数据中心,提供了 k/v 存储的功能,我们可以利用这个功能为 Python 微服务提供配置中心. Consul 提供了 HT ...
- .Net Core with 微服务 - Seq 日志聚合
上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心,来实现服务的注册与发现.那么本次我们讲会演示如何做日志聚合.日志聚合比较常用的有 ELK 等,但是这次我想要介绍的是一款比较小众 ...
随机推荐
- 实验:用tcp请求http协议的接口
图示: 开启http服务,浏览器地址,访问测试页面 查看http报文,复制出来 用tcp工具请求测试 http 协议就是这样的,在tcp协议上面做了报文格式处理,连接发送数据后,就自动断开连接 jav ...
- OptimalSolution(3)--链表问题(2)进阶
一.环形单链表的约瑟夫问题 二.判断一个链表是否为回文结构 三.将单向链表按某只划分成左边小.中间相等.右边大的形式 四.复制含有随机指针节点的链表 五.两个单链表相交的一系列问题 六.将单链表的每K ...
- OptimalSolution(2)--二叉树问题(4)子树与拓扑结构
一.判断t1树是否包含t2树全部的拓扑结构 1 / \ 2 3 2 / \ / \ / \ 4 5 6 7 4 5 / \ / / 8 9 10 8 返回:true 解法(O(M×N)):如果t1中某 ...
- 数据结构(四十一)多路查找树(B树)
一.多路查找树的背景 前面所讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对于较大的.存放在外存储器上的文件就不合适了,对于此类大规模的文件,即使是采用了平衡二叉树,在查找效率上仍然较低. ...
- MongoDB一次节点宕机引发的思考(源码剖析)
目录 简介 日志分析 副本集 如何实现 Failover 心跳的实现 electionTimeout 定时器 业务影响评估 参考链接 声明:本文同步发表于 MongoDB 中文社区,传送门: http ...
- django-模板之模板变量(二)
将views中的变量传递给html界面 book/views.py from django.views import View from django.shortcuts import render ...
- Mac tensorflow mnist实例
Mac tensorflow mnist实例 前期主要需要安装好tensorflow的环境,Mac 如果只涉及到CPU的版本,推荐使用pip3,傻瓜式安装,一行命令!代码使用python3. 在此附上 ...
- uWSGI+django+nginx 的工作原理流程与部署历程
一.前言 献给和我一样懵懂中不断汲取知识,进步的人们. 霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光 二.必要的前提 2.1 准备知识 django 一个基于python的开源web框架,请 ...
- [2018-06-28] django项目 实例
实例一.显示一个基本的字符串在网页中 首先先进入views.py def home(request): string = u'随便写' return render(request, 'home.htm ...
- 关于virtualbox虚拟电脑控制台严重错误解决方法。。。
今天的我已经泪崩,忙了一天,临近下班的时候,突然发现虚拟机关了,再打开时,提示错误!!! 然后在网上查方法解决完的时候,再打开一看,完了,虚拟机里面的内容全没了...现将解决方法记录如下: 1.打开, ...