注释@RibbonClient不能与RestTemplate一起使用

时间:2016-03-22 12:38:55

标签: spring-cloud spring-cloud-netflix

我正在尝试使用基于bookmark service example的RestTemplate进行功能区配置,但没有运气,这是我的代码:

@SpringBootApplication
@RestController
@RibbonClient(name = "foo", configuration = SampleRibbonConfiguration.class)
public class BookmarkServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookmarkServiceApplication.class, args);
    }

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/hello")
    public String hello() {
        String greeting = this.restTemplate.getForObject("http://foo/hello", String.class);
        return String.format("%s, %s!", greeting);
    }
}

错误页面如下:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Mar 22 19:59:33 GMT+08:00 2016
There was an unexpected error (type=Internal Server Error, status=500).
No instances available for foo

但如果我删除注释@RibbonClient,一切都会好的,

@RibbonClient(name = "foo", configuration = SampleRibbonConfiguration.class)

这里是SampleRibbonConfiguration实现:

public class SampleRibbonConfiguration {

  @Autowired
  IClientConfig ribbonClientConfig;

  @Bean
  public IPing ribbonPing(IClientConfig config) {
    return new PingUrl();
  }

  @Bean
  public IRule ribbonRule(IClientConfig config) {
    return new AvailabilityFilteringRule();
  }
}

是因为RibbonClient无法与RestTemplate一起使用吗?

另一个问题是,可以通过application.yml配置文件配置像负载均衡规则这样的功能区配置吗? 从Ribbon wiki开始,似乎我们可以在属性文件中配置NFLoadBalancerClassName,NFLoadBalancerRuleClassName等功能区参数,Spring Cloud是否也支持此功能?

1 个答案:

答案 0 :(得分:0)

我将假设您正在使用Eureka进行服务发现。

您的特定错误:

No instances available for foo

可能由于几个原因而发生

1。)所有服务都已关闭

foo服务的所有实例都可能合法地为DOWN。

解决方案:尝试访问您的Eureka信息中心并确保所有服务实际上都已启用。

如果您在本地运行,则Eureka信息中心位于http://localhost:8761/

2.)等待心跳

当您 第一次 通过Eureka注册服务时,服务已启动但不可用的时间段。从文档

  

在客户端发现服务之前,服务不可用于发现   实例,服务器和客户端都具有相同的元数据   他们的本地缓存(所以它可能需要3次心跳)

解决方案:在您开始foo服务之后等待30秒,然后再尝试通过您的客户端进行呼叫。

在您的特定情况下,我猜测#2很可能是您发生的事情。您可能正在启动该服务并尝试立即从客户端调用它。

当它不起作用时,您停止客户端,进行一些更改并重新启动。到那个时候,所有的心跳已经完成,现在你的服务已经可用。

第二个问题。查看" 使用属性自定义功能区客户端"参考文档中的部分。 (link)