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