我正在尝试使用基于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是否也支持此功能?
答案 0 :(得分:0)
我将假设您正在使用Eureka进行服务发现。
您的特定错误:
No instances available for foo
可能由于几个原因而发生
foo
服务的所有实例都可能合法地为DOWN。
解决方案:尝试访问您的Eureka信息中心并确保所有服务实际上都已启用。
如果您在本地运行,则Eureka信息中心位于http://localhost:8761/
当您 第一次 通过Eureka注册服务时,服务已启动但不可用的时间段。从文档
在客户端发现服务之前,服务不可用于发现 实例,服务器和客户端都具有相同的元数据 他们的本地缓存(所以它可能需要3次心跳)
解决方案:在您开始foo
服务之后等待30秒,然后再尝试通过您的客户端进行呼叫。
在您的特定情况下,我猜测#2很可能是您发生的事情。您可能正在启动该服务并尝试立即从客户端调用它。
当它不起作用时,您停止客户端,进行一些更改并重新启动。到那个时候,所有的心跳已经完成,现在你的服务已经可用。
第二个问题。查看" 使用属性自定义功能区客户端"参考文档中的部分。 (link)