consul 是一个用来做服务发现的框架,具有分布式、高可用以及可横向扩展的特性

什么是服务发现?为什么要实现服务发现?

举个常见的例子:

假设有一台 client 想要实现不同的业务,就需要调用接口去访问后端的server

那这样 client 就需要知道后端 server 的网络配置,通常是将 server 的网络配置写到 client 配置文件中

 

这样就会出现几个问题:

  1. 后面如果新增后端 server,就需要将新配置写进 client 本地上,导致后期配置文件越来越多,不便于维护

  2. 一旦后端某一服务的网络配置发生变化,需要修改 client 的配置

  3. 一旦后端某一服务出现故障,需要人工剔除配置项

为此,我们需要引入一个中间件来给 client 和 server 之间解耦,client 不需要关心后端 server 的配置,当需要实现某一业务的时候,只需要去服务发现中间件上面去获取到对应 server 的网络配置即可

初识 consul

Consul 是 HashiCorp 公司推出的开源工具,由 go 语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,非常轻量,用于实现分布式系统的服务发现与配置的解决方案

常用的服务发现框架有:zookeeper、 etcd、Consul

consul 的一些特性:

  • 服务发现

    • Consul 提供了通过 DNS 或者 HTTP 接口的方式来注册服务和发现服务

    • 一些外部的服务通过 Consul 找到它所依赖的服务

  • 健康检查

    • Consul 的 Client 可以提供任意数量的健康检查,既可以与业务相关联(是否返回200 状态码)也可以与本地节点相关联(cpu 使用率等)

  • KV 存储

    • Consul 提供了简单的http接口,可以实现动态配置、功能标记、领袖选举等功能

  • 安全服务通信

    • 可以为服务生成和分发 TLS 证书,以便建立 TLS 连接

  • 多数据中心

    • consul 集群由多个 server 和 client 组成,所有的服务都可以注册到这些节点上

简单部署

consul 安装

下载后可以发现 consul 就是一个可执行的二进制文件

为了简单起见,我们现在将以开发模式启动 Consul 代理。这种模式对于快速简单地启动单节点 Consul 环境非常有用

我们现在单机简单部署一下consul

#开发模式启动consul agnet
consul agent -dev -client=0.0.0.0

执行上面这条命令之后,consul 会被启动起来,并且占用终端

加上 -client=0.0.0.0 参数是让我们能够通过本地浏览器来访问 consul 提供的 http 接口(即 consul 能够对外提供服务)

 

注册服务

接下来我们将简单注册一个服务并在 web 界面上实现健康检查

这是官方文档给出的一个注册服务的配置示例:

编写一个服务定义配置文件,假设有一个名为 web 的服务在端口 80 上运行

ctrl+c 终止掉 consul 服务,重启 consul

  • 查询服务

一旦 consul 启动,我们可以通过 HTTP API 方式来查询

即使用  /v1/catalog/service/{name}  查询

还可以,通过浏览器访问 consul web界面去查看

可以看到 web 服务已经注册上去了

自带健康检查功能

k-v 操作

除了提供服务发现和健康检查之外,consul 还支持 kv 存储

通过 kv 存储,可以实现动态配置保存、修改等功能

举个例子

有一台 server 提供 web 服务,它将网络配置信息以键值对形式保存到 consul 上

当 client 需要去调用这个 web 服务的时候,就去 consul 上面找到相关的 key 然后获取对应的 value

而当 server 的网络配置发生变化时,可以在 consul 上面直接修改 value

如上图所示,key 为 webserver,value 为 ip 和 port,以 YAML 的形式保存

consul 上面的 value 有多种形式(JSON、HCL、XML、YAML)

一般我们对 kv 的操作有两种方式:

  1. 通过命令行来操作(CLI API)

  2. 通过 consul 提供的 web 界面(HTTP API)来操作

使用 CLI API 操作 key/value

consul 命令操作 kv 文档:

https://developer.hashicorp.com/consul/commands/kv

#语法:
consul kv put

我们想新增一个叫做 webserver 的 key,它的 value 如下:

ip=1.1.1.1
port=80

查看发现没有 webserver 这个 key

我们添加一下

#语法
consul kv delete

假设我们提供 web 服务的 server 发生故障了,需要在 consul 上面删掉它的配置

假设你某一个 key 对应有多个value,如果修改 value 的话是全部修改的,不能说修改 value 中的某一个值

举个例子,我想修改 webserver 中的 port,将其改成100

我只能全部修改,不能单独改 port 字段

有一种比较好的方法,就是使用 import 和 export 参数

第一步:我们先将当前的 kv 导出到本地来做备份

 

第二步:将新配置文件 import 上去

#语法
consul kv get

查看指定 key

查看指定 key 的详细信息

递归列出所有的 key 以及对应的 value

 

递归列出所有的 key

使用HTTP API操作key/value

使用浏览器访问 ip:8500 即可进入 consul web 界面

然后鼠标点点点就行了,本文不过多介绍

 

《consul 简易上手指南》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Codeforces Round #700 (Div. 2) A~C题解

    写在前边 链接:Codeforces Round #699 (Div. 2) A. Yet Another String Game 链接:A题链接 题目大意: 给定一个字符串,有两位同学来操作这个字符 ...

  2. 随机森林(Random Forest)--- 转载

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  3. 基于OpenAi通用特定领域的智能语音小助手

    无穷尽的Q&A 钉钉...钉钉... 双双同学刚到工位,报销答疑群的消息就万马纷沓而来.她只能咧嘴无奈的摇摇头.水都还没有喝一口就开始"人工智能"的去回复.原本很阳光心情开 ...

  4. Android学习day03【跑马灯】

    这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...

  5. SpringBoot实战项目:蚂蚁爱购(从零开发)

    ​ 简介 这是从零开发的SpringBoot实战项目,名字叫蚂蚁爱购. 从零开发项目,视频加文档,十天彻底掌握开发SpringBoot项目. 教程路线是:搭建环境=> 安装软件=> 创建项 ...

  6. [ARC169E] Avoid Boring Matches

    题解链接 非常厉害的一道题. 考虑无解是什么情况? R 的个数超过 \(2^{n-1}\) 先考虑如何判定.从前往后考虑,如果遇到一个 B,那么如果后面有 R,就选最靠前的 R,否则选最靠后的一个 B ...

  7. JS对后端响应的long类型数据处理精度丢失问题

    1.数据库的数据 2.前端拿到的数据 前端帮我们进行四舍五入了,这并不是我想要的 3.解决办法 把后端响应的数据long类型转成string类型,可以使用Stream流的方式或者for循环的方式,对响 ...

  8. 内核模块(.ko) 开发入门

    内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能.内核模块通常用于为操作系统添加新的设备驱动程序.文件系统.网络协议栈等功能. 内核模块是以二进制形式存在的(*.ko ...

  9. X2加密的PcbDoc类型导出内容有误,不加密的PcbDoc导出的表格正常

    出现该类问题说明读取PcbDoc文件文件出了文件,加密类型添加tmp类型即可

  10. 【C#】【IO】【实例】统计多个文件夹下的图片

    因工作需要繁琐的进行同一目录多个文件夹下的图片统计,便使用代码来解决. 需求:统计的是多少个文件夹包含了图片,并非是统计有多少张图. 我们先用Python来创建一个现场环境(巩固巩固py知识): 1 ...