DNS是consul提供的主要查询接口之一。DNS接口允许应用程序在没有与consul高度集成的情况下使用服务发现。

例如:替代consul的HTTP API请求,主机能够通过名字查找直接使用DNS服务器,类似"redis.service.east-aws.consul",此查询自动转换为查找位于数据中心"east-aws"节点提供的redis服务——没有故障的redis健康检查。它是如此简单!

如果要使用DNS接口,必须配置一些重要的参数client_addr, ports.dns, recursors, dns_config等。

默认情况下,Consul监听127.0.0.1:8600,使用.consul域提供DNS查询服务,但不支持进一步的DNS递归。

相关参数请参考https://www.consul.io/docs/agent/options.html

使用DNS接口的方法有多种。

一种方法是在consul中自定义DNS解析器动态库。另一个方法是为节点设置Consul的DNS服务器,并提供recursors配置,也可以解决non-Consul查询。最后一种方法是将所有的关于"consul."域的查询都从现有的DNS服务器转移consul Agent。

可以尝试使用的Consul DNS服务器的命令行工具dig:

$ dig @127.0.0.1 -p8600 redis.service.dc1.consul. ANY

注:在DNS中,都是不区分大小写的。比如PostgreSQL.node.dc1.consul会查询所有节点中名字为postgresql的节点。

1.1.1 节点查找

要解决名称,Consul依赖于非常具体的查询格式。基本上有两种类型的查询:节点查找和服务查找。

节点查找,类似如下:包含节点的address

<node>.node[.datacenter].<domain>

例如,如果有默认节点“foo”,可以查找“foo.node.dc1.consul.”其中数据中心名称dc1是可选参数,如果不提供,Agent将选择默认数据中心——agent肯定属于一个数据中心。可以采用"foo.node.consul."进行查找,本约束可以在适当的地方使用,同时支持在远程数据中心得节点查询。

节点查找,唯一的返回记录——包含节点IP地址的A记录。

$ dig @127.0.0.1 -p8600 foo.node.consul ANY
; <<>>DiG 9.8.-P1 <<>> @127.0.0.1 -p foo.node.consul ANY
; ( server found)
;; global options:+cmd
;; Got answer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id:
;; flags: qr aa rd;QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL:
;; WARNING: recursionrequested but not available ;; QUESTION SECTION:
;foo.node.consul. IN ANY
;; ANSWER SECTION:
foo.node.consul. IN A 10.1.10.12 ;; AUTHORITYSECTION:
consul. IN SOA ns.consul.postmaster.consul.

1.1.2 服务查询

服务查找用于查询服务提供者。服务查询支持两种查找方法:标准和严格RFC 2782。

1.1.2.1   标准查找

格式如下:

[tag.]<service>.service[.datacenter].<domain>

Tag是可选的,而且与节点查找一样,数据中心也是可选。如果没有提供Tag,就不会有过滤,如果没有数据中心,就会选择默认的数据中心。

在本地数据中心,如果想查找redis服务提供商,可以通过命令"redis.service.consul.",如果想在指定的数据中心中查找PostgreSQL master,命令如下"master.postgresql.service.dc2.consul."

DNS查询系统利用健康检查以防止不良节点路由信息。当服务查询时,如果服务健康检查失败或者系统检查失败,服务信息将会从查询结果中删除。为了实现简单的负载平衡,返回的节点集合每次都是随机的。这种机制使得利用DNS接口基于应用级重试实现面向auto-healing服务体现架构变得更加容易。

标准服务查询,不但支持A record,还支持SRV record。。SRV reconds提供服务注册的端口,使客户能够避免依赖于众所周知的端口。只有client端指定时,SRV record才会提供服务。命令如下:

$ dig @127.0.0.1 -p8600 consul.service.consul SRV

; <<>>DiG 9.8.-P1 <<>> @127.0.0.1 -p  consul.service.consul ANY

; ( server found)

;; global options:+cmd

;; Got answer:

;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 

;; flags: qr aa rd;QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL: 

;; WARNING:recursion requested but not available

;; QUESTION SECTION:

;consul.service.consul. IN SRV

;; ANSWER SECTION:

consul.service.consul.  IN SRV   8300foobar.node.dc1.consul.

;; ADDITIONALSECTION:

foobar.node.dc1.consul. IN A 10.1.10.12

1.1.2.2   RFC2782 查找

格式如下:

_<service>._<protocol>.service[.datacenter][.domain]

根据RFC 2782, SRV请求都应该在service和protocol前使用(_)作为前缀。避免发生DNS冲突。Protocol可以是service任何一个tag,如果service没有tag,使用tcp作为protocol。如果一旦设置了tcp,那么查询时将不会执行任何标签过滤。

处理查询格式和默认的tcp外, RFC查找方式与标准查找是相同的。

假设通过port5672和Tag “amqp”注册服务"rabbitmq",可以发现RFC2782的SRV查询,如"_rabbitmq._amqp.service.consul":

$ dig @127.0.0.1 -p8600 _rabbitmq._amqp.service.consul SRV

; <<>>DiG 9.8.-P1 <<>> @127.0.0.1 -p  _rabbitmq._amqp.service.consulANY

; ( server found)

;; global options:+cmd

;; Got answer:

;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 

;; flags: qr aa rd;QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL: 

;; WARNING:recursion requested but not available

;; QUESTION SECTION:

;_rabbitmq._amqp.service.consul. IN SRV

;; ANSWER SECTION:

_rabbitmq._amqp.service.consul. IN SRV    rabbitmq.node1.dc1.consul.

;; ADDITIONALSECTION:

rabbitmq.node1.dc1.consul.  IN A 10.1.11.20

再次说明,SRV record返回的是服务端口和IP。

1.1.2.3   PreparedQuery Lookups(如何翻译?)

格式如下:

<query orname>.query[.datacenter].<domain>

其中datacenter是可选参数,若不提供,则选择本地数据中心,Query或name是现已存在PreparedQuery的ID和名称。

就像标准服务查询,但是PreparedQuery查询提供了更为丰富的功能,比如:多重tag过滤,自动故障转移——当本地服务中心无有效健康节点时自动到远程数据中心的进行服务寻找。

Consul 0.6.4及后续版本,都支持prepared query templates——支持前缀匹配,支持一对多模板。

1.1.2.4    UDP Based DNS Queries

若DNS查询使用UDP,COnsul将截断查询结果单不设置截断点。这是为了避免为TCP产生附加负担。如果使用TCP,结果不会被截断。

1.1.2.5    Caching

默认情况下,Consul提供的所有DNS结果都设置为 0TTL值。这种方式会禁用DNS结果的caching。但是,在很多场景中,都是希望使用caching的,比如性能和可扩展性。

详情参加DNS caching

1.1.2.6    WAN Address Translation

默认情况下,Consul DNS查询返回的是节点的本地IP地址,即使查询的是远程的数据中心。如果需要使用不同的IP地址访问数据中心外部的节点,可以配置advertise-wan 和translate_wan_addrs

转自:https://blog.csdn.net/younger_china/article/details/52264525

Consul实践指导-DNS接口的更多相关文章

  1. 【Consul】Consul实践指导-配置文件

    Agent有各种各样的配置选项,这些配置选项可以通过命令行参数的方式设定,也可用通过配置文件的方式设定--所有的配置选项都是可选的,当然也是有默认值的. 当加载配置选项时,consul是按照词典顺序从 ...

  2. 转 Jmeter测试实践:文件下载接口

    Jmeter测试实践:文件下载接口   一 Jmeter步骤 1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求.根据接口文档进行配置. Basic ...

  3. 升讯威微信营销系统开发实践:微信接口的 .NET 封装

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  4. Ocelot + Consul实践

    关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla ...

  5. 《GettingThingsDone》--GTD学习笔记(二)-GTD实践指导

    一.准备阶段的建议: 高级的工作管理方法就是学会一套系统并付诸实施,直到将这套系统和方法融入你的工作和生活中. 通过行动使自己感觉良好,要比通过使自己感觉良好而进入一种较佳的行动状态容易的多. 当你在 ...

  6. Jmeter测试实践:文件下载接口

    一 Jmeter步骤 1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求.根据接口文档进行配置. Basic部分修改如下,Advanced部分保持默 ...

  7. C++程序设计实践指导1.15找出回文数改写要求实现

    改写要求1:用单链表实现 #include <cstdlib> #include <iostream> using namespace std; struct LinkNode ...

  8. C++程序设计实践指导1.14字符串交叉插入改写要求实现

    改写要求:1:以指针为数据结构开辟存储空间 改写要求2:被插入字符串和插入字符串不等长,设计程序间隔插入 如被插入字符串长度为12,待插入字符串长度为5 则插入间隔为2 改写要求3:添加函数Inser ...

  9. C++程序设计实践指导1.13自然数集中找合数改写要求实现

    改写要求1:用单链表实现 改写要求2:析构函数中依次将链表结点删除 #include <cstdlib> #include <iostream> using namespace ...

随机推荐

  1. JS滚轮mousewheel事件和DOMMouseScroll事件

    滚轮事件的兼容性差异有些不拘一格,不是以往的IE8-派和其他派,而是FireFox派和其他派. 包括IE6在内的浏览器是使用onmousewheel,而FireFox浏览器一个人使用DOMMouseS ...

  2. C++学习(二十六)(C语言部分)之 结构体3(联合,枚举)

    结构体 struct 类型定义点运算符 . 变量名.成员 成员是数组的时候不能用等于号赋值箭头运算符 -> 指针->成员 作用 存放多个不同类型的有关联的数据 与结构体类似的类型1.联合作 ...

  3. Easy to use cross-platform 3D engines

    C++ http://gamedev.stackexchange.com/questions/21/easy-to-use-cross-platform-3d-engines-for-c-game-d ...

  4. direct3d

    DirectX for .Net procedure 1, install DXSDK  https://www.microsoft.com/en-us/download/details.aspx?i ...

  5. [转]从OSI网络模型到TCP/IP协议族简介

    OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...

  6. 启用 webpack 的模块热替换特性

    启用 webpack 的模块热替换特性: module.exports = { //... devServer: { hot: true } } 注意,必须有 webpack.HotModuleRep ...

  7. flume简介

    组件介绍: 代理 Flume Agent Flume内部有一个或者多个Agent 每一个Agent是一个独立的守护进程(JVM) 从客户端哪儿接收收集,或者从其他的Agent哪儿接收,然后迅速的将获取 ...

  8. js实现表单提交 onsubmit

    <!--HTML--> <form role="form" class="form-edit-add edit-form" action=&q ...

  9. LOJ 2553 「CTSC2018」暴力写挂——边分治+虚树

    题目:https://loj.ac/problem/2553 第一棵树上的贡献就是链并,转化成 ( dep[ x ] + dep[ y ] + dis( x, y ) ) / 2 ,就可以在第一棵树上 ...

  10. Spring Cloud(Dalston.SR5)--Eureka 注册中心高可用-服务提供和消费

    由于 Eureka 注册中心只是在内存中保存服务注册实例,并且没有将服务注册实例进行同步,因此我们需要对服务提供和消费进行调整,需要指定服务提供和消费的注册.服务发现的具体Eureka 注册中心配置, ...