什么是服务发现
在微服务的框架中,服务发现是一个重要的模块及组成部分,了解微服务的同学应该都知道它的重要性,我们这里就来简单的了解下,先来看一张图:
从图中看,客户端需要调用服务A,B,C,客户端必须要知道所有服务的网络位置(服务的ip和端口),以前的做法大多都是配置在配置文件中,或者配置在数据中,这就带来了几个问题:
从图中看,客户端需要调用服务A,B,C,客户端必须要知道所有服务的网络位置(服务的ip和端口),以前的做法大多都是配置在配置文件中,或者配置在数据中,这就带来了几个问题:
既然有这些问题,那么服务发现是如何解决的?,在看一张图:
与之前一张不同的是,加了个服务发现模块(图比较简单)。服务A\B\C把自己的网络位置信息注册到服务发现模块,服务发现模块以key和value的方式存储,key一般是服务名称,value是注册的网络信息。服务发现模块会定时轮询检查服务状态(健康检查)。客户端在调用服务的时候,就从服务发现模块中取网络信息,然后在调用服务。(这是简单大体的过程,当然服务发现远远没这么简单里面包含的东西还很多)
服务发现与注册常用的都有那些?
Zookeeper
Etcd
Consul
Eureka
Consul优势
使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
支持健康检查. etcd 不提供此功能.
支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
官方提供web管理界面, etcd 无此功能.
Consul和Etcd都是Go语言开发,应用场景及性能也各有优势,这里我们先介绍下Consul,其他有需要的同学可自行谷歌百度。
Consul简介
Consul是一个服务管理软件(服务发现与注册),使用Go语言开发,支持HTTP API,支持多数据中心,分布式高可用的服务发现和配置共享,主持健康检查,允许存储键值对。采用RAFT一致性算法(保证服务的高可用),成员管理和消息广播采用GOSSIP协议,支持ACL访问控制。
什么是服务注册?
一个服务将其位置信息在“中心注册节点”注册的过程,该服务一般将它的主机IP地址和端口进行注册,有时也会有服务访问的认证信息,使用协议、版本号及其他信息。
什么事服务发现?
服务发现可以让一个应用或者组件发现其运行环境以及其他应用或组件信息。用户配置一个服务发现工具就可以将实际容器跟运行配置分离开。
应用场景
Consul架构
此图是我们从Consul官网获取的。
官网地址:https://www.consul.io/docs/internals/architecture.html
我们这里只看一个数据中心(1),可以看出Consul集群是由多个SERVER和多个CLIENT组成,而不管是SERVER还是CLIENT都是一个Consul节点,所有的服务都可以注册到这个节点上。
CLIENT
表示Consul的client的模式(客户端模式),这种模式下所有注册到当前节点的服务会被转发到SERVER上,本身是不做持久化操作的。
SERVER
表示Consul的server模式(SERVER模式),这种模式下功能和CLIENT基本一样,唯一不同的是它会持久化信息到本地。
SERVER-LEADER
Server的leader(领导者),和其他的SERVER不一样它需要负责同步注册的信息到其他SERVER是集群沟通桥梁,同时负责各节点的健康检查
Consul的安装
我们这里选择二进制安装(解压就可以用)
官网下载地址(选择系统类型):https://www.consul.io/downloads.html
启动Consul(server模式)
./consul agent -node=node1 -server -bind=192.168.8.152 -bootstrap-expect 3 -data-dir /tmp/consul
./consul agent -node=node2 -server -bind=192.168.8.153 -join=192.168.8.152 -node-id=$(uuidgen | awk '{print tolower($0)}') -data-dir ./data/node2
./consul agent -node=node3 -server -bind=192.168.8.154 -join=192.168.8.152 -node-id=$(uuidgen | awk '{print tolower($0)}') -data-dir ./data/node3 -client=192.168.8.154
-join:加入到集群
-node-id:指定唯一的节点ID
-client:注册或查询等操作对应的IP,默认是127.0.0.1
启动Consul(client模式)
./consul agent -node=node4 -bind=192.168.8.155 -retry-join=192.168.8.152 -node-id=$(uuidgen | awk '{print tolower($0)}') -data-dir ./data/node5
查看集群状态
节点异常处理
leader挂了,consul会重新选择leader(必须有二分之一的SERVER机器存活),server挂了,只要有二分之一的机器存活将不会影响服务。
使用,注册服务(使用HTTP API)
API 接口官网文档:https://www.consul.io/api/agent/service.html
curl -XPUT -i -H "Content-Type:application/json" -d '
{
"ID": "test01",
"Name": "testservice",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 8000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.qq.com",
"Interval": "10s"
}
}
'
使用,服务发现(使用HTTP API)
curl http://192.168.8.154:8500/v1/catalog/service/testservice
[
{
"Address": "192.168.8.154",
"CreateIndex": 202,
"Datacenter": "dc1",
"ID": "dcb3d061-5f5b-337b-a6b8-377a5eb7ae86",
"ModifyIndex": 202,
"Node": "node1",
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceAddress": "127.0.0.1",
"ServiceConnect": {
"Native": false,
"Proxy": null
},
"ServiceEnableTagOverride": false,
"ServiceID": "test01",
"ServiceKind": "",
"ServiceMeta": {},
"ServiceName": "testservice",
"ServicePort": 8000,
"ServiceProxyDestination": "",
"ServiceTags": [
"primary",
"v1"
],
"TaggedAddresses": {
"lan": "192.168.8.154",
"wan": "192.168.8.154"
}
}
]
服务的名称:testservice
服务的地址:127.0.0.1
服务的端口:8000
存储K/V
查看所有K/V
curl -v http://localhost:8500/v1/kv/?recurse
写入
./consul kv put test/config/a 5
或
curl -X PUT -d '10' http://localhost:8500/v1/kv/web/key1
读取
./consul kv get test/config/a
./consul kv get -detailed test/config/a #可查详情
删除
curl -X DELETE http://localhost:8500/v1/kv/web/key1?recurse
更新
curl -X PUT -d '20' http://localhost:8500/v1/kv/web/key1
总结
Consul服务发现及配置共享简单的展示了下,当然还有很多的功能还需要更加深入的学习和实践。这里只是简单的理解和使用Consul。