服务发现之consul

什么是服务发现

服务发现有三个角色,服务提供者,服务消费者,服务中介。服务中介是联系服务提供者和服务消费者的桥梁。服务提供者将自己提供的服务地址注册到服务中介,服务消费者从服务中介那里查找自己想要的服务地址,然后使用这个服务

为什么需要服务发现呢,服务发现解决了什么问题呢?

在微服务架构中,一个大的系统被拆分成许多小的微服务,各微服务之间经常会相互调用,如服务A调用服务B的接口,必须要需要知道服务B网络位置,一个可行的做法是简各微服务的网络位置配置在配置文件中,或者有些配置在数据库中,但是这样会存在如下问题

  • 需要配置N个服务的网络位置,加大配置的复杂性
  • 服务的网络位置变化,都需要改变每个调用者的配置
  • 集群的情况下,难以做负载(反向代理的方式除外)

但是如果有了服务发现机制,所有的服务都将自己的网络位置向服务中介中注册(如下图所示)这样服务消费者需要调用某个服务提供者的服务的时候就只需要访问服务中介获取服务提供者的网络位置,然后就可以访问服务提供者提供的服务了,实现了服务提供者和服务消费者之间的解耦。


consul简介

consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。

  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。

  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。

  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。



    首先看一张官网上的图片,可以看出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安装部署

这里主要介绍以容器的方式在单节点上安装部署consul

  • 拉取镜像
[root@izwz98qymta5zk0d5fw0mhz ~]# docker pull consul #官方镜像,不指定tag就拉取last
  • 查看镜像
[root@izwz98qymta5zk0d5fw0mhz ~]# docker images |grep consul
docker.io/consul    latest              9c9974471250        10 days ago         108 MB
  • 启动consul
    • 启动节点1
[root@izwz98qymta5zk0d5fw0mhz ~]# docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 
consul agent -server -bind=172.17.0.2  -bootstrap-expect=3 -node=node1

-node:节点的名称
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址
-server:这个就是表示这个节点是个SERVER
-bootstrap-expect:这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了

    • 启动节点2,3(server模式)
[root@izwz98qymta5zk0d5fw0mhz ~]# docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server 
-bind=172.17.0.3  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node2

[root@izwz98qymta5zk0d5fw0mhz ~]# docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server
 -bind=172.17.0.4  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node3 -client=172.17.0.4
    • 启动节点4(client模式)
[root@izwz98qymta5zk0d5fw0mhz ~]# docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent
 -bind=172.17.0.5 -retry-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node4

没有-server说明这个节点是CLIENT

  • 查看下集群的状态
[root@izwz98qymta5zk0d5fw0mhz ~]# docker exec -t node1 consul members

Node   Address          Status  Type    Build  Protocol  DC   Segment
node1  172.17.0.2:8301  alive   server  1.4.4  2         dc1  <all>
node2  172.17.0.3:8301  alive   server  1.4.4  2         dc1  <all>
node3  172.17.0.4:8301  alive   server  1.4.4  2         dc1  <all>
node4  172.17.0.5:8301  alive   client  1.4.4  2         dc1  <default>

4个节点都列出来了。Status表示它们的状态,都是alive。Type表示它们的类型,三个SERVER一个CLIENT,和我们之前启动的一样。DC表示数据中心,都是dc1
查看leader节点

[root@izwz98qymta5zk0d5fw0mhz ~]# curl http://172.17.0.4:8500/v1/status/leader
"172.17.0.4:8300"

172.17.0.4 就是 node3节点的IP

consul使用

[root@izwz98qymta5zk0d5fw0mhz ~]# curl http://172.17.0.4:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
>   "ID": "userServiceId",  
>   "Name": "userService",
>   "Tags": [
>     "primary",
>     "v1"
>   ],
>   "Address": "127.0.0.1",
>   "Port": 8000,
>   "EnableTagOverride": false,
>   "Check": {
>     "DeregisterCriticalServiceAfter": "90m",
>     "HTTP": "http://www.baidu.com",
>     "Interval": "10s"
>   }
> }'
HTTP/1.1 200 OK
Vary: Accept-Encoding
Date: Wed, 08 May 2019 14:57:41 GMT
Content-Length: 0
  • 发现服务
[root@izwz98qymta5zk0d5fw0mhz ~]# curl http://172.17.0.4:8500/v1/catalog/service/userService
[{"ID":"009522ae-2d44-4032-9b7b-14171cada26b",
"Node":"node3",
"Address":"172.17.0.4",
"Datacenter":"dc1",
"TaggedAddresses{"lan":"172.17.0.4",
"wan":"172.17.0.4"},
"NodeMeta":{"consul-network-segment":""
},
"ServiceKind":"",
"ServiceID":"userServiceId",
"ServiceName":"userService",
"ServiceTags":["primary","v1"],
"ServiceAddress":"127.0.0.1",
"ServiceWeights":{
"Passing":1,
"Warning":1
},
"ServiceMeta{},
"ServicePort":8000,
"ServiceEnableTagOverride":false,
"ServiceProxyDestination":"",
"ServiceProxy":{},
"ServiceConnect":{},
"CreateIndex":88,
"ModifyIndex":88
}
]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容