克里斯·理查森(ChrisRichardson)。
编辑-这个由七部分组成的系列文章现已完成:
您还可以下载完整的文章集,以及有关使用Nginx Plus作为电子书实现微服务的信息-微服务:从设计到部署.另外,请看新的微服务解决方案页面.这是我们系列中关于用微服务构建应用程序的第四篇文章。这,这个,那,那个第一条介绍微服务体系结构模式并讨论了使用微服务的优缺点。这,这个,那,那个第二和第三本系列文章描述了微服务体系结构中通信的不同方面。在本文中,我们将探讨与服务发现密切相关的问题。
让我们想象一下,您正在编写一些代码,这些代码调用的服务具有RESTAPI或ThraceAPI。为了发出请求,您的代码需要知道服务实例的网络位置(IP地址和端口)。在运行在物理硬件上的传统应用程序中,服务实例的网络位置是相对静态的。例如,代码可以从偶尔更新的配置文件中读取网络位置。
然而,在一个现代的、基于云的微服务应用程序中,这是一个更难解决的问题,如下图所示。
服务实例具有动态分配的网络位置。此外,由于自动标号、故障和升级,服务实例集会动态变化。因此,客户端代码需要使用更精细的服务发现机制。
有两种主要的服务发现模式:客户端发现和服务器端发现。让我们先来看看客户端的发现。
使用时客户端发现,客户端负责确定可用服务实例的网络位置和跨它们的负载平衡请求。客户端查询服务注册表,它是可用服务实例的数据库。然后,客户端使用负载平衡算法选择一个可用的服务实例并发出请求。
下图显示了此模式的结构。
当服务实例启动时,服务实例的网络位置将在服务注册表中注册。当实例终止时,它将从服务注册表中删除。服务实例的注册通常使用心跳机制定期刷新。
Netflix开放源码软件提供了客户端发现模式的一个很好的示例。Netflix Eureka是一个服务注册中心。它为管理服务实例注册和查询可用实例提供了RESTAPI。Netflix丝带是一个IPC客户端,它与Eureka一起工作,在可用的服务实例中加载平衡请求。我们将在本文后面更深入地讨论尤里卡。
客户端发现模式有许多优点和缺点。这种模式相对简单,除了服务注册中心之外,没有其他移动部件。此外,由于客户端知道可用的服务实例,所以它可以做出智能的、特定于应用程序的负载平衡决策,例如一致使用散列。这种模式的一个显著缺点是,它将客户端与服务注册中心耦合在一起。您必须为服务客户端使用的每种编程语言和框架实现客户端服务发现逻辑。
现在我们已经看过了客户端发现,让我们来看看服务器端的发现。
服务发现的另一种方法是服务器端发现模式。下图显示了此模式的结构。
客户端通过负载均衡器向服务发出请求。负载平衡器查询服务注册中心,并将每个请求路由到可用的服务实例。与客户端发现一样,服务实例被注册并在服务注册中心注销注册。
这,这个,那,那个AWS弹性负载均衡器(ELB)是服务器端发现路由器的一个例子.ELB通常用于负载来自Internet的外部流量。但是,您也可以使用ELB来加载虚拟私有云(VPC)内部的负载平衡通信量。客户端使用其DNS名称通过ELB发出请求(HTTP或TCP)。ELB负载平衡了一组注册的弹性计算云(EC2)实例或EC2容器服务(ECS)容器之间的通信量。没有单独的服务注册中心。相反,EC2实例和ECS容器是在ELB本身注册的。
HTTP服务器和负载平衡器,如Nginx PlusNginx还可以用作服务器端发现负载均衡器。例如,这个博客帖子描述使用领事模板动态地重新配置Nginx反向代理。对象中存储的配置数据定期重新生成任意配置文件的工具。领事服务登记处。每当文件更改时,它都会运行任意shell命令。在博客文章描述的示例中,领事模板生成一个nginx.conf文件,它配置反向代理,然后运行一个命令,告诉Nginx重新加载配置。更复杂的实现可以使用以下两种方法动态地重新配置Nginx Plus它的HTTPAPI或DNS.
一些部署环境,如库伯奈特斯和马拉松在集群中的每个主机上运行一个代理。代理扮演服务器端发现负载均衡器的角色。为了向服务发出请求,客户端使用主机的IP地址和服务的指定端口通过代理路由请求。然后,代理透明地将请求转发到集群中某个位置运行的可用服务实例。
服务器端发现模式有几个优点和缺点。这种模式的一个很大的好处是发现的细节是从客户端抽象出来的。客户端只需向负载均衡器发出请求。这就不需要为服务客户端使用的每种编程语言和框架实现发现逻辑。此外,如上所述,一些部署环境免费提供此功能。然而,这种模式也有一些缺点。除非负载均衡器是由部署环境提供的,否则它是您需要设置和管理的另一个高度可用的系统组件。
这,这个,那,那个服务注册是服务发现的关键部分。它是一个包含服务实例的网络位置的数据库。服务注册中心需要高度可用并且是最新的。客户端可以缓存从服务注册中心获得的网络位置。但是,该信息最终会过时,客户端将无法发现服务实例。因此,服务注册中心由使用复制协议来保持一致性的服务器集群组成。
如前所述,Netflix Eureka是服务注册中心的一个很好的例子。它为注册和查询服务实例提供了RESTAPI。服务实例使用POST
请求。它必须每30秒使用PUT
请求。通过使用HTTP来删除注册DELETE
请求或由实例注册超时。如您所料,客户端可以使用HTTP检索已注册的服务实例GET
请求。
Netflix实现高可用性通过在每个AmazonEC 2可用性区域中运行一个或多个Eureka服务器。每个Eureka服务器运行在一个EC2实例上,该实例具有弹性IP地址。dnsTEXT
记录用于存储Eureka集群配置,这是从可用性区域到Eureka服务器网络位置列表的映射。当Eureka服务器启动时,它会查询DNS以检索Eureka集群配置,定位其对等点,并为自己分配一个未使用的弹性IP地址。
Eureka客户端-服务和服务客户端-查询DNS以发现尤里卡服务器的网络位置。客户端更喜欢在相同的可用性区域使用Eureka服务器。但是,如果没有可用,则客户端将在另一个可用性区域使用Eureka服务器。
服务登记处的其他例子包括:
另外,如前所述,一些系统,如Kubernetes、Marathon和AWS没有明确的服务注册中心。相反,服务注册中心只是基础设施的一个内置部分。
现在我们已经了解了服务注册中心的概念,让我们看看服务实例是如何在服务注册中心注册的。
如前所述,服务实例必须在服务注册中心注册并注销注册。处理注册和注销登记有几种不同的方法。一个选项是服务实例注册自己,自配准模式。另一个选项是对其他系统组件管理服务实例的注册,第三方登记模式。让我们首先看一下自注册模式。
当使用自配准模式,服务实例负责在服务注册中心注册和注销注册。此外,如果需要,服务实例发送心跳请求,以防止其注册过期。下图显示了此模式的结构。
这种方法的一个很好的例子是Netflix OSS Eureka客户端。Eureka客户端处理服务实例注册和注销注册的所有方面。这,这个,那,那个春云工程,它实现了包括服务发现在内的各种模式,使得使用Eureka自动注册服务实例变得非常容易。只需将Java配置类注释为@EnableEurekaClient
注释
自注册模式有其不同的优缺点。一个好处是它相对简单,不需要任何其他系统组件。但是,一个主要的缺点是,它将服务实例耦合到服务注册中心。您必须在服务使用的每种编程语言和框架中实现注册代码。
另一种将服务与服务注册表分离的方法是第三方注册模式。
当使用第三方登记模式,服务实例不负责在服务注册中心注册自己。相反,另一个称为服务登记员处理注册。服务注册员通过轮询部署环境或订阅事件来跟踪对正在运行的实例集的更改。当它注意到一个新可用的服务实例时,它将该实例注册到服务注册表。服务登记员还终止服务实例。下图显示了此模式的结构。
服务注册员的一个例子是开放源码。登记员项目。它自动注册并取消部署为Docker容器的服务实例。注册中心支持多个服务注册中心,包括etcd和领事。
服务注册员的另一个例子是NetflixOSS Prana。它主要用于用非JVM语言编写的服务,它是一个与服务实例并行运行的Sideecar应用程序。Prana使用NetflixEureka注册并取消服务实例。
服务注册员是部署环境的内置组件。自动标度组创建的EC2实例可以自动在ELB中注册。Kubernetes服务自动注册并可供发现。
第三人登记模式的利弊各不相同.一个主要的好处是服务与服务注册中心分离。您不需要为开发人员使用的每种编程语言和框架实现服务注册逻辑。相反,服务实例注册是在专用服务中以集中方式处理的。
这种模式的一个缺点是,除非它内置到部署环境中,否则它是您需要设置和管理的另一个高度可用的系统组件。
在微服务应用程序中,一组正在运行的服务实例会动态变化。实例具有动态分配的网络位置。因此,客户端要向服务提出请求,就必须使用服务发现机制。
服务发现的一个关键部分是服务注册。服务注册表是可用服务实例的数据库。服务注册中心提供一个管理API和一个查询API。使用ManagementAPI向服务注册中心注册服务实例并从服务注册中心注销注册。系统组件使用查询API来发现可用的服务实例。
有两种主要的服务发现模式:客户端发现和服务端发现。在使用客户端服务发现,客户端查询服务注册表,选择可用实例并发出请求。在使用服务器端发现,客户端通过路由器发出请求,路由器查询服务注册表并将请求转发到可用实例。
在服务注册中心注册和注销服务实例有两种主要方式。一个选项是服务实例向服务注册中心注册,自配准模式。另一个选项是由其他系统组件代表服务处理注册和注销注册。第三方登记模式.
在某些部署环境中,您需要使用服务注册中心来设置您自己的服务发现基础设施,例如Netflix Eureka, 蚀刻,或阿帕奇动物园管理员。在其他部署环境中,服务发现是内置的。例如库伯奈特斯和马拉松处理服务实例注册和注销注册。它们还在每个集群主机上运行一个代理,该代理在服务器端发现路由器。
HTTP反向代理和负载均衡器(如Nginx)也可以用作服务器端发现负载均衡器。服务注册中心可以将路由信息推送到Nginx,并调用优雅的配置更新;例如,您可以使用领事模板。Nginx Plus支持附加动态重构机制-它可以使用DNS从注册表中提取有关服务实例的信息,并为远程重新配置提供API。
在未来的博客文章中,我们将继续深入研究微服务的其他方面。注册Nginx邮件列表(表格在下面),以得到通知的未来文章在本系列的发布。