热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务consul使用

前言常见的注册中心有zookeeper、eureka、consul、etcd。从生态发展、便利性、语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩

前言

常见的注册中心有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常用命令解读

1.修改默认端口
使用-http-port命令行参数,例如修改成8080端口
consul agent -dev -http-port 8080

2.公网可访问
使用-client 0.0.0.0 
consul agent -dev -http-port 8080 -client 0.0.0.0

3.查看集群节点信息
consul members
Node  Address         Status  Type    Build  Protocol  DC   Segment
n3    127.0.0.0:8301  alive   server  1.1.0  2         dc1  

node:节点名
Address:节点地址
Status:alive表示节点健康
Type:server运行状态是server状态
DC:dc1表示该节点属于DataCenter1

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

5.-config-dir 
作用:指定service的配置文件和检查定义所在的位置。目录必需为consul.d,文件内容都是json格式的数据。配置详解见官方

6.-config-file 
作用:指定一个要装载的配置文件

7.-dev 
作用:开发服务器模式,虽然是server模式,但不用于生产环境,因为不会有任何持久化操作,即不会有任何数据写入到磁盘

8.-bootstrap-expect 
作用: 参数表明该服务运行时最低开始进行选举的节点数,当设置为1时,则意味允许节点为一个时也进行选举;当设置为3时,则等到3台节点同时运行consul并加入到server才能参与选举,选举完集群才能够正常工作。 一般建议服务器结点3-5个。

9.-node 
作用:指定节点在集群中的名称,该名称在集群中必须是唯一的(默认这是机器的主机名),直接采用机器的IP

10.-bind 
作用:指明节点的IP地址,一般是0.0.0.0或者云服务器内网地址,不能写阿里云外网地址。这是Consul侦听的地址,它必须可以被集群中的所有其他节点访问。虽然绑定地址不是绝对必要的,但最好提供一个。

11.-server 
作用:指定节点为server,每个数据中心(DC)的server数推荐3-5个。

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

13.-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.0表示不限客户端ip
-bootstrap-expect=3 表示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.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1 > /dev/null 2>&1 &
nohup consul agent -server -bind=10.0.xx.203 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server2 > /dev/null 2>&1 &
nohup consul agent -server -bind=10.0.xx.204 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server3 > /dev/null 2>&1 &

注意更改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 2>&1 &

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": 80,
    "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。

1. consul以client和server形式启动

 server:  

       nohup /consul/consul agent -ui -config-dir=/consul/config 1>/consul/consul.log 2>&1 &/consul/config文件中可指定bind_addr为192.168.0.100, server属性为true

   client: 

       nohup /consul/consul agent -ui -config-dir=/consul/config -join=192.168.0.100 > /consul/consul.log 2>&1 &

2. 列出服务:

    curl  http://localhost:8500/v1/agent/members

3. 添加服务

    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": 80,
    "EnableTagOverride": false,
    "Check": {
    "DeregisterCriticalServiceAfter": “12h",
    "HTTP": "http://localhost:5000/health",
    "Interval": "1s"
    }
    }
HTTP + Interval 是其中一种健康检查方式,这一检查默认每30秒向特定url发送一个http get请求,返回码是2XX则表示检查通过,返回429则警告请求数太多,其他则表示失败。

4. 删除服务:

    curl  --request PUT  http://localhost:8500/v1/agent/service/deregister/nginx1

5. 访问发现服务:dns查询

   dig安装

   yum install bind-utils

   dns发现服务:

       dig @127.0.0.1 -p 8600 servicename.service.consul

   DNS查询系统通过健康检查信息防止路由到不健康的节点,当查询完成时,任何在检查中失败的节点都会在结果中被忽略,为了简单的负载均衡,每次返回的节点集也是随机的

6. checks健康检查

    curl  http://localhost:8500/v1/agent/checks

    设置此check的状态为passing:

    curl http://localhost:8500/v1/agent/check/pass/nginx1

7. 配置查看

    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使用


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
dgsfdg3t4543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有