Skip to content

Latest commit

 

History

History
92 lines (78 loc) · 3.73 KB

服务发现.md

File metadata and controls

92 lines (78 loc) · 3.73 KB

#使用DNS作为REST Web服务的发现机制

REST架构的应用在公开Web服务与企业集成两个方面取得较稳定的发展势头。
然而,在面向服务架构的某一方面没有取得足够的重视:服务发现机制。
在这篇文章中,我将描述现存的Web技术是如何促使在RESTful Web服务实现服务发现机制。

##寻找服务发现的解决方案

一个想要与某一服务交互的客户端需要一个初始的URI用来进入所提供的应用。
那如何来获取这个用来进入应用的URI呢?有以下三种不同方式:
* 在客户端对这个URI配置进行硬编码;
* 创建一个专用的基于HTTP的解决方案(一个服务注册应用);
* 利用现有的一些服务发现机制。

如今,硬编码或者将初始的URI配置写入客户端应该是最常见的手段。
然而,坏处是期间所引入的耦合将使得服务的提供者难以重新部署服务,
或者为服务配置某种形式的负载均衡。

通过创建专用的Web应用来提供基于HTTP的服务注册机制、同时关联标准媒体类型是一种切实可行的选择,
但是这只是在没有现存可用技术时的最后选择。
使用现存以部署的技术显然是最好的解决方案。我们无需到处寻找这种大规模普适的可靠解决方案,
域名系统(DNS)就是我们所需的。DNS主要是一个用来查找对于主机的IP以及提供例如查找
域名对应邮件服务器等其他服务的分布式数据库。
这篇文章将描述如何利用标准的DNS功能来实现服务发现机制。

##服务发现机制的需求

服务发现机制的解决方案应当具有怎样的能力?这是一个很常见的场景:
一个客户端从实现一个特点功能的服务列表中查询并挑选一个进行交互。
通常这个客户端在某个场景下限制了这个查询。
例如,一个客户端可能不需要所有的购物服务,它只需要www.examplebooks.com网站下的购物服务。
我们可以把提炼出以下的需求:一个服务发现机制应该是客户端有能力
* 获取特定种类下所有服务的列表;
* 获取一个特定服务示例的入口URI;
* 获取关于这个服务的元数据;
* 限定查找的边界(如,查找domain example.org下所有的搜索引擎)

我们会马上发现,现存的DNS支持上述所有的需求。接下来我们先环顾并了解一下RESTfull系统中服务类型的概念。

##RESTful系统的服务类型

服务发现机制的需求之一就是使得它能够获得期望的容量。
通常,一个客户端从指定种类的服务列表中基于附带的元数据或者随机地选取一个可用的服务。
但不幸的是,服务类型这个概念还没有出现在REST Web服务领域中。
为了让基于类型的服务发现机制成为可能,我们必须首先创造一个能详细说明服务类型的方法。
哪里适合定义服务类型及其名称呢?
考虑到RESTful Web系统唯一能使用的说明文档是媒体类型及其类型关系的规范,
那将其定义在媒体类型规范中就很自然了。
那它是如何运作的呢?让我们来看一下博客服务与搜索服务这两个例子。

###定义REST Web服务类型的例子 ####Atom出版协议

Atom出版协议规范定义了一系列的可用于实现出版接口的超文本类型以及链接关系。
它最开始的用途是用来出版发布网络日志,但它同样可以用来为任何一个管理条目、
组织条目的系统提供服务接口。
为Atom出版协议定义一个服务类型简单到只需在其规范中为这个服务类型指定一个名字。
然后客户端,用这个名字通过服务查询机制,查询这个实现了Atom的服务。为了方便,
我们之后都将这个Atom服务名字取为_atom_http。
(不用担心这个名字中的下划线或是名字的格式,这只是一个DNS转换。我会在后面解释这个。)

####OpenSearch

OpenSearch规范规定了“OpenSearch描述文档用来描述一个能够被搜索客户都所使用的搜索引擎。
”我们不必深究此处的服务类型:搜索引擎。我们不如把它转变成一种名称为_search_http的Atom服务。
通过在OpenSearch规范中加入这个服务名称,我们能够用它来做基于DNS的服务发现。

##DNS(十分)笼统的介绍

在互联网早期,每个主机上都保存了记录主机名与对应的ip地址的一个静态文件(hosts.txt)。
随着互联网上主机数目的增长,由于规模问题更新这个文件变成了一个难题。
DNS通过非中心化地管理这个数据库,解决了这个规模性的问题。
去中心化的管理通过委托的方式来实现,这就意味着一个特定索引路径块(一个域名)
的拥有者可以将这个域名的部分所有权委托给其他组织来代替管理。
DNS是一个路径索引的分布式数据库,它具有以下的能力:

* 分布:一个DNS数据库可以分布在互联网上很多台名称主机上。
* 委托:一个特定索引路径块的拥有者可以将部分域名所有权委托给其他人。
* 类型资源记录:DNS可以关联域名的若干种数据类型记录。在域名查询时可以指定所需的类型。
* 缓存:考虑到性能,DNS自带缓存。
* 容错性:DNS可以复制若干个,使得当单个名称服务器不运行时仍继续提供服务。