学习文章: https://www.nginx.com/blog/introduction-to-microservices/
假设您正在编写一些代码,这些代码将调用具有REST API或Thrift API的服务。为了发出请求,您的代码需要知道服务实例的网络位置(IP地址和端口)。
image.png
客户端发现模式
客户端负责确定可用服务实例的网络位置,并在它们之间进行负载平衡请求。客户端查询服务注册表,该服务注册表是可用服务实例的数据库。然后,客户端使用负载平衡算法来选择可用的服务实例之一并发出请求。
image.png
服务实例的网络位置在启动时会在服务注册表中注册。实例终止时,将从服务注册表中将其删除。通常使用心跳机制定期刷新服务实例的注册。
服务器端发现模式
image.png客户端通过负载平衡器向服务发出请求。负载平衡器查询服务注册表,并将每个请求路由到可用的服务实例。
AWS弹性负载均衡(ELB)是一个服务器端发现路由器的一个例子
HTTP服务器和负载平衡器(例如NGINX Plus和NGINX)也可以用作服务器端发现负载平衡器
某些部署环境(例如Kubernetes和Marathon)在群集中的每个主机上运行代理
服务注册表
该服务注册表是服务发现的一个关键部分。它是一个数据库,其中包含服务实例的网络位置。
服务注册表的其他示例包括:
Netflix Eureka是服务注册表的一个很好的例子。
- etcd –高可用性,分布式,一致的键值存储,用于共享配置和服务发现。使用etcd的两个著名项目是Kubernetes和Cloud Foundry。
- consul –用于发现和配置服务的工具。它提供了一个API,允许客户端注册和发现服务。领事可以执行运行状况检查以确定服务可用性。
- Apache Zookeeper –广泛用于分布式应用程序的高性能协调服务。Apache Zookeeper最初是Hadoop的子项目,但现在是顶级项目。
服务注册选项
自我注册模式
使用自我注册模式时,服务实例负责在服务注册表中进行自身注册和注销。同样,如果需要,服务实例会发送心跳请求以防止其注册过期。下图显示了此模式的结构。
通过实施包括服务发现在内的各种模式的Spring Cloud项目,可以轻松地在Eureka中自动注册服务实例。您只需使用注释对Java Configuration类进行@EnableEurekaClient
注释。
第三方注册模式
服务实例不负责在服务注册表中自行注册。取而代之的是另一个称为服务注册器的系统组件来处理注册。服务注册商通过轮询部署环境或订阅事件来跟踪对正在运行的实例集的更改。当发现新的可用服务实例时,它将在服务注册表中注册该实例。
服务注册商的另一个示例是NetflixOSS Prana
摘要
在微服务应用程序中,正在运行的服务实例集会动态更改。实例具有动态分配的网络位置。因此,为了使客户端对服务进行请求,它必须使用服务发现机制。
服务发现的关键部分是服务注册表。服务注册表是可用服务实例的数据库。服务注册表提供管理API和查询API。服务实例使用管理API在服务注册表中注册或注销。系统组件使用查询API查找可用的服务实例。
有两种主要的服务发现模式:客户端发现和服务端发现。在使用客户端服务发现的系统中,客户端查询服务注册表,选择可用实例,然后发出请求。在使用服务器端发现的系统中,客户端通过路由器发出请求,该路由器查询服务注册表并将请求转发到可用实例。
服务实例在服务注册表中注册和注销的主要方法有两种。一种选择是让服务实例在服务注册表中注册自己,即自我注册模式。另一个选项是让某些其他系统组件代表服务(第三方注册模式)来处理注册和注销。
在某些部署环境中,您需要使用服务注册中心(例如Netflix Eureka,etcd或Apache Zookeeper)来建立自己的服务发现基础结构。在其他部署环境中,内置了服务发现。例如,Kubernetes和Marathon处理服务实例的注册和注销。他们还在充当服务器端发现路由器角色的每个群集主机上运行代理。
HTTP反向代理和负载平衡器(例如NGINX)也可以用作服务器端发现负载平衡器。服务注册中心可以将路由信息推送到NGINX并调用正常的配置更新。例如,您可以使用Consul Template。NGINX Plus支持其他动态重新配置机制 –它可以使用DNS从注册表中获取有关服务实例的信息,并且提供用于远程重新配置的API。
在以后的博客文章中,我们将继续深入探讨微服务的其他方面。注册NGINX邮件列表(下面的表格),以通知该系列中将来文章的发布。
网友评论