将 spring-cloud 与 netflix Eureka 一起使用时,如何让 Discovery Client 正常工作?

How can I get the Discovery Client working when using spring-cloud together with netflix Eureka?

我正在尝试使用 spring 云和 Hystrix、Eureka 和 Ribbon 等 netflix 插件来创建一个基本项目,以了解其工作原理。我正在尝试制作的项目是一个简单的消息服务器,它将保留消息。还有一个消息客户端,它只会向服务器询问一条消息,我想为此使用自动发现客户端,或者 RestTemplate 发现。但我无法工作。

我有以下结构:

我目前所做的是启动配置服务,并在通过以下结构连接时向所有这些 "apps/clients" 公开 application.yml 详细信息:

这工作得很好,我的应用程序在它们从配置服务器接收到的端口上启动,并且它们都连接到我的 eureka 服务器,并且它们都在那里可见。以及 Hystrix 故障转移也在工作,不是说它与此有关,但它告诉我它不可能是完全错误的。

但是我的困惑来了... 在我的客户端模块内的服务 class(@Service 注释)中使用 @Autowired 注释时,我得到一个 discoveryClient 对象,但我无法找到任何其他使用该对象的服务。

消息客户端 - 启动 class:

@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);
    }
}

保存消息的我的消息服务器启动 class 与我的客户端具有相同的注释。

正如我所说,我的服务 class 找不到任何东西.. 这引出了我所有的问题:

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

已编辑信息

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

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

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

我通过在我的配置服务中有一个 message-server.yml 文件来设置这个值,该文件在 bootstrap..

之后发送到我的消息服务器应用程序

那么我有两个新问题。

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

What is required to actually use ribbon load balancer?

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

Do I have to use ribbon to be able to use the "auto discovery", I thought not but now I'm just confused.

什么是"auto discovery"?您不需要使用 Ribbon 来使用 DiscoveryClient(Ribbon 是负载均衡器,而不是服务注册中心)。

From what I've understood, when using EnableEurekaClient I should not need to use the EnableDiscoveryClient as well?

正确。 @EnableEurekaClient 带有 @EnableDiscoveryClient 注释,因此它仅用于表达偏好。

Can I change the yml files on my config-server for the clients in runtime and just have to reboot the client?

是的。或者您可以使用 /refresh 或 /restart 端点(完全重启可能是生产中最好的,至少定期重启)。

How much configuration is really meant to be shared by the config-server, because currently all of my clients just contain a super basic bootstrap.yml file.

随心所欲。一段绳子有多长?如果我是你,我会尝试将中央配置保持在最低限度(仅在环境之间或在运行时发生变化的事物)。

Does anyone have a good link to where I can read more about all the properties that is being set in my yml files? Both a documentation of what the properties that exists actually do as well as some documentation on how I can use them in combination with spring cloud?

Spring Boot 和 Spring Cloud 已为外部化属性自动生成元数据。新一代的 IDE 理解它们(因此获取 STS 3.6.4 或 IDEA 14.1),它们列在 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties

下的用户指南中(至少用于 Spring Boot)

Do I need specific properties to enable my apps/clients to find other apps/clients?

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