spring-cloud 环境中的分布式 Rabbitmq

Posted

技术标签:

【中文标题】spring-cloud 环境中的分布式 Rabbitmq【英文标题】:Distributed Rabbitmq within a spring-cloud environment 【发布时间】:2016-06-04 15:32:49 【问题描述】:

我正在尝试使用以下组件基于当前 spring-cloud 版本(主要是 Netflix OSS)设置分布式系统

1 个或多个云配置服务器 1 个或多个 Eureka 服务器 1 个或多个使用 Eureka 和 Config Server 客户端的服务

上面的设置很容易上手,但是一旦您开始着手设置,以便云配置服务器中的配置更改自动触发实际客户端值的更改,事情就会变得更加复杂。

据我了解,要使这样的功能发挥作用,应该将 spring-cloud-bus 客户端引入到服务中,而这些服务又将使用,目前唯一支持的实现是 rabbitmq 服务器(实际的 rabbitmq 二进制文件,而不是一些 spring-启动应用程序(如 eureka 或 Config 服务器)以允许 Config 服务器中的更改事件自动传播到客户端。

设置这样一个系统听起来违反直觉,并且必须将地址硬编码到客户端中的rabbitmq服务器(即使将rabbitmq服务器的数量或多或少保持不变)。

应该如何在 Eureka 服务发现服务器中注册 rabbitmq 服务器实例,以允许客户端在启动之前无需了解它们的位置就可以找到它们?

鉴于 rabbitmq 不是 spring-cloud 组件,我似乎找不到任何有关如何完成此操作的文档。事实上,关于如何将rabbitmq + eureka + spring-cloud-bus 一起设置的文档似乎很少。

【问题讨论】:

你将 rabbitmq 信息放在配置服务器中。 Brixton的bus也支持redis和kafka。 您的意思是将rabbitmq服务器的地址硬编码为配置服务器中的属性?我认为这与在应用程序中对它进行硬编码没有太大不同,而且它还能如何工作?配置服务器本身需要该信息来推送创建鸡/蛋问题的事件。是的,Brixton 支持其他人,但它处于里程碑版本之下,目前在技术上尚未准备好生产。 它与应用程序中的硬编码兔子有很大不同。没有,鸡和蛋的问题。在第一次连接到 rabbitmq 之前,从配置服务器检索配置。本项目使用总线github.com/spring-cloud-samples/customers-stores。通过引导完成配置docs.spring.io/spring-boot/docs/current/reference/html/… 是的,但是如果配置服务器中配置的 rabbitmq 实例出现故障,并且是全新的实例,没有在任何地方配置,例如,我们会被重新启动。由于rabbitmq实例没有服务发现,配置服务器和服务将不再能够通过总线进行通信,因为他们不知道新后端实例的地址,这是我的理解在分布式系统中应该解决的问题。这就是我感到困惑的地方。 因为我们正在研究一个分布式系统,其中实例可以随意上下更改 IP,总线后端不应该也在 Eureka 上注册,而不是在配置服务器上硬编码地址,这可能不再是一定时间后有效? 【参考方案1】:

我知道我在问一个非常古老的问题,尽管我认为值得对未来阅读此文章的人发表评论。

大多数云服务,以 AWS 为例,都有Elastic IP 解决方案——因此您可以为 RabbitMQ 服务器配置 IP,并且无论实例是否发生变化,IP 始终属于 RabbitMQ。您可以将弹性 IP 重新附加到不同的实例。

它与 Elastic Load Balancer 的工作方式几乎相同,它保留其 IP,因此您可以使用 Spring Cloud Config Server 将微服务配置为特定 IP - 并扩展 RabbitMQ 实例而无需担心配置更改。

【讨论】:

以上是关于spring-cloud 环境中的分布式 Rabbitmq的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud项目搭建

环境搭建系列笔记-目录

JMS

what is spring-cloud

dubbo&hsf&spring-cloud简单介绍

spring-Cloud 学习目录