Настройка одноранговой осведомленности для сервера Eureka на базе Spring Cloud Netflix
Я создаю сервер Eureka, используя Spring Cloud Netflix. Сервер работает, поэтому в настоящее время я пытаюсь добавить второй сервер Eureka для повышения устойчивости и обеспечения резервного сервера при обновлении сервера.
http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html делает этот звук довольно простым: вам просто нужно настроить свой сервер, как сами клиенты Eureka. Поэтому я добавил в свою конфигурацию bootstrap.yml для клиента:
eureka:
client:
serviceUrl:
defaultZone: http://user:password@172.31.7.240:8762/eureka/
Насколько я могу судить, это идентично конфигурации, используемой в настоящее время моими другими клиентами eureka. Я предположил, что это сработает. Но вместо этого я получаю странное исключение:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'discoveryManagerIntitializer': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.netflix.discovery.EurekaClientConfig org.springframework.cloud.netflix.eureka.DiscoveryManagerInitializer.clientConfig; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eurekaClientConfigBean': Could not bind properties to [unknown] (target=eureka.client, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'eureka.client' on field 'serviceUrl': rejected value [http://user:password@172.31.7.240:8762/eureka/]; codes [typeMismatch.eureka.client.serviceUrl,typeMismatch.serviceUrl,typeMismatch.java.util.Map,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [eureka.client.serviceUrl,serviceUrl]; arguments []; default message [serviceUrl]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Map' for property 'serviceUrl'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Map] for property 'serviceUrl': no matching editors or conversion strategy found]
Field error in object 'eureka.client' on field 'serviceUrl': rejected value [http://user:password@172.31.7.240:8762/eureka/]; codes [typeMismatch.eureka.client.serviceUrl,typeMismatch.serviceUrl,typeMismatch.java.util.Map,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [eureka.client.serviceUrl,serviceUrl]; arguments []; default message [serviceUrl]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Map' for property 'serviceUrl'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Map] for property 'serviceUrl': no matching editors or conversion strategy found]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.emnos.registry.RegistryApplication.main(RegistryApplication.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
at java.lang.Thread.run(Thread.java:745)
Понятно, что мой URL действительно читается из конфигурации (у него появляется исключение). Но похоже, что он анализируется неправильно. Исключение говорит мне, что я использую String
для eureka.client.serviceUrl, когда я должен использовать Map
, Но я на самом деле использую Map
с парой ключ-значение defaultZone: http://user:password@172.31.7.240:8762/eureka/
,
Кто-нибудь видел подобное раньше и может сказать мне, что я делаю неправильно? Насколько я могу судить, я использую тот же синтаксис, который используется в документации Spring.
Редактировать:
Я только что обновился до Spring Boot 1.2.3.RELEASE и Spring Cloud Netflix 1.0.1.RELEASE, поэтому я должен использовать последнюю версию.
1 ответ
Разобрался после комментариев @DaveSyer.
На самом деле был другой источник свойств: переменные окружения. Переменная с именем EUREKA_CLIENT_SERVICE_URL
была определена непреднамеренная перезапись конфигурации из YAML. После того как я удалил / переименовал эту переменную, все начало работать.