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. Arrays ---------------copyOf赋值

  2. rsync命令 续集 、linux系统日志、screen工具

    1.rsync 通过服务进行监听同步: 开启服务:rsync --daemon  (默认开启873端口) 需要编辑配制文件:/etc/rsyncd.conf port=873log file=/var ...

  3. opencv3中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher的使用

    opencv2中SurfFeatureDetector.SurfDescriptorExtractor.BruteForceMatcher在opencv3中发生了改变.具体如何完成特征点匹配呢?示例如 ...

  4. Odoo9以后的社区版本和企业版功能上的区别

    Odoo9以后的社区版本和企业版除了授权模式的区别外,整理功能上的区别 透过功能设置菜单整理的区别如下,主要功能模块. 未包括所有模块,毕竟模块太多了. 以下是企业版有,而社区版没有的功能.

  5. 02 JDBC相关

    ====================================================================================JDBC JAVA Databa ...

  6. c# 委托初用法

    public delegate void Print(string printStr); public static void DelegateMethod(string printStr) { Co ...

  7. mongodb副本集加分片集群安全认证使用账号密码登录

    mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...

  8. YAML Class ID Reference

    Classes Ordered by ID Number ID Class 1 GameObject 2 Component 3 LevelGameManager 4 Transform 5 Time ...

  9. Python_getter和setter方法

    当给属性赋值的时候,使用实例.属性=属性值的方式显然把属性暴露出来了,并且也无法对属性值进行限制检查,java中提供了setter和getter方法,那么python是如何做的呢?更多内容请参考:Py ...

  10. 第1节 常用DOS(磁盘操作系统)命令

    一.打开DOS命令窗口 1)快捷键:win + r,打开命令提示符窗口: 2)左击“开始”菜单,在运行里输入cmd,按回车打开命令提示符窗口: 二.常见命令 1)文件夹操作: d:+ 回车:盘符切换 ...