我正在尝试使用带有 netflix 插件(例如 Hystrix、Eureka 和 Ribbon)的 Spring Cloud 制作一个基本项目,以了解它是如何工作的。我正在尝试制作的项目是一个简单的消息服务器,它将保留消息。还有一个消息客户端,它只会向服务器询问消息,我想为此使用自动发现客户端或 RestTemplate 发现。但我不能让任何一个工作。
我有以下结构:
- 消息客户端(尤里卡客户端)
- 消息服务器(尤里卡客户端)
- 配置服务(配置服务器)
- 发现服务(尤里卡服务器)
我目前所做的是启动配置服务,并在所有这些“应用程序/客户端”通过以下结构连接时向所有这些“应用程序/客户端”公开 application.yml 详细信息:
- 配置服务\src\main\resources\config\appname.yml
- app\src\main\resources\bootstrap.yml(包含应用名称和云配置的 url)
这工作得很好,我的应用程序在它们从配置服务器接收的端口上启动,并且它们都连接到我的 eureka 服务器,并且它们都在那里可见。以及 Hystrix 故障转移也在工作,并不是说它与此有关,但它告诉我它不可能完全错误。
但是我的困惑来了......当在我的客户端模块内的服务类(@Service 注释)中使用@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);
}
}
消息客户端 - 消息客户端:
@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);
}
}
保存消息的消息服务器引导类与我的客户端具有相同的注释。
正如我所说,我的服务班找不到任何东西。这让我想到了所有的问题:
- 实际使用功能区负载平衡器需要什么?
- 我是否必须使用功能区才能使用“自动发现”,我想不是,但现在我很困惑。
- 据我了解,在使用 EnableEurekaClient 时,我也不需要使用 EnableDiscoveryClient 吗?
- 我可以在运行时为客户端更改配置服务器上的 yml 文件并且只需要重新启动客户端吗?
- 配置服务器真正要共享多少配置,因为目前我所有的客户端都只包含一个超级基本的 bootstrap.yml 文件。
- 有没有人有一个很好的链接,我可以在哪里阅读更多关于我的 yml 文件中设置的所有属性的信息?既有关于存在的属性实际作用的文档,也有关于如何将它们与 Spring Cloud 结合使用的一些文档?
- 我是否需要特定属性才能使我的应用程序/客户端能够找到其他应用程序/客户端?
编辑信息
感谢您快速而出色的回复,我今天一遍又一遍地经历了这个,终于让我的应用程序正常工作了。问题(我不明白为什么,希望你能帮助我理解)是我的发现服务包含我的每个其他客户端的 yml 文件,我在其中指定端口和 eureka 信息等内容。我在这里指定的是:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
所以,当我设置这个值时,它似乎覆盖了一些使我的服务发现不起作用的东西。即使我可以在尤里卡服务器中看到我的所有应用程序,当我设置这个值时,它们也无法找到彼此。
我通过在配置服务中有一个 message-server.yml 文件来设置此值,该文件在引导后发送到我的消息服务器应用程序。
那么我有两个新问题。
- 如何覆盖此 eureka 服务器属性?
- 当我设置这个值时,为什么我的发现客户端停止工作,它实际上是做什么的?