服务发现之consul

2019-05-08  本文已影响0人  听天不由命

什么是服务发现

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

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

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

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


consul简介

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

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
[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了

[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
[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
}
]
上一篇 下一篇

猜你喜欢

热点阅读