Spring 微服务/REST容错通信

Spring 微服务/REST容错通信,spring,rest,Spring,Rest,我有一些微服务(带rest模板的SpringMVC),它们通过rest相互通信(主要是异步的) 问题是,我想给系统增加一些容错能力;e、 g.如果一个微服务关闭,而另一个系统发出请求,则该请求应稍后自动重试 所以,基本上我在寻找某种REST代理,它: 消耗REST请求 尝试将邮件传递给其收件人 如果传递失败,将稍后重试 是否有用于此的项目/库 谢谢, krisy如果您使用docker并在多台主机上使用某种形式的容器编排(如docker swarm、kubernetes…),那么您可以让每个微

我有一些微服务(带rest模板的SpringMVC),它们通过rest相互通信(主要是异步的)

问题是,我想给系统增加一些容错能力;e、 g.如果一个微服务关闭,而另一个系统发出请求,则该请求应稍后自动重试

所以,基本上我在寻找某种REST代理,它:

  • 消耗REST请求
  • 尝试将邮件传递给其收件人
  • 如果传递失败,将稍后重试
是否有用于此的项目/库

谢谢,
krisy

如果您使用docker并在多台主机上使用某种形式的容器编排(如docker swarm、kubernetes…),那么您可以让每个微服务的多个副本运行、故障后自动恢复、副本之间的负载平衡和无缝网络(不需要服务器IP,只需要微服务名称)

但是,这也增加了运行同一应用程序的多个副本的复杂性(数据一致性…)

但是,您可以让swarm(多个服务器)运行,每个服务都有一个副本,数据保存在某个外部数据库或文件系统上。然后,当其中一个服务器死亡或其中一个服务遇到问题时,一个新实例将启动,所有请求都将等待此启动(同样,服务之间不知道彼此的IP,只知道它们想要与之通信的服务的名称,编排器负责链接服务)


在最简单的设置中,您还可以拥有一个只有一台服务器的swarm,并将任何内容存储在本地数据库或文件系统上。美妙的是,您的设置将已经使用一种能够扩展的技术构建。

如果您使用docker并具有某种形式的容器编排(如docker swarm、kubernetes…)在多台主机上,您可以运行每个微服务的多个副本,故障后自动恢复,副本之间的负载平衡,以及无缝网络(不需要服务器IP,只需要微服务名称)

但是,这也增加了运行同一应用程序的多个副本的复杂性(数据一致性…)

但是,您可以让swarm(多个服务器)运行,每个服务都有一个副本,数据保存在某个外部数据库或文件系统上。然后,当其中一个服务器死亡或其中一个服务遇到问题时,一个新实例将启动,所有请求都将等待此启动(同样,服务之间不知道彼此的IP,只知道它们想要与之通信的服务的名称,编排器负责链接服务)


在最简单的设置中,您还可以拥有一个只有一台服务器的swarm,并将任何内容存储在本地数据库或文件系统上。美妙的是,您的设置将已经使用一种能够扩展的技术构建。

您可以查看Spring提供的现成解决方案:Spring Cloud+Eureka+Hystrix+Zuul+Ribbon
您还可以将spring retry与@Retryable@Recover注释一起使用。

您可以查看spring的现成解决方案:spring Cloud+Eureka+Hystrix+Zuul+Ribbon
您也可以将spring retry与@Retryable@Recover注释一起使用。

这听起来像是一个消息服务,或者您必须使用队列编写代码。如果预计它的容量非常大,数据量很大,那么将所有rest调用写入数据库,并编写一个守护进程线程,读取数据库表并更新标志,然后调用rest se如何服务。(线程的实现可以读取源目标、请求数据和响应数据)。当然,定期清理该表。看一看,它们提供重试功能。对于持久重试,正如@surya所述,消息代理更合适,客户端解决方案可以做到这一点-我考虑使用代理的主要原因是,某些微服务不太可靠,因此它们可能会崩溃(第三方代理也可能崩溃——但可能性不大);所以Ribbon可能很好,如果它有某种持久性存储策略的话。消息代理很好,但我找不到任何实现,可以通过rest轻松使用。听起来像是消息服务,或者你必须使用队列来编写代码。如果它的数据量非常大,那么写所有rest怎么样调用数据库并编写一个守护进程线程,该线程读取数据库表并在读取后更新标志,并调用rest服务。(线程的实现可以读取源目标、请求数据和响应数据)。当然,定期清理该表。看一看,它们提供重试功能。对于持久重试,正如@surya所述,消息代理更合适,客户端解决方案可以做到这一点-我考虑使用代理的主要原因是,某些微服务不太可靠,因此它们可能会崩溃(第三方代理也可能崩溃——但可能性不大);所以Ribbon可能很好,如果它有某种持久性存储策略的话。消息代理很好,但我找不到任何可以通过RESTI轻松使用的实现。我刚刚发现Spring retry,这似乎是一个非常好的项目(我想知道为什么它不在Spring core中…?)-但是我宁愿有另一个微服务或持久的客户端解决方案,而不是内存中的客户端解决方案。我刚刚发现Spring retry,这似乎是一个非常好的项目(我想知道为什么它不在Spring core中…?)但是,不是内存中的客户端解决方案,我宁愿拥有另一个微服务或一个持久的客户端解决方案。嗯,是的,这似乎是一个很棒的想法-但我正在考虑一个“更小”的解决方案:-那么,也许考虑一个机器上的一个群体,一个副本的一切。