2015-06-22 9 views
5

Próbuję zbudować kod do naszej bazy pom, która automatycznie konfiguruje przeglądarkę Spring Cloud Config przez Eureka. Robimy to, aby uniknąć szablonowania właściwości .yml dla programistów budujących mikroserwisy. Na przykład, chcemy java config wszystkie zachowania wywołane z tych właściwości:Przeszukiwanie serwera Spring Cloud Configure za pomocą Eureka przy użyciu Java zamiast bootstrap.yml

spring: 
    application: 
    name: MyMicroservice 
    cloud: 
    config: 
     enabled: true 
    server: 
     prefix: /diagnostics/admin/config 
    failFast: true 
    discovery: 
     enabled: true 
     serviceId: echo 

management: 
    context-path: /diagnostics/admin 

eureka: 
    password: password 
    client: 
    serviceUrl: 
     defaultZone: http://user:${eureka.password}@localhost:8761/eureka/ 
    instance: 
    leaseRenewalIntervalInSeconds: 10 
    statusPageUrlPath: /diagnostics/admin/info 
    healthCheckUrlPath: /diagnostics/admin/health 

Po znacznie eksperymentowania, następujące podejście przeważnie działa za wyjątkiem Eureka odkrytej server config (nie powodując przesłoniętych właściwości konfiguracyjnych):

@Order(-1) 
public class AdditionalBootstrapPropertySourceLocator implements PropertySourceLocator { 

    @Override 
    public PropertySource<?> locate(Environment environment) { 
     Map<String, Object> theBootstrapYmlConfig = new HashMap<>(); 
     theBootstrapYmlConfig.put("spring.cloud.config.enabled", new Boolean(true)); 
     theBootstrapYmlConfig.put("spring.cloud.config.server.prefix", "/diagnostics/admin/config"); 
     theBootstrapYmlConfig.put("spring.cloud.config.failFast", new Boolean(true)); 
     theBootstrapYmlConfig.put("spring.cloud.config.discovery.enabled", new Boolean(true)); 
     theBootstrapYmlConfig.put("spring.cloud.config.discovery.serviceId", "echo"); 

     theBootstrapYmlConfig.put("management.context-path", "/diagnostics/admin"); 

     theBootstrapYmlConfig.put("eureka.client.serviceUrl.defaultZone", "http://user:[email protected]:8761/eureka/"); 
     theBootstrapYmlConfig.put("eureka.instance.leaseRenewalIntervalInSeconds", new Integer(10)); 
     theBootstrapYmlConfig.put("eureka.instance.statusPageUrlPath", "/diagnostics/admin/info"); 
     theBootstrapYmlConfig.put("eureka.instance.healthCheckUrlPath", "/diagnostics/admin/health"); 

     return new MapPropertySource("myExtraBootstrap", theBootstrapYmlConfig);  
    }  
} 

I wydaje mi się, trzeba to Bean także:

@ConditionalOnWebApplication 
@Configuration 
@Import(EurekaClientAutoConfiguration.class) 
public class WorkfrontDiscoveryClientConfigServiceBootstrapConfiguration { 

    @Bean 
    @ConditionalOnClass({ DiscoveryClient.class, ConfigServicePropertySourceLocator.class }) 
    @ConditionalOnMissingBean 
    DiscoveryClientConfigServiceBootstrapConfiguration discoveryClientConfigServiceBootstrapConfiguration() { 
     DiscoveryClientConfigServiceBootstrapConfiguration discoveryClientConfigServiceBootstrapConfiguration = 
       new DiscoveryClientConfigServiceBootstrapConfiguration(); 
     return discoveryClientConfigServiceBootstrapConfiguration; 
    } 

} 

Wreszcie kładę zarówno w spring.factories aby zostały one zbudowane. Problem polega na tym, że PropertySourceLocator nigdy nie jest używany do konstruowania wywołania w ConfigServicePropertySourceLocator w celu pobrania właściwości. Bez względu na to, co robię, nie mogę dopasować zachowania, które określałyby właściwości w bootstrap.yml.

Edycja 4 dni później

Kluczowym czynnikiem (a) ograniczenie tutaj jest możliwość zajrzeć do serwera konfiguracyjnego przez Eureka. W obecnym wydaniu chmury wiosennej (1.0.2) źródło właściwości jest pobierane i budowane zbyt wcześnie w cyklu inicjalizacji wiosny dla konfiguracji źródła właściwości config-through-eureka dla java, którą mam powyżej. Plus, jeśli serwer Eureka jest wolny lub niedostępny podczas uruchamiania, źródło właściwości serwera Config nie zostanie zrekonstruowane, gdy w końcu pojawi się Eureka. To w moim umyśle jest błędem.

Rozwiązałem to wszystko dzięki wyeliminowaniu koncepcję patrząc serwer config przez Eureka, a minimalny wymóg ten config w bootstrap.yml:

spring: 
    application: 
    name: MyMicroservice 
    cloud: 
    config: 
     uri: http://localhost:8888/diagnostics/admin/config 

eureka: 
    client: 
    serviceUrl: 
     defaultZone: http://user:[email protected]:8761/eureka/ 

a następnie ustawiając resztę w AdditionalBootstrapPropertySourceLocator java

Edycja 30 dni później

Właściwości bootstrap Java do konfiguracji nadal stanowią wyzwanie. Robię to, ponieważ opracowuję ramy bez szablonów lub generowania kodu (założenie wiosennego rozruchu). Do miksu dodałem wiosenny ponów próbę, a klient-konfiguracja zostaje ponownie sprawdzony, ale ponowna rejestracja w Eureka nie działa. Właśnie dlatego Eureka - pierwsza musiała zostać porzucona dla mnie. Głosowałem za integracją wiosennego podejścia do procesu rejestracji Eureka, więc mogę wrócić do Eureka - najpierw dla mojej struktury. Nadal w Spring Cloud 1.0.2.

Edit 100 dni później

Aktualizacja gdzie skończyliśmy. Kontynuując wzdłuż naszej mantry unikania właściwości templating, egzekwowanie polityk i praktyk w ramach kodu .. i kontynuując bez Eureka pierwszego pojęcia, zrezygnowaliśmy PropertySourceLocator i po prostu użył SpringApplicationRunListener następująco:

public class OurFrameworkProperties implements SpringApplicationRunListener { 
    : 
    public void started() { 
    if (TestCaseUtils.isRunningFromTestCase()) { 
     System.setProperty("spring.cloud.config.failFast", "false"); 
     System.setProperty("spring.cloud.config.enabled", "false"); 
     System.setProperty("eureka.client.enabled", "false"); 
    } else { 
     // set production values same way 
    } 
    } 
} 

Przestroga który rozpoczął ten () jest wywoływany dwukrotnie w kodzie źródłowym (gdy nie przekazuje żadnych argumentów programowych) za każdym razem, gdy uruchomi się aplikacja Spring lub uzyska odświeżenie urządzenia wykonawczego().

+0

Czy to możliwe, aby dodać "@ PropertySource"? Cała ta ręczna obsługa klawiszy mapy wydaje mi się krucha. –

+0

Chodziło o to, aby java konfigurowała to automatycznie dla programistów, którzy określają nasz bazowy pom jako swojego rodzica pom. Nie chcieliśmy polegać na wiedzy plemiennej dla programistów, aby pamiętać o dodaniu do swojej ścieżki klas lub katalogu roboczego pliku o nazwie "bootstrap.yml" lub dowolnego innego pliku. W ten sposób zostaną one automatycznie zarejestrowane w Eureka, automatycznie otrzymają znormalizowane nadpisania konfiguracji z serwera konfiguracji i udostępnią wspólną ścieżkę kontekstu zarządzania. Kod został szablonowy z _ http: //projects.spring.io/spring-cloud/spring-cloud.html#customizing-bootstrap-property-sources_. – RubesMN

+0

Po przeprowadzeniu dochodzenia wydaje się, że istnieje błąd. Aktualizacje Eureka zapewnia, że ​​identyfikator URI serwera Config nie wyzwala wywołania restTemplate w celu rozwiązania zdalnego źródła właściwości w 'ConfigServicePropertySourceLocator.locate()'. Jeśli wrócę do konfiguracji za pomocą bootstrap.yml (i usuń failFast), jeśli Eureka nie jest natychmiast dostępna do czasu zakończenia init -> nie zostaną utworzone nadpisania źródła właściwości serwera konfiguracji – RubesMN

Odpowiedz

0

Jeśli PropertySourceLocator jest wymieniony w spring.factories (zakładam jako BootstrapConfiguration) to musi być @Component (lub może nawet @Configuration).

+0

To nadal go nie rozwiązuje. Dwa problemy: 1) W PropertySourceBootstrapConfiguration.initialize() wygląda na to, że ma on załadować zasoby PropertySources do kompozytu. Moje źródło właściwości jest prawidłowo dodawane do kompozytu. Jednak parametr ConfigServicePropertySourceLocation jest również częścią pętli inicjalizacyjnej. Takie działania lubią używać środowiska do nadpisywania jego wartości domyślnych, ale tylko dla 3 właściwości (i tak nie ma znaczenia, ponieważ moje źródło właściwości nie zostało jeszcze scalone ze źródłami właściwości środowiska). – RubesMN

+0

2) Zauważyłem również, że moja fasola DiscoveryClientConfigServiceBootstrapConfiguration również nie jest tworzona wystarczająco wcześnie, aby wszystko działało. Mam spore problemy z ustaleniem, jak utworzyć tę fasolę na równi z dodatkowym algorytmem FootBootstrapPropertySourceLocator. Jakieś pomysły? – RubesMN

+0

'DiscoveryClientConfigServiceBootstrapConfiguration' jest już' BootstrapConfiguration'. Dlaczego chcesz dodać kolejny? –

Powiązane problemy