2015-06-22 15 views
5

Spring Cloud Config sunucu arayışını Eureka üzerinden otomatik olarak yapılandıran temel pompamıza kod oluşturmaya çalışıyorum. Biz microservices oluşturmak için geliştiriciler için templating .yml özelliklerini önlemek için bunu yapıyoruz. Örneğin, java config bu özelliklerinden tetiklediği tüm davranış istiyorum: çok denedikten sonraSpring Cloud Config Eureka'nın yerine Java kullanarak sunucu arayışı 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 

aşağıdaki yaklaşım çoğunlukla (hiçbir geçersiz kılınmış yapılandırma özelliklerinde sonuçlanan) Eureka-keşfedilen yapılandırma sunucu hariç çalışır:

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

Ve ben de bu Bean gerekir gibi görünüyor:

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

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

} 

Son olarak, onlar inşa edilir sağlamak için spring.factories içine hem koydu. Sorun, PropertySourceLocator'ın, özellikleri almak için ConfigServicePropertySourceLocator içinde çağrı oluşturmak için hiçbir zaman kullanılmamasıdır. Ne yaparsam yapayım, bootstrap.yml içindeki özellikleri belirleyen davranışları eşleştiremiyorum.

Düzenleme 4 gün sonra

anahtar faktör (ve kısıtlama) Buraya Eureka aracılığıyla yapılandırma sunucusu bakmak için yeteneğidir. Mevcut bahar bulutu sürümünde (1.0.2), özellik kaynağı, yukarıda sahip olan yapılandırma araması-aracılığıyla-eureka java özelliği kaynak yapılandırması için yay başlatma döngüsünde çok erken alınır ve yapılandırılır. Ayrıca, Eureka sunucusu önyükleme başlangıç ​​zamanında yavaşsa veya kullanılamıyorsa, Eureka nihayet geldiğinde Config sunucu özellik kaynağı hiçbir zaman yeniden yapılandırılmaz. Bu aklımda bir böcek.

tüm Eureka aracılığıyla yapılandırma sunucusu ararken kavramını ortadan kaldırarak ve bootstrap.yml bu asgari yapılandırma zorunlu hale getirerek bu çözüldü: java AdditionalBootstrapPropertySourceLocator içinde kalan kısmını ayarlayarak sonra

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

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

ve

Düzeltme 30 gün sonra

Java yapılandırma önyükleme özellikleri bir sorun olmaya devam ediyor. Bunu yapıyorum çünkü şablon oluşturmayan veya kod oluşturmayan bir çerçeve geliştiriyorum (ilkbahar açılışının öncülü). Ben mix-rush karıştırmak için ekledim ve istemci-to-config yeniden dener ama Eureka yeniden kayıt yapar. İşte bu yüzden Eureka'nın benim için terk edilmesi gerekiyordu. Eureka kayıt sürecine ilkbaharı yeniden denemek için oylarımı koydum, böylece çerçevem ​​için Eureka'ya geri dönebilirim. Hala Spring Cloud 1.0.2'de.

Düzenleme 100 gün sonra biz burada sona erdi için

Güncelleme. Mülkiyet çiftleşmiş kaçınarak kodundaki politika ve uygulamaları yürürlüğe .. ve Eureka-ilk konsept olmadan devam etme mantra boyunca devam edecek olursak, PropertySourceLocator terkedilmiş ve aşağıdaki gibi basit bir SpringApplicationRunListener kullandı:

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 
    } 
    } 
} 

bu başladığını Bir uyarı () İlkbahar uygulamanız her çalıştığında veya bir Aktüatör yenilemesini() aldığında, aslında ilk kez bahar kodunun (iki kere herhangi bir program argümanını geçmemesi) iki kez çağrılır.

+0

Sadece bir '@ PropertySource 'ekleyebiliyor musunuz? Tüm bu el ile harita tuşlarının elden geçirilmesi bana çok kırılgan geliyor. –

+0

Buradaki nokta, java'yı, temel pompamızı onların pompasının ana ailesi olarak belirleyen geliştiriciler için otomatik olarak yapılandırmaktı. Biz geliştiriciler için 'bootstrap.yml' adlı bir dosya veya sınıf yollarına veya çalışma dizinine başka bir dosya eklemeyi hatırlamak için kabile bilgisine güvenmek istemedik. Bu şekilde, Eureka ile otomatik olarak kaydedilecekler, standartlaştırılmış yapılandırma yapılandırmalarımızı otomatik olarak yapılandırma sunucusundan al ve ortak bir yönetim bağlam yolunu paylaş. Kod, _http: //projects.spring.io/spring-cloud/spring-cloud.html#customizing-bootstrap-property-sources_ adresinden templated edildi. – RubesMN

+0

Araştırmadan sonra, bir hata var gibi görünüyor. Eureka, Yapılandırma sunucusu URI'sinin, ConfigServicePropertySourceLocator.locate() 'içindeki uzak özellik kaynağını çözmek için restTemplate çağrısını tetiklememesini sağlar. Eğer bootstrap.yml (ve failFast'ı) kullanarak yapılandırmaya geri dönersem, Eureka zaman bağlamında init tarafından kullanılamazsa init tamamlandı -> config sunucu özelliği kaynak geçersiz kılmaları hiçbir zaman oluşturulmaz – RubesMN

cevap

0

sizin PropertySourceLocatorspring.factories içinde yer alıyorsa (Ben BootstrapConfiguration olarak varsayılmıştır) o zaman bir @Component (veya belki de bir @Configuration) olması gerekir.

+0

Bu hala çözmüyor. İki sorun: 1) PropertySourceBootstrapConfiguration.initialize() içinde, PropertySources bileşenini bileşene yüklemesi amaçlanmış gibi görünüyor. Mülk Kaynağım, bileşiğe düzgün şekilde eklenir. Ancak, ConfigServicePropertySourceLocation ayrıca başlatma döngüsünün bir parçasıdır. Bu eylemler, çevreyi varsayılanlarını geçersiz kılmak için kullanacaklarını beğenir, ancak yalnızca 3 özellik için geçerlidir (PropertySource özelliği henüz çevre özelliği kaynaklarına dahil olmadığından beri önemli değildir). – RubesMN

+0

2) Ayrıca DiscoveryClientConfigServiceBootstrapConfiguration Bean'in de tüm bu işlemlerin işlenmesi için yeterince erken oluşturulmadığını fark ettim. Ben de, bu fasulyeyi EkBootstrapPropertySourceLocator'a göre nasıl eşitleyeceğimizi anladığımı düşünüyorum. Herhangi bir fikir? – RubesMN

+0

'DiscoveryClientConfigServiceBootstrapConfiguration' zaten bir' BootstrapConfiguration'. Neden başka bir tane eklemek istiyorsun? –

İlgili konular