0

我正在尝试使用基于书签服务示例的 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 配置?从Ribbon wiki看来,我们可以在属性文件中配置 NFLoadBalancerClassName、NFLoadBalancerRuleClassName 等 Ribbon 参数,Spring Cloud 是否也支持这个?

4

1 回答 1

2

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

您的特定错误:

No instances available for foo

可能有几个原因

1.) 所有服务都已关闭

您的服务的所有实例都foo可以合法地关闭。

解决方案:尝试访问您的 Eureka Dashboard 并确保所有服务实际上都已启动。

如果你在本地运行,Eureka Dashboard 位于http://localhost:8761/

2.) 等待心跳

当你第一次通过 Eureka 注册服务时,有一段时间服务是 UP 但不可用。从文档

在实例、服务器和客户端在其本地缓存中都有相同的元数据之前,客户端无法发现服务(因此可能需要 3 个心跳)

解决方案:在启动服务后等待 30 秒,foo然后再尝试通过客户端调用它。

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

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

对于你的第二个问题。查看参考文档中的“使用属性自定义功能区客户端”部分。(关联)

于 2017-03-25T21:46:24.380 回答