微服务之 consul
今天,刚刚复习了一下,今天给大家分享下 consul 的搭建和相关使用!
首先,使用之前我们要知道 consul 是什么,干什么用的?
一、概述
consul 是 google 开源的一个使用 go 语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行 agent,他有两种运行模式 server 和 client。每个数据中心官方建议需要 3 或 5 个 server 节点以保证数据安全,同时保证 server-leader 的选举能够正确的进行。
如果熟悉 zk 的同学应该对 consul 的相关的操作很快可以上手。
其实我们常用的就是用来做服务发现:
带着问题来学习,什么是服务发现?
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
图中,客户端的一个接口,需要调用服务 A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:
需要配置 N 个服务的网络位置,加大配置的复杂性
服务的网络位置变化,都需要改变每个调用者的配置
集群的情况下,难以做负载(反向代理的方式除外)
总结起来一句话:服务多了,配置很麻烦,问题多多
既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图
与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务 A-N 把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以 K-V 的方式记录下,K 一般是服务名,V 就是 IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务 A-N 的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
这个过程大体是这样,当然服务发现模块没这么简单。里面包含的东西还很多。这样表述只是方便理解。
图中的服务发现模块基本上就是微服务架构中服务发现的作用了。
consul 简介
做服务发现的框架常用的有
zookeeper
eureka
etcd
consul
这里就不比较哪个好哪个差了,需要的童鞋自己谷歌百度。
那么 consul 是啥?consul 就是提供服务发现的工具。然后下面是简单的介绍:
consul 是分布式的、高可用、横向扩展的。consul 提供的一些关键特性:
我们这里会介绍服务发现,健康检查,还有一些基本 KV 存储。多数据中心有机会另一篇文章再说。
总结:只要知道它是解决我上一部分提出的问题就行,其它的东西慢慢理解
consul 的几个概念
上图是从 consul 官方文档抠出来的。
我们只看数据中心 1,可以看出 consul 的集群是由 N 个 SERVER,加上 M 个 CLIENT 组成的。而不管是 SERVER 还是 CLIENT,都是 consul 的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。
CLIENT
CLIENT 表示 consul 的 client 模式,就是客户端模式。是 consul 节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到 SERVER,本身是不持久化这些信息。
SERVER
SERVER 表示 consul 的 server 模式,表明这个 consul 是个 server,这种模式下,功能和 CLIENT 都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
SERVER-LEADER
中间那个 SERVER 下面有 LEADER 的字眼,表明这个 SERVER 是它们的老大,它和其它 SERVER 不一样的一点是,它需要负责同步注册的信息给其它的 SERVER,同时也要负责各个节点的健康监测。
其它信息
其它信息包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决。这些有兴趣的自己看看官方文档。
consul 基本使用
自己就一台机子,所以这里就演示下 docker 下部署使用 consul。容器与宿主机的端口映射忽略,正常生产环境每个宿主机一个 consul,端口需要映射到宿主机
二、consul 集群搭建
1)安装
首先去官网现在合适的 consul 包:https://www.consul.io/downloads.html
安装直接下载 zip 包,解压后只有一个可执行的文件 consul,将 consul 添加到系统的环境变量里面。
#unzip consul_1.2.3_linux_amd64.zip
#cp -a consul /usr/bin
#consul
输入 consul,出现上面的内容证明安装成功。
2)启动
consul 必须启动 agent 才能使用,有两种启动模式 server 和 client,还有一个官方自带的 ui。server 用与持久化服务信息,集群官方建议 3 或 5 个节点。client 只用与于 server 交互。ui 可以查看集群情况的。
server:
cn1:
#consul agent -bootstrap-expect 2 -server -data-dir /data/consul0 -node=cn1 -bind=192.168.1.202 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1
cn2:
#consul agent -server -data-dir /data/consul0 -node=cn2 -bind=192.168.1.201 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
cn3:
#consul agent -server -data-dir /data/consul0 -node=cn3 -bind=192.168.1.200 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
参数解释:
-bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举 leader。
-server: 运行在 server 模式
-data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
-node:指定节点的名称
-bind:为该节点绑定一个地址
-config-dir:指定配置文件,定义服务的,默认所有一.json 结尾的文件都会读
-enable-script-checks=true:设置检查服务为可用
-datacenter: 数据中心没名称,
-join:加入到已有的集群中
client:
#consul agent -data-dir /data/consul0 -node=cn4 -bind=192.168.1.199 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
client 节点可以有多个,自己根据服务指定即可。
ui:
#consul agent -ui -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -client 192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
-ui:使用自带的 ui,
-ui-dir:指定 ui 的目录,使用自己定义的 ui
-client:指定 web ui、的监听地址,默认 127.0.0.1 只能本机访问。
集群创建完成后:
使用一些常用的命令检查集群的状态:
#consul info
可以在 raft:stat 看到此节点的状态是 Fllower 或者 leader
新加入一个节点有几种方式;
1、这种方式,重启后不会自动加入集群
2、#在启动的时候使用-join 指定一个集群
3、使用-startjoin 或-rejoin
访问 ui:
端口:
8300:consul agent 服务 relplaction、rpc(client-server)
8301:lan gossip
8302:wan gossip
8500:http api 端口
8600:DNS 服务端口
3)服务注册
采用的是配置文件的方式,(官方推荐)首先创建一个目录用于存放定义服务的配置文件
#mkdir /etc/consul.d/
启动服务的时候要使用-config-dir 参数指定。
下面给出一个服务定义:
#cat web.json
如果这样启动 consul 后,会发现 consul 的日志里面一直报错,因为我们没有启动 80 端口的服务,下面给出 go 写的一个程序:
#需要一个 goalong 的环境:
此时就可以在没有运行 web 服务的机器上面执行 DNS 查询:
可以看到服务已经注册到集群里面了。
使用 dns 查询,默认域名格式 NAME.service.consul,NAME 就是 web.json 里面定义的 service 的 name。可以自己指定域和端口:-domain、-dns-port 53
为了方便使用 consul 集群的注册使用,所以写了一个三节点 client 的注册脚本,方便统一注册服务和管理。还利用到了 nfs,将服务文件共享到集群。
hosts 是 client 节点列表。可以只注册其中的一个节点,输入 hosts 中对应的 key,也可以输入 all,注册到所有节点;nfs 共享的是/etc/consul.d 目录。
4)健康检查
check 使用来做服务的健康检查的,可以拥有多个,也可以不使用支持多种方式检查。check 必须是 script 或者 TTL 类型,如果是 TTL 类型则 ttl 变量必须被提供。script 是 consul 主动去检查服务的健康状况,ttl 是服务主动向 consul 报告自己的状况。新版本的 consul 不在使用 script 来表示,使用 args,如果是 https 服务的健康检查,可以使用 args 这种脚本的方式实现,因为 consul 默认不支持 https 的健康检查。
三、更新 consul 版本为最新版本 1.2.3.
版本更新特性:
https://github.com/hashicorp/consul/blob/v1.2.3/CHANGELOG.md
ui 较之前有很大改变:
文章有点长,大家慢慢看
版权声明: 本文为 InfoQ 作者【迷彩】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb59000ae5712a2dbd0283b86】。文章转载请联系作者。
评论