Envoy架构概览(3):服务发现

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Envoy架构概览(3):服务发现

服务发现

在配置中定义上游群集时,Envoy需要知道如何解析群集的成员。这被称为服务发现。


支持的服务发现类型


静态的

静态是最简单的服务发现类型。配置明确指定每个上游主机的已解析网络名称(IP地址/端口,unix域套接字等)。


严格的DNS

当使用严格的DNS服务发现时,Envoy将持续并异步地解析指定的DNS目标。 DNS结果中的每个返回的IP地址将被视为上游群集中的显式主机。这意味着如果查询返回三个IP地址,Envoy将假定集群有三个主机,并且三个主机都应该负载平衡。如果主机从结果中删除,则Envoy认为它不再存在,并将从任何现有的连接池中汲取流量。请注意,Envoy绝不会在转发路径中同步解析DNS。以最终一致性为代价,永远不会担心长时间运行的DNS查询会受到阻塞。


逻辑DNS

逻辑DNS使用类似的异步解析机制严格DNS。但是,并不是严格考虑DNS查询的结果,而是假设它们构成整个上游集群,而逻辑DNS集群仅使用在需要启动新连接时返回的第一个IP地址。因此,单个逻辑连接池可以包含到各种不同上游主机的物理连接。连接永远不会流失。此服务发现类型适用于必须通过DNS访问的大型Web服务。这种服务通常使用循环法的DNS来返回许多不同的IP地址。通常会为每个查询返回不同的结果。如果在这种情况下使用严格的DNS,Envoy会认为集群的成员在每个解决时间间隔期间都会发生变化,这会导致连接池,连接循环等消失。相反,使用逻辑DNS,连接保持活动状态,直到它们循环。在与大型Web服务交互时,这是所有可能的世界中最好的:异步/最终一致的DNS解析,长期连接,以及转发路径中的零阻塞。


原始目的地

传入连接通过iptables REDIRECT规则或Proxy协议重定向到Envoy时,可以使用原始目标集群。在这些情况下,路由到原始目标群集的请求会按照重定向元数据转发给上游主机,而不需要任何明确的主机配置或上游主机发现。到上游主机的连接会被合并,未使用的主机在空闲时间超过* cleanup_interval_ms *时会被刷新,默认值为5000ms。如果原始目标地址不可用,则不会打开上游连接。原始目标服务发现必须与原始目标负载均衡器一起使用。


服务发现服务(SDS)

服务发现服务是Envoy用来获取集群成员的通用REST API。 Lyft通过Python发现服务提供了一个参考实现。该实现使用AWS DynamoDB作为后备存储,但是该API非常简单,可以轻松地在各种不同的后备存储之上实施。对于每个SDS群集,Envoy将定期从发现服务中获取群集成员。 SDS是首选的服务发现机制,原因如下:


  • Envoy对每个上游主机都有明确的了解(与通过DNS解析的负载均衡器进行路由相比),并能做出更智能的负载平衡决策。
  • 在每个主机的发现API响应中携带的附加属性通知Envoy负载平衡权重,金丝雀状态,区域等。这些附加属性在负载平衡,统计信息收集等过程中由Envoy网络全局使用。

通常,主动健康检查与最终一致的服务发现服务数据结合使用,以进行负载平衡和路由决策。这将在下一节进一步讨论。


最终一致的服务发现


许多现有的RPC系统将服务发现视为完全一致的过程。为此,他们使用完全一致的领导选举支持商店,如Zookeeper,etcd,Consul等。我们的经验是,大规模操作这些支持商店是痛苦的。


Envoy从一开始就设计了服务发现不需要完全一致的想法。相反,Envoy假定主机以一种最终一致的方式来自网格。我们推荐的部署服务以服务Envoy网格配置的方式使用最终一致的服务发现以及主动运行状况检查(Envoy显式健康检查上游集群成员)来确定集群运行状况。这种范例有许多好处:


所有的健康决定是完全分配的。因此,网络分区被优雅地处理(应用程序是否优雅地处理分区是另一回事)。

当为上游群集配置运行状况检查时,Envoy使用2x2矩阵来确定是否路由到主机:

Discovery Status HC OK HC Failed
Discovered Route Don’t Route
Absent Route Don’t Route / Delete


Host discovered / health check OK


Envoy将路由到目标主机。


Host absent / health check OK:


Envoy将路由到目标主机。 这是非常重要的,因为设计假定发现服务可以随时失败。 如果主机即使在发现数据缺失之后仍继续通过健康检查,Envoy仍将路由。 虽然在这种情况下添加新主机是不可能的,但现有的主机仍然可以正常运行。 当发现服务再次正常运行时,数据将最终重新收敛。


Host discovered / health check FAIL


Envoy不会路由到目标主机。 假设健康检查数据比发现数据更准确。


Host absent / health check FAIL


Envoy不会路由并将删除目标主机。 这是Envoy将清除主机数据的唯一状态。

相关文章
|
4月前
|
存储 负载均衡 算法
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第28天】在现代软件开发的复杂性中,微服务架构以其灵活性和可扩展性受到青睐。本文将深入探讨微服务架构的核心组件之一——服务发现与注册机制,分析其工作原理、实现方式及面临的挑战,并结合实际案例,为读者提供全面的理解和应用指南。
|
4月前
|
存储 负载均衡 数据库
探索微服务架构中的服务发现机制
【7月更文挑战第24天】在微服务架构的复杂网络中,服务发现是确保通信流畅与系统弹性的关键组件。本文将深入探讨服务发现的工作原理、面临的挑战以及解决方案,同时比较不同服务发现工具的性能特点,旨在为开发者提供实现高效服务发现的实战指南。
|
4月前
|
敏捷开发 设计模式 负载均衡
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第24天】在微服务架构的海洋中,服务发现与注册机制如同灯塔指引着航行的船只。本文将探索这一机制的重要性、实现原理以及面临的挑战,带领读者领略微服务架构中的关键导航系统。
|
4月前
|
存储 分布式计算 大数据
从零到一建设数据中台 - 架构概览
从零到一建设数据中台 - 架构概览
103 1
|
4月前
|
存储 负载均衡 开发者
深入理解微服务架构中的服务发现机制
【7月更文挑战第19天】在微服务架构的海洋中,服务发现是一艘至关重要的航船,它指引着各个微服务之间的通信与协作。本文将揭开服务发现的神秘面纱,探索其工作原理、实现方式及面临的挑战,为开发者提供清晰的导航,确保服务间的顺畅航行。
|
4月前
|
存储 缓存 负载均衡
微服务架构中的服务发现与注册中心实践
【7月更文挑战第26天】在微服务的海洋里,每个服务都是一座孤岛。要让这些孤岛彼此发现、相互通讯,就需要一个高效的信使系统——服务发现与注册中心。本文将深入探讨如何搭建和维护这一核心组件,确保微服务间的顺畅交流。
|
4月前
|
设计模式 存储 运维
微服务架构中的服务发现与注册中心设计模式
在现代软件工程实践中,微服务架构已成为构建灵活、可扩展系统的首选方案。本文将深入探讨微服务架构中至关重要的服务发现与注册中心设计模式。我们将从服务发现的基本原理出发,逐步解析注册中心的工作机制,并以Eureka和Consul为例,对比分析不同实现的优劣。文章旨在为开发者提供一套清晰的指导原则,帮助他们在构建和维护微服务系统时做出更明智的技术选择。
|
4月前
|
监控 负载均衡 安全
微服务架构下的服务发现与注册:技术深度解析
【7月更文挑战第20天】服务发现与注册是微服务架构中不可或缺的一部分,它确保了服务间的动态发现和通信。通过选择合适的实现工具和遵循最佳实践,可以构建出高效、可靠、可扩展的微服务系统。随着技术的不断进步,未来我们还将看到更多创新的服务发现与注册解决方案的出现。
|
4月前
|
敏捷开发 设计模式 监控
探索微服务架构中的服务发现机制
【7月更文挑战第20天】在微服务架构的海洋中,服务发现是一艘必不可少的航船,它指引着各个服务如何相互寻觅和沟通。本文将深入探讨服务发现的核心原理、主流解决方案以及在实际应用中的考量因素,为构建高效、稳定的微服务系统提供导航。
44 2
|
4月前
|
负载均衡 监控 Kubernetes
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。