spring-cloud 和ribbon 可以进行基于DNS的负载均衡吗?

Posted

技术标签:

【中文标题】spring-cloud 和ribbon 可以进行基于DNS的负载均衡吗?【英文标题】:Can spring-cloud and ribbon perform DNS-based load balancing? 【发布时间】:2018-03-14 12:44:14 【问题描述】:

Cloudfoundry 计划添加对映射到多个 IP(每个应用容器实例一个)的 DNS A 记录的支持,请参阅 docs-proposal。我想知道spring-cloud discovery结合ribbon是否可以支持基于DNS的客户端负载均衡。

spring-cloud DiscoveryClient 好像不做DNS解析,它管理host names

功能区负载平衡库通过 ListOfServers 属性支持 FQDN 列表。

但我无法找到与指定服务器的 DNS 查找相关的文档:即,如果 DNS A/AAA 记录(从 ListOfServers 获取)返回多个 IP 地址,功能区是否会跨 IP 地址进行负载平衡?

我需要在哪里配置 DNS 缓存指令?这是在 java.security 支持中的 JVM 范围,还是我可以将其作为客户端幻灯片负载平衡选项(来自功能区)进行管理?

【问题讨论】:

【参考方案1】:

Ribbon 不执行任何 DNS 查找,它按原样从 ServerList 中返回一个条目(IP 或名称)。

您不需要 Ribbon 来实现基于 DNS 的负载平衡;操作系统解析器将在每次查找的可用 IP 地址之间轮换。只要确保不缓存 DNS。

对于更复杂的负载平衡,您需要将 DNS 解析为 IP 列表,然后将其传递给 Ribbon。

【讨论】:

【参考方案2】:

如果你使用的是spring cloud eureka服务,每个服务实例都会在eureka注册。这意味着您可以在同一主机上托管同一服务的多个实例,并且 eureka 知道每一个服务。

如果您将功能区用于基于客户端的负载平衡,那么功能区会查询 eureka 以获取服务的所有实例,并了解服务的每个实例。

这样,ribbon 可以选择连接到每个实例。 因此,不需要多个 DNS A 记录。使用多个 DNS A 记录会适得其反,因为功能区无法再通过 DNS 区分服务的多个实例。在这种情况下,我建议将 eureka.instance.preferIpAddress 设置为 true,以区分多个实例。

据我所知,ribbon 支持 2 种工作模式,RoundRobinRule 和 AvailabilityFilteringRule。

您可以在“Spring 微服务”一书中找到很好的介绍。

【讨论】:

以上是关于spring-cloud 和ribbon 可以进行基于DNS的负载均衡吗?的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud: eureka之:ribbon负载均衡配置

干货分享微服务spring-cloud(4.负载均衡ribbon与熔断器hystrix)

spring-cloud: eureka之:ribbon负载均衡自定义配置

实例关闭时Spring-cloud Zuul重试

Spring-cloud Hystrix入门

spring-cloud-2.x(服务消费者)