使用 Consul 实现高可用性的 Spring Cloud

Posted

技术标签:

【中文标题】使用 Consul 实现高可用性的 Spring Cloud【英文标题】:Spring Cloud with Consul for High Availability 【发布时间】:2016-08-18 21:16:17 【问题描述】:

我有一个设置,我正在从 docker swarm 覆盖网络中部署一个 spring-cloud-consul 应用程序。在我的覆盖网络中,我在每个节点上创建了领事图像。当我启动 spring-cloud-consul 应用程序时,我必须指定它应该与之通信的 consul 代理的主机名,例如“discovery”,以便它可以宣传自己并查询服务发现。这里的问题是每个容器都在查询同一个领事代理。当我删除这个特定的领事代理时,功能区 DiscoveryClient 似乎依赖于自己的缓存,而不是使用其他领事节点之一。

使用 spring-cloud-consul 和 consul 启动微服务应用程序的正确方法是什么,以便它们不依赖于一个固定的 consul 代理。

我想过尝试的解决方案:

    拥有多个撰写文件并指定不同的领事代理。 不知何故,让 docker 映像识别它所在的节点,然后将自身设置为使用该节点本地的领事代理。 (目前还不确定如何实现。) 将 consul 代理与 spring-boot 应用程序打包在一起。

感谢您的帮助。

【问题讨论】:

来自consul.io/docs/agent/basics.html "代理必须在属于 Consul 集群的每个节点上运行。" IMO 在每个节点上运行一个代理,在每个 docker 容器中运行一个代理。 那将是选项 3。但我觉得这有点破坏微服务封装。它还使打包这些图像变得更加困难,因为这需要扩展 consul 图像,确保存在 spring 的 java 要求,然后运行这两个服务。然而,它确实提供了最高的可靠性,因为给定的领事代理宕机只会导致一个实例宕机。 “微服务封装”是什么意思? Consul 是一个单一的二进制文件。 这里的封装是指在一个容器中运行两个服务。在这种情况下,consul 和 java spring 可执行文件。然而,在这种情况下,consul 代理只为 java spring 应用程序提供服务,所以这可能不是问题。我将测试这种将 consul 和 java 可执行文件放在同一个容器中的方法。谢谢。 我想我不确定为什么不能将两个进程都放在一个容器中。 【参考方案1】:

consul 代理必须在集群中的每个节点上运行。不必在每个 docker 容器中运行 consul 代理,只需在每个节点上运行即可。您可以选择在每个节点上安装 consul 代理,或者在每个节点的 docker 容器中运行 consul 代理。

对于 docker 容器解决方案中的 consul 代理,您需要确保在启动其他容器之前运行 consul 代理容器。

有关在 docker 容器中以客户端模式运行 consul 代理的详细信息,请参阅:https://hub.docker.com/_/consul/ 并搜索以客户端模式运行 Consul 代理。这使用 --net=host 网络定义了代理容器,因此代理的行为就像它是本地安装的一样,当它实际上是在一个 docker 容器中时。

【讨论】:

以上是关于使用 Consul 实现高可用性的 Spring Cloud的主要内容,如果未能解决你的问题,请参考以下文章

Consul高可用集群

基于Consul的数据库高可用架构

跟大家介绍一下关于Spring Cloud Consul

跟大家介绍一下关于Spring Cloud Consul

跟大家介绍一下关于Spring Cloud Consul

跟大家介绍一下关于Spring Cloud Consul