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().
Czy to możliwe, aby dodać "@ PropertySource"? Cała ta ręczna obsługa klawiszy mapy wydaje mi się krucha. –
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
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