其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,
以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。
比如说一个数据集群中,可以分为读节点或者写节点,写节点和读节点都是相对的,不是硬绑定的,某一个逻辑节点,随着故障转移及恢复,是可以变换身份的(写变读,读变写;主降从,从升主等等)
集群对外提供服务的时候,对于外界来说,集群中节点身份变换的时候需要对外透明,外界无需因为集群节点的身份变换而更改配置,这就需要一个解耦合的服务。
Consul,zookeeper等中间件,就是做这个透明转换的,也就是服务发现。这里简单测试consul作为服务发现的实现。
Consul是一种服务解耦解决方案(service mesh solution,纠结了好久不知道怎么翻译),提供具有服务发现,配置和分段功能的全功能控制系统(control plane)。
这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务解耦。 即便是用了谷歌翻译的情况下,这段翻译纠结了半天,不知道怎么翻译合适。
如下是按照自己对consul做服务发现的理解,简单整理的逻辑结构图,其原理还是比较容易理解的。
Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation functionality. Each of these features can be used individually as needed, or they can be used together to build a full service mesh. Consul requires a data plane and supports both a proxy and native integration model. Consul ships with a simple built-in proxy so that everything works out of the box, but also supports 3rd party proxy integrations such as Envoy. https://www.consul.io/intro/index.html
它提供如下几个关键功能:
服务发现:
Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。
使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
健康检查:
Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。
这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
键值存储:
应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
多数据中心:
Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。
Consul被设计为对DevOps群体和应用开发者友好,他非常适合现代的、可伸缩的基础设施。
本文基于docker来实现consul的服务发现配置,方法consul agent是通过json注册的模式实现服务注册,
其中consul的服务端是3节点的集群,客户点是6节点3主3从的redis服务器集群,consul实现redis集群中读写服务注册于发现。
尽管Redis cluster有多IP方式驱动连接,这里仅仅为了测试“服务发现”的。
其实本来想测试MySQL单主模式的MGR,实现读写分离的服务发现,但是MySQL有点太重了,机器配置不够,所以做了Redis的集群来测试服务发现
consul服务端集群安装配置
作为服务发现的载体,consul是可以使用单节点运行的,作为解析服务的载体,是一个非常重要的角色,集群化具有更强的抗灾性,因此更多的时候是以多节点集群的方式运行解析服务的这个载体。
这里使用三个节点作为consul的集群服务端来运行,三个consul的服务节点IP分别是:172.18.0.11 ,172.18.0.12,172.18.0.13,需要固定IP
docker network create --subnet=172.18.0.11/16 mynetwork
docker run -itd --name consul01 --net mynetwork --ip 172.18.0.11 -v /usr/local/docker_file/consul01/:/usr/local/ CentOS
docker run -itd --name consul02 --net mynetwork --ip 172.18.0.12 -v /usr/local/docker_file/consul02/:/usr/local/ centos
docker run -itd --name consul03 --net mynetwork --ip 172.18.0.13 -v /usr/local/docker_file/consul03/:/usr/local/ centos
分别在每个容器中创建consul服务(unzip consul_1.6.2_linux_amd64.zip解压缩即可,非常简单)
三个容器节点的server.json节点配置文件如下,唯一的区别就是bind_addr指定为当前节点的IP
如下是172.18.0.11节点的配置,不同节点仅需修改bind_addr为对应机器(容器)的IP