玩转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,以完成对资源的监控。
参考资料
玩转CONSUL(1)–WATCH机制探究的更多相关文章
- Glibc堆块的向前向后合并与unlink原理机制探究
i春秋作家:Bug制造机 原文来自:Glibc堆块的向前向后合并与unlink原理机制探究 玩pwn有一段时间了,最近有点生疏了,调起来都不顺手了,所以读读malloc源码回炉一点一点总结反思下. U ...
- J2EE进阶(八)Hibernate与延迟加载机制探究
Hibernate与延迟加载机制探究 前言 Hibernate对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的 ...
- 玩转CONSUL(2)–分布式锁
1. 前言 分布式锁的场景,大家应该都有遇到过.比如对可靠性有较高要求的系统中,我们需要做主备切换.这时我们可以利用分布式锁,来做选主动作,抢到锁作为主,执行对应的任务,剩余的实例作为备份 redis ...
- iOS 视图,动画渲染机制探究
腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验 ...
- java 反射机制探究
一 反射机制操作类的成员变量 二 操作类的方法 三 利用反射实例化类 四 利用反射访问一个类的私有成员 五 利用反射覆盖数据对象的toString 方法
- Oracle 锁机制探究
以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考官网以及Tom Tyke的<Oracle 9i/10g/11g编程艺术>一书整理了一下O ...
- Elasticsearch分布式机制探究
Elasticsearch是一套分布式的系统,分布式是为了应对大数据量隐藏了复杂的分布式机制 分片机制 shard = hash(routing) % number_of_primary_shards ...
- php中session的生成机制、回收机制和存储机制探究
1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问 ...
- 玩转CONSUL(3)–大规模部署的性能开销定量分析
1. 引言 今天有朋友问萌叔,consul能否在大规模生产环境下进行应用.场景是总计大约10w+台机器,分为3 ~ 4个机房,单个机房最多3w万+机器.这个问题大的,可把萌叔吓了跳,部门里面consu ...
随机推荐
- learning java 访问文件和目录
import java.io.File; import java.io.IOException; public class FileTest { public static void main(Str ...
- ElasticSearch使用C#操作文档
一.ElasticSearch的.net客户端驱动程序 ElasticSearch官方网站提供了两个.net客户端驱动程序,其中Elasticsearch.Net是一个非常底层且灵活的客户端驱动程序, ...
- Spring的Core模块
Core模块主要的功能是实现了反向控制IOC(Inversion of Control)与依赖注入DI(Dependency Injection).Bean配置以及加载.Core模块中有Beans.B ...
- ICEM-轴
https://yunpan.cn/cuy98EwwXvYkb 访问密码 0897
- 讨论关于RAID以及RAID对于存储的影响
定义及作用 RAID是Redundent Array of Inexpensive Disks的缩写,直译为“廉价冗余磁盘阵列”,也简称为“磁盘阵列”.后来RAID中的字母I被改作了Independe ...
- MySQL5.7授权用户远程访问
做个记录,每次弄环境的时候,特别是弄mysql环境,时不时都要用到下面的命令 命令如下: grant all privileges on *.* to 'root'@'%' identified by ...
- 容易被忽视的python装饰器的特性
今天发现了装饰器的另一种用法,下面就先上代码: data_list = [] def data_item(func): data_list.append(func) return func @data ...
- 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)
目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...
- MYSQL | ERROR 1305(42000) SAVEPOINT *** DOES NOT EXIST
autocommit模式:在开启情况下,对于每条statement来说,都会自动形成一个commit,也就是会即时对开始和结束一个事务.所以,当出现rollback to savepoint出现这个错 ...
- 自定义Hooks函数获取窗口大小(十一)
其实自定义Hooks函数和用Hooks创建组件很相似,跟我们平时用JavaScript写函数几乎一模一样,可能就是多了些React Hooks的特性,自定义Hooks函数偏向于功能,而组件偏向于界面和 ...