服务注册发现Consul起步

243 阅读4分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。 服务注册发现Consul起步

一、consul介绍

1.consul是什么

consul是提供服务发现、简单配置管理、分区部署的服务注册发现解决方案。主要特性:

服务发现

健康检查

基于Key-Value的配置

支持TLS安全通讯

支持多数据中心部署

  1. consul架构

image.png

  1. 和其它服务发现软件对比

参见官网www.consul.io/intro/vs/in… 

  1. 相关重要概念

consul的实例叫agent

agent有两种运行模式:server和client

每个数据中心至少要有一个server,一般推荐3-5个server(避免单点故障)

client模式agent是一个轻量级进程,执行健康检查,转发查询请求到server。

服务service是注册到consul的外部应用,比如spring web server

 

二、实战

  1. 安装

我们采用consul镜像来玩转consul(这就是容器的好处,不用安装,直接用,笔者写文章时最新版本1.2.2)

docker pull consul:1.2.2

 

  1. 启动consul server1
docker run --name consul1 -d -p 8501:8500 consul:1.2.2 agent -server -bootstrap -ui -bind=0.0.0.0 -client=0.0.0.0

注:

8500 http端口,用于http接口和web ui

8300 server rpc端口:同一数据中心consul server之间通过该端口通信

8301 serf lan端口,同一数据中心consul client通过该端口通信

8302 serf wan端口,不同数据中心consul server通过该端口通信

8600 dns端口,用于服务发现

-bootstrap:集群模式,需要至少两台服务器,才能选举集群leader

-ui: 运行web控制台

-bind: 监听网口,0.0.0.0表示所有网口,如果不指定默认为127.0.0.1,则无法和容器通信

      -client:允许客户端ip

 

3.获取consul server1 ip地址

docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1

 

4. 启动consul server2,并加入consul server1

docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join [consul1 ip address]

注:[consul1 ip address]用第3步获取ip填入

 

5. 启动consul server3,并加入consul server1或consul server2集群

docker run --name consul3 -d -p 8503:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join [consul1 ip address]

注:[consul1 ip address]用第3步获取ip填入

  

6.宿主机浏览器访问: http://localhost:8501 或者  http://localhost:8502或者http://localhost:8503

 

image.png

  1. 停止consul server3
docker stop consul3

查看consul web界面,显示一个server node已经不在线 

 

  1. 通过http接口注册服务
curl -X PUT --data @test-web.json http://localhost:8500/v1/agent/service/register

 

test-web.json内容:

{
    "ID": "test-web1",
    "Name": "test-web1",
    "Tags": [
        "test",
        "v1"
    ],
    "Address": "xxx.0.0.1",
    "Port": 8000,
    "Meta": {
        "X-TAG": "testtag"
    },
    "EnableTagOverride": false,
    "Check": {
        "DeregisterCriticalServiceAfter": "90m",
        "HTTP": "http://baidu.com",
        "Interval": "10s"
    }
}

 

image.png

更改test-web.json中内容id和name为test-web2,向另一台server注册:

curl -X PUT --data @test-web.json http://localhost:8501/v1/agent/service/register

刷新web控制台可以看到可用服务增加了:test-web2

 

  1. 通过http api获取某个service可用服务列表 

宿主机浏览器访问:http://localhost:8500/v1/health/service/test-web1?passing,返回所有通过健康检查的可用test-web1服务列表

[{
    "Node": {
        "ID": "1e58f720-6b9e-b508-1f28-90b4461268f1",
        "Node": "ca20157ca067",
        "Address": "xxxx.17.0.3",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "xxx.17.0.3",
            "wan": "xx.17.0.3"
        },
        "Meta": {
            "consul-network-segment": ""
        },
        "CreateIndex": 5,
        "ModifyIndex": 8
    },
    "Service": {
        "ID": "test-web1",
        "Service": "test-web1",
        "Tags": ["test", "v1"],
        "Address": "xxxx.0.0.1",
        "Meta": {
            "X-TAG": "testtag"
        },
        "Port": 8000,
        "EnableTagOverride": false,
        "ProxyDestination": "",
        "Connect": {
            "Native": false,
            "Proxy": null
        },
        "CreateIndex": 26,
        "ModifyIndex": 26
    },
    "Checks": [{
        "Node": "ca20157ca067",
        "CheckID": "serfHealth",
        "Name": "Serf Health Status",
        "Status": "passing",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "ServiceTags": [],
        "Definition": {},
        "CreateIndex": 5,
        "ModifyIndex": 5
    }, {
        "Node": "ca20157ca067",
        "CheckID": "service:test-web1",
        "Name": "Service 'test-web1' check",
        "Status": "passing",
        "Notes": "",
        "Output": "HTTP GET http://baidu.com: 200 OK Output: <html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n",
        "ServiceID": "test-web1",
        "ServiceName": "test-web1",
        "ServiceTags": ["test", "v1"],
        "Definition": {},
        "CreateIndex": 26,
        "ModifyIndex": 58
    }]
}]

注:

其它应用程序可以通过这种方式轮询获取服务列表,这就是微服务能够动态知道其依赖微服务可用列表的原理。

 

  1. 解注册
curl -i -X PUT http://IP:PORT/v1/agent/service/deregister/:service_id

 

 11. 适合本机调试的更简方式

上述集群方式需要至少启动两个consul server,本机调试web应用时,为了方便可以用-dev参数方式只启动一个consul server:

docker run --name consul -d -p 8500:8500 consul:1.2.2 agent -dev -bind=0.0.0.0 -cli