当前位置: 首页 > 知识库问答 >
问题:

spring cloud with RestTemplate//Ribbon/Eureka-服务器不可用时重试

太叔天宇
2023-03-14

我成功地使用Eureka让我的RestTemplate客户端发现远程服务,并使用Ribbon将调用转发给它,如文档中所述。基本上,只需为我的应用程序类添加以下注释,然后让Spring Boot的魔力完成其余部分:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableDiscoveryClient

(注:您注意到我使用的是spring云:1.0.0-SNAPSHOT-BUILD,而不是1.0.0.M3-但这似乎不会影响我的问题)。

当两个服务实例启动时,rest模板客户端成功地在两者之间进行负载平衡请求。但是,如果第一个实例在Eureka负载均衡器注意到之前停止,客户端将不会回退到第二个实例,而是抛出异常。

因此,我的问题是:如果第一个选择的实例不可用,是否有办法配置RestTemplate/Ribbon/Eureka堆栈来自动重试对另一个实例的调用?Zuul proxy和外国客户都是“开箱即用”的,所以我相信这个库包含了必要的功能。。。

有什么想法/提示吗?

谢谢 /Bertrand

共有2个答案

宁修永
2023-03-14

由于拦截器的顺序,无论@Configuration类或@Retryable方法的注释顺序如何,我都无法让它同时与@HystrixCommand和@Retryable一起工作。我通过创建另一个具有匹配方法集的类来解决这个问题,并让@HystrixCommand注释方法委托给第二个类中相应的@Retryable方法。您可能会让这两个类实现相同的接口。这有点麻烦,但在可以配置顺序之前,这是我能想到的全部。仍在等待Dave Syer和Spring Cloud家伙的真正解决方案

public class HystrixWrapper {
    @Autowired
    private RetryableWrapper retryableWrapper;

    @HystrixCommand
    public Response doSomething(...) {
        return retryableWrapper.doSomething(...);
    }
}

public class RetryableWrapper {
    @Autowired
    private RestTemplate restTemplate;

    @Retryable
    public Response doSomething(...) {
        // do something with restTemplate;
    }
}
云星波
2023-03-14

RestTemplate支持本身不知道如何重试(正如您所注意到的,Spring Cloud中的外部客户端和代理支持知道)。我认为这可能是一件好事,因为它为您提供了自己添加它的选项。例如,使用Spring Retry,您可以使用简单的声明式样式来执行此操作:

@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

(并将@EnableRetry添加到您的@Configuration)。它与@HystrixCommand(来自Spring Cloud/Javanica)进行了很好的组合:

@HystrixCommand
@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

在这种形式下,即使重试成功,每一次失败都会计入断路器指标(也许我们可以改变这一点,或者让它保持这样是有意义的)。

 类似资料:
  • 我正在使用带有 netflix 堆栈和 Spring 启动的微服务构建一个应用程序。困扰我的一件事是,我还没有集成测试,我可以在其中模拟周围的服务。 因此,我有一个服务 A,它是一个带有功能区的尤里卡客户端,用于在呼叫期间将尤里卡名称解析为已注册服务 B 的 URL。 所以理想情况下,我想用 spring boot 的 integrationtest 注释启动应用程序,使用 wiremock 模拟

  • 我在一个微服务体系结构中工作,其工作原理如下 我有两个服务Web应用程序(REST服务),在eureka服务器中正确注册自己,然后我有一个客户端应用程序,获取eureka注册表,并使用ribbon作为客户端负载均衡器,确定哪个服务应用程序去(目前,一个简单的正在使用圆形罗宾)。 我的问题是,当我停止其中一个服务应用程序(它们目前在docker容器中运行)时,eureka不会将它们从注册表中删除(似

  • 本文向大家介绍Spring Cloud EureKa Ribbon 服务注册发现与调用,包括了Spring Cloud EureKa Ribbon 服务注册发现与调用的使用技巧和注意事项,需要的朋友参考一下 概述 用一个简单的例子演示Spring Cloud中EureKa和Ribbon的基本用法。 版本和环境 IDEA Spring Boot 1.5.·0 JDK 1.8 Maven 3 构建eu

  • 我用Ribbon和Netflix Eureka创建了一个简单的项目。尤里卡运作良好,我可以看到所有注册服务。但是,Ribbon负载平衡器看不到这些服务。实际上,在它打印的日志中,它在“当前服务器列表”中看到了服务器,但是我得到一个例外,没有找到任何实例。如果能给我一些提示,我将不胜感激,我花了很多时间(甚至几天)才弄明白。 日志(我用

  • 我正在使用Spring Cloud和Netflix OSS Eureka和Ribbon开发微服务。我有另一个服务作为oauth-server运行,它提供OAuth2令牌。我的所有微服务都向Eureka注册,包括oauth-server。如果我使用oauth-server的硬编码url作为“clientCredentialsResourceDetails.setAccessTokenUri(”htt

  • 如何包含Eureka服务器 要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。 如何运行Eureka服务器 示例eureka服务器; @SpringBoot