• 玩转CONSUL(1)–WATCH机制探究


    1. 前言

    consul 经常被用于服务的注册和发现,本文将带你对watch做更深入的探究

    2. consul对外暴露了4种通讯接口

    2.1 RPC

    主要用于内部通讯Gossip/日志分发/选主等

    2.2 HTTP API

    服务发现/健康检查/KV存储等几乎所有功能
    默认端口为8500

    2.3 Consul Commands (CLI)

    consul命令行工具可以与consul agent进行连接,提供一部分consul的功能。
    实时上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯。
    可以通过配置CONSUL_HTTP_ADDR 修改Consul CLI连接的目标地址

    CONSUL_HTTP_ADDR=http://127.0.0.1:8500
    

    详见参考资料3

    2.4 DNS

    仅用于服务查询

    3. 服务注册&发现

    3.1 服务注册

    服务注册可以通过 服务注册接口 /agent/service/register 很容易做到

    3.2 服务发现

    3.2.1 DNS方式
    $ dig @127.0.0.1 -p 8600 web.service.consul
    
    ;; QUESTION SECTION:
    ;web.service.consul.        IN  A
    
    ;; ANSWER SECTION:
    web.service.consul. 0   IN  A   127.0.0.1
    

    我们可以通过cosul提供的DNS接口来获取当前的service “web” 对应的可用节点(详细用法见参考资料4)
    DNS方式要求使用方主动进行DNS解析,是主动请求的过程。它对线上服务节点的变化,反应是延迟的。

    3.2.2 Watch方式

    见参考资料1
    watch采用HTTP长轮训(long polling)实现的。

    不同的watch类型对应着不同HTTP API

    key - Watch a specific KV pair
    keyprefix - Watch a prefix in the KV store
    services - Watch the list of available services
    nodes - Watch the list of nodes
    service- Watch the instances of a service
    checks - Watch the value of health checks
    event - Watch for custom user events
    

    下面我们以watch service来举例。
    假定我们有一个服务es,位于机房dc1

    1) 获取node列表
    详解 list-nodes-for-service

    MethodPathProduces
    GET /health/service/:service application/json
    curl -v -XGET 'http://dev1:8500/v1/health/service/es?dc=dc1&passing=1&tag=search'
    

    请求参数

    字段类型说明
    passing true/false 节点通过了check(通常表示节点是活的)

    我们会收到形如

    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Vary: Accept-Encoding
    < X-Consul-Effective-Consistency: leader
    < X-Consul-Index: 923894    // X-Consul-Index 表示被请求资源的当前版本
    < X-Consul-Knownleader: true
    < X-Consul-Lastcontact: 0
    < Date: Thu, 10 Jan 2019 08:38:15 GMT
    < Transfer-Encoding: chunked
    
    [{
        "Node": { ...},
        "Service": {
            "ID": "es1",
            "Service": "es",
            "Tags": [
                "es",
                "search"
            ],
            "Address": "192.168.120.103",
            "Meta": {
                "es_version": "6.2.4"
            },
            "Port": 9200,
            "Weights": {
                "Passing": 10,
                "Warning": 1
            },
            "EnableTagOverride": false,
            "ProxyDestination": "",
            "Proxy": {},
            "Connect": {},
            "CreateIndex": 393293,
            "ModifyIndex": 393293
        },
        "Checks": [ ... ]
    }]
    

    Endpoints that support blocking queries return an HTTP header named X-Consul-Index. This is a unique identifier representing the current state of the requested resource.

    2) 第2 ~ N次请求

    curl -v -XGET 'http://dev1:8500/v1/health/service/es?dc=dc1&passing=1&tag=search&wait=5s&index=923894'
    

    请求参数

    字段类型说明备注
    wait string consul会尝试等待的时间 “5s”表示5秒,详见参考资料3
    index int 上次拿到的版本号  

    consul会尝试等待被请求资源发生变化,如果在wait指定的时间内
    1) 被请求资源发生变化, 请求直接返回新的X-Consul-Index和新的body体
    2) 被请求资源未发生变化,则请求会一直阻塞,直到wait指定的时间耗尽,请求最终会返回。只是此时X-Consul-Index不发生变化,body体不变。

    长轮训减少了频繁轮训的所造成的不必要的带宽和服务器资源开销,用在服务发现上,即时性也能有所保证,还是很合适的

    watch操作重复步骤2,以完成对资源的监控。

    参考资料

      1. consul-Watches
      2. Blocking Queries
      3. consul_http_addr
      4. DNS-API
  • 相关阅读:
    vue项目,百度地图api高亮选取区域,高亮某个地区,行政区域等
    vue 项目, 通知子组件更新,父组件中每次点击按钮重新加载子组件,(重新生成dom 元素)
    洛谷 P1003 铺地毯
    Codeforces Round #582 (Div. 3)
    安科 OJ 1190 连接电脑 (并查集)
    2018年牛客多校寒假 第四场 F (call to your teacher) (图的连通性)
    牛客小白月赛16 A 小石的签到题 ( 博弈)
    牛客小白月赛16 E 小雨的矩阵 ( 暴搜)
    安科 OJ 1054 排队买票 (递归,排列组合)
    牛客小白月赛15 C 表单 ( map 使用)
  • 原文地址:https://www.cnblogs.com/ExMan/p/11889712.html
Copyright © 2020-2023  润新知