我正试图把我的头绕在这篇关于开放源码软件服务发现的文章身上,我很难在树林中看到森林。
在这篇文章中,作者提出了服务发现的主要问题:
首先,问题似乎很简单:客户端如何确定存在于多台主机上的服务的IP和端口?
但我甚至不知道这意味着什么。当谈到服务发现时,我们到底在说什么?是否类似于,如果我们想连接到数据库,可能需要在某个地方定义主机和端口号,例如:
host=mydatabase01.example.com
port=9300???这就是作者所说的,也是“服务发现”所暗示的吗?
如果是这样的话,那么(显而易见的)解决方案不是把一个web服务放在所有的前面吗?这样,客户端就不关心他们连接到哪个特定的主机/端口,他们只对RESTful调用,比如http://my-data-service.example.com。
这不可能这么简单,因为这篇文章接着谈到了像ZooKeeper和Eureka这样的东西,它们似乎是非常复杂的野兽。我显然遗漏了一些东西;如果是这样的话,当我们谈论“服务发现”时,有人能提供一个具体的、具体的用例来说明什么是什么意思吗?
发布于 2014-08-15 01:07:34
本文讨论的是分布式服务。一个流行的例子是点对点(P2P)文件共享网络.节点连接到一个群集来共享数据,并可能在任何时候退出。
本文讨论了几个开放源码的“注册中心”,这些注册中心允许客户端连接到网络,并宣布它们的存在,以便他们可以使用网络上的服务。根据应用程序的不同,客户端本身也可能成为网络资源。在这种情况下,“网络”是指有限数量的客户端系统进行通信。它们可能位于不同的物理网络上:这类似于P2P分布式系统。他们可以在同一个物理网络上:这类似于企业内部网。
这些客户是如何了解彼此的?如果我坐在办公桌前说“我真的很想打印到X打印机,或者和Y电脑共享文件”,我怎么才能从盯着我的咖啡看到真正的执行这些动作呢?在传统的企业环境中,将有网络域服务器来处理这个问题。也许MIS告诉我一个IP地址。但是,如果这些系统不是在企业或家庭网络上呢?在某个地方,在短暂的互联网中,有一台我想连接的电脑。这就是作者试图解决的问题:我如何找到并连接到这些客户端?
服务发现可能以多种方式之一出现,这绝不是一个详尽的列表。每种协议都是不同的,新协议是定期发明的(请查看ACM数字图书馆,如果您可以使用,这里有很多信息)
一旦连接到这样一个网络,就会有大量的后续问题超出了这个问题的范围,但是如果您发现这个问题很有趣,您可能需要深入研究。看看分布式计算。
以下是我读到的一些论文,它们可能会帮助我更好地理解这个话题。请注意,您需要访问ACM数字图书馆:
在弱连接复制存储系统Bayou中管理更新冲突
尾波文件系统中的断开操作
基于WheelFS的分布式系统的灵活广域存储
发布于 2014-09-04 23:18:45
我是这篇文章的作者。
文章的上下文实际上围绕着分布式系统,特别是面向服务的体系结构(SOA)。解决方案通常用于大型软件作为服务(SaaS)提供者,在那里,他们有许多后端服务,用来提供他们的服务。
例如,许多SaaS提供程序都有登录到其系统的方法。在SOA中,后端可能有一个身份验证服务来处理登录请求。通常,在这些后端服务前面有一个web层,它实际上为登录页面提供服务,并处理登录HTTP请求。该层将将登录请求委托给身份验证服务。它还可以将其他功能委托给后端的其他服务。这些后端可能提供基于HTTP的API或其他东西,但它通常是一个跨多个主机的服务。
为什么你不能把一个web服务放在所有的前面呢?
你可以,这是通常的做法。当服务关闭、失败、升级、缩放等时,当http://my-data-service.example.com试图保持指向正确主机时,服务发现方面就会出现。
如果my-data-service.example.com只是一个循环DNS条目,并且您有三个提供服务的实例,其中一个失败了,那么当主机重新联机时,您会收到一些失败的请求。对于DNS,您还需要考虑TTL,这样缓存了这些条目的客户端将继续尝试被关闭的主机,直到TTL过期并刷新为止。如果要添加主机,则必须等待TTL过期后才能开始服务请求。
另一种方法是将my-data-service-example.com指向负载均衡器,或者让客户端应用程序实现一些负载平衡。
这就提出了一个新的问题:
如何使负载均衡器中配置的后端主机保持最新?
在像AWS这样的环境中,主机可以频繁地上上下下,并且它们的IP可以改变。如果使用的是码头,则启动新容器时,is和端口通常是不同的。在这类环境中,尝试保持手动配置通常是不可能的.特别是当您有多个服务和数百或数千个主机时。
要使负载均衡器自动更新,您需要某种形式的动态服务发现。
这通常意味着:
最初的文章描述了不同的公司如何以不同的方式实现这些组件。还有很多其他方法可以做到这一点。
对于一个更具体的例子,我写了另一篇文章,展示了使用etcd和haproxy的码头服务发现的一种方式。这可能有助于理解文章的上下文。
https://softwareengineering.stackexchange.com/questions/253334
复制相似问题