玩转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

Method Path Produces
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

原文地址:https://www.cnblogs.com/ExMan/p/11889712.html

时间: 2024-08-06 04:05:28

玩转CONSUL(1)–WATCH机制探究的相关文章

javascript的单线程异步机制探究

JavaScript的同步异步模式 JavaScript的语言执行环境都是单线程.单线程就是想排队那样任务需要按顺序一个一个的完成.这种模式的好处是实现起来简单,但是坏处就是如果队列中有一个任务耗费时间很长,那后边的任务就必须等前一个执行完,会拖延整个程序的执行. 为了优化这个问题,JavaScript语言将任务的执行模式分成两种,同步(Synchronous)和异步(Asynchronous). 同步模式就是后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的.同步

安卓事件传递机制探究

目前的理解: 1.当点击按钮时,分别依次被捕捉的事件是DOWN,MOVE,UP 2.在UP时,事件流才会处理到CLICK事件 3.  Activity---dispatchTouchEvent---DOWN RTLayout---dispatchTouchEvent---DOWN RTLayout---onInterceptTouchEvent---DOWN RTButton---dispatchTouchEvent---DOWN  RTButton---onTouch---DOWN RTBut

iOS 视图,动画渲染机制探究

腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验伴随着用户使用 App 的整个过程.如果UI失败,用户是不会有打开第二次的欲望的. iOS 为开发者提供了丰富的 Framework(UIKit,Core Animation,Core Graphic,OpenGL 等等)来满足开发从上层到底层各种各样的需求.不得不说苹果很牛逼,很多接口你根本不需要

Java中Iterator(迭代器)的用法及其背后机制探究

在Java中遍历List时会用到Java提供的Iterator,Iterator十分好用,原因是: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素.注意:iterator()方法是jav

php中session的生成机制、回收机制和存储机制探究

1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问,我们都知道session是保存在服务器的,既然它用于保持每一个用户的状态那它利用什么来区别用户的呢?这个时候就得借助cookie了.当我们在代码中调用session_start();时,PHP会同时往SESSION的存放目录(默认为/tmp/)和客户端的cookie目录各生成一个文件.sessio

玩坏C++的多态机制

面向对象的三个特点,封装继承多态,好了,当面向对象遇上指针,就有了C++.三个特点中的封装继承很容易理解,按笔者的个人理解,封装继承是为多态而生.当一个父类有多个继承类时,通过对父指针赋予不同继承类的对象,就可以灵活地调用继承类中的继承函数了,这就是多态. 虚函数是实现多态的重要元素,请看: class A { public: void a0(){cout <<"a0"<<endl;} virtual void a1(){cout <<"a

Elasticsearch分布式机制探究

Elasticsearch是一套分布式的系统,分布式是为了应对大数据量隐藏了复杂的分布式机制 分片机制 shard = hash(routing) % number_of_primary_shards Routing值可以是一个任意的字符串,默认情况下,它的值为存数数据对应文档 _id 值,也可以是用户自定义的值.Routing这个字符串通过一个hash的函数处理,并返回一个数值,然后再除以索引中主分片的数目,所得的余数作为主分片的编号,取值一般在0到number_of_primary_shar

gets(),fgets()的作用机制探究

gets(),fgets() scanf("%d",&a)若接受形如 2 这样的输入后,缓冲区内会留一个\n,此后若调用gets等函数时会读出这个换行出现错误,需注意 fgets(),gets()读到\n处会停止,从而缓冲区内会留下一个\n,从而使以后的输入出现错误,需要用getchar()等方式处理掉 对各种方式的gets(),fgets()的测试: 测试例程: 1 #include<iostream> 2 #include<algorithm> 3

Android Touch消息传递机制探究分析

在Android中,消息的传递控制主要是通过两个方法共同配合使用来对用户的触摸消息进行分发的,下面就来看看这两个方法: onInterceptTouchEvent:此方法定义于ViewGroup中,顾名思义,这个方法是用于ViewGroup拦截(intercept)触摸消息的: onTouchEvent:此方法定义于View中,用于处理用户的触摸事件: 下面来看这两个方法的定义原型: public boolean onInterceptTouchEvent(MotionEvent ev); pu