基于Golang的微服务——Consul

4,477 阅读5分钟

这系列文章很基础,主要给想尝试后端技术栈的前端看的,后端大佬别看了,很可能浪费你的时间。

虽然我更擅长写前端相关的知识点总结文章,但是也阻止不了我对后端技术的向往啊,后端相关的文章质量不会高,主要目的是为了记录自己的学习历程,也是希望把自己的短板和缺点暴露出来,跟小伙伴们一起成长。

初衷

学习Go很大一个原因是因为想尝试写微服务,于是在探索Go构建微服务的道路上越走越远,甚至有些求快和焦躁了,但是在成长就行。

Consul 是什么?

首先奉上中文文档Consul.

Consul由多个模块组成,是一个为基础设施提供服务发现和服务配置的工具。当用微服务架构时,传统的单体应用全部拆分为了细粒度的功能模块,这些模块就是微服务,他们可以拥有自己独立的数据库,遵循单一职责原则,可以独立部署。减少系统之间的耦合。那这么多的微服务之间怎么相互调用和发现呢?就可以借助consul来集中注册管理来。

  • 服务发现: Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现(依赖的是Http / DNS)一个指定服务的提供者。
  • 健康检查: 避免将流量发送到不健康的主机。
  • Key/Value存储 可以理解为简易的数据库,可以完成动态配置,功能标记,协调,领袖选举等功能。
  • 多数据中心 可以将项目部署拓展到多个数据中心。

运行原理

每个服务节点(这个节点可以理解为一个服务器或者一个容器)都运行了一个Consul agent。这个agent是负责对节点自身和节点上的服务进行健康检查的。consul 可以用两种模式运行 server 和 client ,其中 server模式是以集群的方式运行的,最少建议 3-5台服务器/容器。每个数据中心(可以是多个服务器节点 / 容器的集合)至少必须拥有一台server。

consul agent -dev
consul members

可以启动 consul,然后查看当前集群的成员

也可以通过Http 和 DNS 的方式查询集群信息

curl localhost:8500/v1/catalog/nodes

dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul

服务注册

服务注册有两种方式:

  • 服务定义文件
  • 调用HTTP API注册

为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件。

sudo mkdir /etc/consul.d 

// 写入配置
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
    >/etc/consul.d/web.json
    
// Consul服务重启
consul agent -dev -config-dir /etc/consul.d

.d 后缀意思是这个路径包含了一组配置文件.

服务查询

一旦agent启动并且服务同步了.我们可以通过DNS或者HTTP的API来查询服务. 在DNS API中,服务的DNS名字是 NAME.service.consul NAME是服务的名称

对于我们上面注册的Web服务.它的域名是 web.service.consul

dig @127.0.0.1 -p 8600 web.service.consul
// 会返回一个A记录返回了一个可用的服务所在的节点的IP地址

dig @127.0.0.1 -p 8600 web.service.consul SRV
//接收包含 地址,服务节点和端口的 SRV记录

curl http://localhost:8500/v1/catalog/service/web
// 通过 Http API 方式查询

更新服务

服务定义可以通过配置文件并发送SIGHUP给agent来进行更新.这样你可以让你在不关闭服务或者保持服务请求可用的情况下进行更新. 另外 HTTP API可以用来动态的添加,移除和修改服务.

拓展集群

将Consul 拓展成面向生成环境,拥有多个成员的服务发现架构。 当一个agent启动时。他是孤立的,通过与存在的集群成员沟通来发现其他成员。 Consul agent可以加入任何agent而不只是出于server模式的agent

  • 每个集群中的节点都必须要一个唯一的名字.Consul默认会使用机器的hostname.我们 可以使用-node手动覆盖他.

  • 我们也可以使用-bind指定一个绑定的地址让Consul在这个地址上进行监听,这个地址必须可以被其他集群成员访问到

consul agent -server -bootstrap-expect 1  -data-dir /tmp/consul -node=hdp2 -bind=10.0.0.52  -config-dir /etc/consul.d

参数介绍:

  • -server : 告诉consul agent节点将扮演集群的唯一server
  • -bootstrap-expect : 提示Consul我们期待加入的server节点的数量
  • -config-dir : 指定服务和健康检查定义文件存放的路径
  • -node : 覆盖默认的节点名称
  • -bind : 绑定一个固定地址
  • -data-dir : 为agent存储状态提供了一个数据目录
consul join 10.0.0.53
// 当前agent加入 10.0.0.53 agent

节点查询

就像查询服务一样.Consul有一个API用来查询节点自己.你可以通过DNS和HTTP的API来进行.

DNS API中节点名称结构为 NAME.node.consul或者NAME.node.DATACENTER.consul.如果数据中心名字省略,Consul只会查询本地数据中心.

dig @127.0.0.1 -p 8600 hdp3.node.consul

退出集群

离开集群,你可以Ctrl-C优雅的退出,也可以直接Kill掉agent进程.优雅的退出可以让节点转变为离开状态.否则节点将被标记为失败.

定义检查

和服务类似,一个检查可以通过检查定义或HTTP API请求来注册. 我们将使用和检查定义来注册检查.和服务类似,因为这是建立检查最常用的方式.

echo '{"check": {"name": "ping",
  "script": "ping -c1 163.com >/dev/null", "interval": "30s"}}' \
  >/etc/consul.d/ping.json

// 健康检查的 HTTP API 方式
curl http://localhost:8500/v1/health/state/critical

重启agent或者发送SIGHUP信号,就可以看到日志输出。

启动web界面

consul agent -ui

http://localhost:8500/ui 

未完待续。。。 好像很久没更新之前写的前端文章了。。。我的错