8

我正在尝试使用带有 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);
    }
}

保存消息的消息服务器引导类与我的客户端具有相同的注释。

正如我所说,我的服务班找不到任何东西。这让我想到了所有的问题:

  1. 实际使用功能区负载平衡器需要什么?
  2. 我是否必须使用功能区才能使用“自动发现”,我想不是,但现在我很困惑。
  3. 据我了解,在使用 EnableEurekaClient 时,我也不需要使用 EnableDiscoveryClient 吗?
  4. 我可以在运行时为客户端更改配置服务器上的 yml 文件并且只需要重新启动客户端吗?
  5. 配置服务器真正要共享多少配置,因为目前我所有的客户端都只包含一个超级基本的 bootstrap.yml 文件。
  6. 有没有人有一个很好的链接,我可以在哪里阅读更多关于我的 yml 文件中设置的所有属性的信息?既有关于存在的属性实际作用的文档,也有关于如何将它们与 Spring Cloud 结合使用的一些文档?
  7. 我是否需要特定属性才能使我的应用程序/客户端能够找到其他应用程序/客户端?

编辑信息

感谢您快速而出色的回复,我今天一遍又一遍地经历了这个,终于让我的应用程序正常工作了。问题(我不明白为什么,希望你能帮助我理解)是我的发现服务包含我的每个其他客户端的 yml 文件,我在其中指定端口和 eureka 信息等内容。我在这里指定的是:

eureka:
    client:
        serviceUrl:
            defaultZone: http://localhost:8761/eureka

所以,当我设置这个值时,它似乎覆盖了一些使我的服务发现不起作用的东西。即使我可以在尤里卡服务器中看到我的所有应用程序,当我设置这个值时,它们也无法找到彼此。

我通过在配置服务中有一个 message-server.yml 文件来设置此值,该文件在引导后发送到我的消息服务器应用程序。

那么我有两个新问题。

  1. 如何覆盖此 eureka 服务器属性?
  2. 当我设置这个值时,为什么我的发现客户端停止工作,它实际上是做什么的?
4

1 回答 1

11

实际使用功能区负载平衡器需要什么?

功能区负载平衡器必须在类路径上(例如通过“spring-cloud-starter-ribbon”)。然后你可以注入一个作为 aLoadBalancerClient或者你可以注入 a RestTemplate(如果你有 a ,它将是负载均衡器感知的LoadBalancerClient)。

我是否必须使用功能区才能使用“自动发现”,我想不是,但现在我很困惑。

什么是“自动发现”?你不需要使用 Ribbon 来使用DiscoveryClient(Ribbon 是负载均衡器,而不是服务注册表)。

据我了解,在使用 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)中/current/reference/htmlsingle/#common-application-properties

我是否需要特定属性才能使我的应用程序/客户端能够找到其他应用程序/客户端?

您需要能够找到您的服务注册表(在本例中为 Eureka)。如果您正在使用 Eureka 并且您的客户已经注册,那么这就足够了。

于 2015-03-11T16:55:32.877 回答