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

时间:2015-03-11 15:19:16

标签: java spring spring-cloud netflix-eureka

我正在尝试使用Spring云与netflix插件(如Hystrix,Eureka和Ribbon)进行基本项目,以了解其工作原理。我试图制作的项目是一个简单的消息服务器,可以保留消息。一个消息客户端只询问服务器的消息,我想使用自动发现客户端或RestTemplate发现。但我无法上班。

我有以下结构:

  • message-client(eureka client)
  • message-server(eureka client)
  • configuration-service(配置服务器)
  • discovery-service(尤里卡服务器)

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

  • 配置服务\ SRC \主\资源\配置\ appname.yml
  • app \ src \ main \ resources \ bootstrap.yml(包含云配置的appname和url)

这工作正常,我的应用程序启动它们从配置服务器接收的端口,以及它们都连接到我的eureka服务器,所有这些都在那里可见。除了Hystrix故障转移也起作用,并不是因为它与此有关,但它告诉我它不可能完全错误。

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

Message Client - 启动类:

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

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

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

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

    感谢您的快速和出色的回复,我今天一遍又一遍地经历了这一切,我终于让我的申请工作了...... 问题(我无法理解为什么并且希望你能帮助我理解)是我的发现服务包含我的每个其他客户端的yml文件,我在其中指定端口和尤里卡信息之类的东西..我在这里指定的是什么同样是:

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

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

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

    那么我有两个新问题。

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

1 个答案:

答案 0 :(得分:11)

  

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

色带负载均衡器必须位于类路径上(例如,通过“spring-cloud-starter-ribbon”)。然后你可以注入一个LoadBalancerClient,或者你可以注入一个RestTemplate(如果你有一个LoadBalancerClient,它将是负载均衡器。)

  

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

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

  

根据我的理解,当使用EnableEurekaClient时,我也不需要使用EnableDiscoveryClient吗?

正确。 @EnableEurekaClient使用@EnableDiscoveryClient进行注释,因此只能表达偏好。

  

我可以在运行时为客户端更改配置服务器上的yml文件,只需重新启动客户端吗?

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

  

配置服务器真正需要共享多少配置,因为目前我的所有客户端都只包含一个超级基本的bootstrap.yml文件。

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

  

有没有人有一个很好的链接,我可以阅读更多关于我的yml文件中设置的所有属性?既存在实际存在的属性的文档,也包含有关如何将它们与spring spring结合使用的文档?

Spring Boot和Spring Cloud为外部化属性自动生成了元数据。新一代IDE了解它们(因此得到STS 3.6.4或IDEA 14.1),它们列在用户指南中(至少用于Spring Boot)http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties

  

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

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