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. ideal通过svn上传项目和激活方式

    激活方式: http://www.ideadev.club/topic/detail/102?anchor=1526259147353#1526259147353

  2. 数据格式转换(一)PDF转换技术

         PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式. 这样的文件格式与操作系统平台无关.这一特点使它成为在Internet上进行电子文档发行 ...

  3. Laya学习

    IDE安装 https://www.jianshu.com/p/88fa76a5becc npm uninstall -g typescript npm install -g typescript@2 ...

  4. KiCad 如何在原理图添加元件时看到 PCB 封装?

    KiCad 如何在原理图添加元件时看到 PCB 封装? 这个功能默认是关闭,评估关闭的原因是因为 PCB 封装很大,而且在前期也没必要详细知道 PCB 封装. 但是有时修改可以看到 PCB 封装会方便 ...

  5. PADS Logic Ref Des Start Value

    PADS Logic Ref Des Start Value 曾经以为 Mentor 把 PADS Logic 放弃了,没想到还加了一个非常实用的功能. 这个的好处是让元件号可以设置起始编号,方便每一 ...

  6. Zabbix-2.4-安装-2

    zabbix自定义报警-动作   打开资产自动接收   这里看到主机资产有数据了,这里的数据,就是来自下面的关联 上面的数据就是设置login-user时候设置的关联    有些关联显示的慢,比如下面 ...

  7. javascript, jquery, nodejs学习2

    debug tools http://stackoverflow.com/questions/1911015/how-to-debug-node-js-applications node inspec ...

  8. vue 和 react 组件间通信方法对比

    vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...

  9. npx:npm包执行器

    npx 作用: 单次执行命令而不需要安装到本机 执行依赖包里的二进制文件 使用不同版本的 node 利用 npx 可以下载模块这个特点,可以指定某个版本的 Node 运行脚本.它的窍门就是使用 npm ...

  10. Shell 一键安装命令

    现在是懒人的天下,为了迎合用户的需求,很多开源软件或者包提供的安装步骤都非常简单,大家应该看到不少类似一键安装的命令.下面是几个典型的例子: # homebrew 安装 $ ruby -e " ...