![](/img/trans.png)
[英]Spring Cloud Config Server Circular Dependency With Netflix Eureka Discovery on Startup
[英]How can I get the Discovery Client working when using spring-cloud together with netflix Eureka?
我正在尝试使用带有netflix插件(如Hystrix,Eureka和Ribbon)的spring cloud创建一个基本项目,以了解其工作原理。 我正在尝试制作的项目是一个简单的消息服务器,它将保留消息。 一个消息客户端只询问服务器的消息,我想使用自动发现客户端或RestTemplate发现。 但我无法上班。
我有以下结构:
我目前所做的是启动配置服务,并在通过以下结构连接时将application.yml详细信息公开给所有这些“apps / clients”:
这工作正常,我的应用程序启动它们从配置服务器接收的端口,以及它们都连接到我的eureka服务器,并且所有这些都在那里可见。 除了Hystrix故障转移也起作用,并不是它与此相关,但它告诉我它不可能完全错误。
但是我的困惑是......在我的客户端模块中的服务类(@Service annotated)中使用@Autowired注释时,我得到了一个discoveryClient对象,但是我无法找到使用该对象的任何其他服务。
消息客户端 - 启动类:
@EnableAutoConfiguration
@EnableHystrix
@EnableEurekaClient
@ComponentScan("cloud.rest.resources, spring.cloud.client")
public class ClientBoot {
public static void main(String[] args) {
SpringApplication.run(ClientBoot.class, args);
}
}
消息客户端 - REST资源:
@RestController
public class MessageResource {
@Autowired
private MessageClient messageClient;
@RequestMapping(value = "/message/{client}", method = RequestMethod.GET)
public Message getMessage(@PathVariable String client) {
return messageClient.getMessage(client);
}
}
消息客户端 - MessageClient:
@Service
public class RestMessageClient implements MessageClient {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Override
public Message getMessage(String client) {
return restTemplate.getForObject(String.format("http://message-server/message/%s", client), Message.class);
}
}
我保留消息的消息服务器引导类与我的客户端具有相同的注释。
正如我所说,我的服务类无法找到任何东西..这引出了我所有的问题:
编辑信息
感谢您的快速和出色的回复,我今天经历了一遍又一遍,我终于让我的应用程序正常工作..问题(我无法理解为什么,希望你能帮我理解)是我的发现服务包含我的每个其他客户端的yml文件,我指定了端口和尤里卡信息等内容。我在这里指定的是:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
因此,当我设置此值时,它似乎覆盖了使我的服务发现无法工作的东西。即使我可以在eureka服务器中看到我的所有应用程序,但是当我设置此值时,他们无法找到彼此。
我通过在配置服务中使用message-server.yml文件来设置此值,该文件在引导程序之后发送到我的消息服务器应用程序。
那么我有两个新问题。
实际使用色带负载平衡器需要什么?
色带负载平衡器必须位于类路径上(例如,通过“spring-cloud-starter-ribbon”)。 然后你可以注入一个作为LoadBalancerClient
或者你可以注入一个RestTemplate
(如果你有一个LoadBalancerClient
,它将是负载均衡器)。
我是否必须使用功能区才能使用“自动发现”,我想不会,但现在我只是感到困惑。
什么是“自动发现”? 您不需要使用功能区来使用DiscoveryClient
(功能区是负载均衡器,而不是服务注册表)。
根据我的理解,当使用EnableEurekaClient时,我也不需要使用EnableDiscoveryClient?
正确。 @EnableEurekaClient
使用@EnableDiscoveryClient
注释,因此它仅用于表示首选项。
我可以在运行时为客户端更改配置服务器上的yml文件,只需重新启动客户端吗?
是。 或者您可以使用/ refresh或/ restart端点(完全重启可能是最好的生产,至少定期)。
配置服务器实际上要分配多少配置,因为目前我的所有客户端都只包含一个超级基本的bootstrap.yml文件。
尽你所能。 一段绳子有多长? 如果我是你,我会尝试将中央配置保持在最低限度(仅在环境之间或运行时更改的内容)。
有没有人有一个很好的链接,我可以阅读更多关于我的yml文件中设置的所有属性? 既存在实际存在的属性的文档,也包含有关如何将它们与spring cloud结合使用的文档?
Spring Boot和Spring Cloud具有自动生成的外部化属性元数据。 新一代IDE了解它们(因此获得STS 3.6.4或IDEA 14.1),它们在http://docs.spring.io/spring-boot/docs的用户指南(至少为Spring Boot)中列出/电流/参考/ htmlsingle /#常见的应用程序的属性
我是否需要特定属性才能使我的应用/客户端找到其他应用/客户端?
您需要能够找到您的服务注册表(在本例中为Eureka)。 如果您使用Eureka并且您的客户已经注册,那就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.