2015-06-22 25 views
5

Tôi đang cố gắng xây dựng mã vào pom cơ sở của chúng tôi để tự động định cấu hình tra cứu máy chủ Spring Cloud Config thông qua Eureka. Chúng tôi đang làm điều này để tránh các thuộc tính templating .yml cho các nhà phát triển xây dựng các dịch vụ nhỏ. Ví dụ, chúng tôi muốn java cấu hình tất cả các hành vi gây ra từ các thuộc tính:Tra cứu Máy chủ Cấu hình Đám mây Mùa xuân qua Eureka bằng cách sử dụng Java thay vì 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 

Sau khi thử nghiệm nhiều, phương pháp sau đây chủ yếu là các công trình trừ các máy chủ cấu hình Eureka-phát hiện (kết quả là không có tính cấu hình ghi đè):

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

Và tôi dường như cần Bean này cũng như:

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

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

} 

Cuối cùng, tôi đưa cả hai vào spring.factories để đảm bảo chúng được xây dựng. Vấn đề là PropertySourceLocator không bao giờ được sử dụng để xây dựng các cuộc gọi trong ConfigServicePropertySourceLocator để lấy các thuộc tính. Không có vấn đề gì tôi làm, tôi không thể dường như phù hợp với các hành vi mà chỉ định các thuộc tính trong bootstrap.yml sẽ sản xuất.

Sửa 4 ngày sau

Các yếu tố quan trọng (và hạn chế) ở đây là khả năng tìm kiếm các máy chủ cấu hình thông qua Eureka. Trong bản phát hành đám mây mùa xuân hiện tại (1.0.2), nguồn thuộc tính được lấy ra và xây dựng quá sớm trong chu kỳ khởi tạo mùa xuân cho cấu hình nguồn cấu hình thuộc tính java-look-through-eureka java mà tôi có ở trên. Thêm vào đó nếu máy chủ Eureka chậm hoặc không có sẵn trong thời gian khởi động bootstrap, thì nguồn thuộc tính của máy chủ Config sẽ không bao giờ được xây dựng lại khi Eureka cuối cùng xuất hiện. Điều này trong tâm trí của tôi là một lỗi.

tôi giải quyết tất cả điều này bằng cách loại bỏ các khái niệm về nhìn lên máy chủ cấu hình thông qua Eureka, và yêu cầu cấu hình tối thiểu này trong 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/ 

và sau đó thiết lập các phần còn lại trong AdditionalBootstrapPropertySourceLocator java

Chỉnh sửa 30 ngày sau

Thuộc tính khởi động cấu hình Java tiếp tục là một thách thức. Tôi đang làm điều này bởi vì tôi đang phát triển một khuôn khổ mà không cần templating hoặc tạo mã (tiền đề của khởi động mùa xuân). Tôi đã thêm spring-retry vào hỗn hợp và client-to-config được thử lại nhưng đăng ký lại với Eureka thì không. Đây là lý do tại sao Eureka đầu tiên phải bị bỏ rơi cho tôi. Tôi sẽ bỏ phiếu cho việc tích hợp thử lại mùa xuân vào quy trình đăng ký Eureka để tôi có thể quay lại Eureka trước tiên cho khuôn khổ của mình. Vẫn còn trên Spring Cloud 1.0.2.

Chỉnh sửa 100 ngày sau

Cập nhật cho nơi chúng tôi đã kết thúc. Tiếp tục cùng câu thần chú của chúng tôi để tránh khuôn mẫu bất động sản, thực thi chính sách và thông lệ trong mã .. và tiếp tục mà không có một khái niệm Eureka-đầu tiên, chúng ta từ bỏ PropertySourceLocator và chỉ cần sử dụng một SpringApplicationRunListener như sau:

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

Phạt cảnh cáo rằng đây bắt đầu () thực sự được gọi hai lần bên trong mã mùa xuân (một khi không vượt qua bất kỳ đối số chương trình btw) mỗi khi ứng dụng Spring của bạn chạy hoặc nhận được một bộ làm mới Actuator().

+0

Có thể bạn chỉ cần thêm '@ PropertySource'? Tất cả các hướng dẫn sử dụng schlepping của các phím bản đồ trông mong manh cho tôi một cách an toàn. –

+0

Vấn đề là để java cấu hình tự động cho các nhà phát triển, những người chỉ định pom cơ sở của chúng tôi là cha mẹ của họ. Chúng tôi không muốn dựa vào kiến ​​thức bộ lạc để các nhà phát triển nhớ thêm một tệp có tên 'bootstrap.yml' hoặc bất kỳ tệp nào khác vào classpath hoặc thư mục làm việc của họ. Bằng cách này, họ sẽ được đăng ký tự động với Eureka, hãy tự động ghi đè cấu hình tiêu chuẩn của chúng tôi từ máy chủ cấu hình và chia sẻ đường dẫn ngữ cảnh quản lý chung. Mã được tạo mẫu từ _http: //projects.spring.io/spring-cloud/spring-cloud.html#customizing-bootstrap-property-sources_. – RubesMN

+0

Sau khi điều tra, có vẻ như là một lỗi. Các cập nhật mà Eureka cung cấp khi URI máy chủ Config không kích hoạt lời gọi restTemplate để giải quyết nguồn thuộc tính từ xa trong 'ConfigServicePropertySourceLocator.locate()'. Nếu tôi quay trở lại cấu hình bằng cách sử dụng bootstrap.yml (và xóa failFast), nếu Eureka không có sẵn ngay lập tức theo thời gian init hoàn thành -> phần ghi đè nguồn thuộc tính máy chủ cấu hình không bao giờ được tạo – RubesMN

Trả lời

0

Nếu PropertySourceLocator bạn được liệt kê trong spring.factories (tôi giả sử như một BootstrapConfiguration) sau đó nó cần phải được một @Component (hoặc thậm chí có một @Configuration).

+0

Điều đó vẫn không giải quyết được. Hai vấn đề: 1) Trong PropertySourceBootstrapConfiguration.initialize() có vẻ như nó được dự định nạp PropertySources vào trong composite. Nguồn thuộc tính của tôi được thêm vào tổng hợp đúng cách. Tuy nhiên, ConfigServicePropertySourceLocation cũng là một phần của vòng lặp khởi tạo. Hành vi đó thích sử dụng môi trường để ghi đè các giá trị mặc định của nó, nhưng chỉ cho 3 thuộc tính (sẽ không quan trọng vì PropertySource của tôi chưa được hợp nhất vào các nguồn thuộc tính môi trường). – RubesMN

+0

2) Tôi cũng nhận thấy rằng hạt DiscoveryClientConfigServiceBootstrapConfiguration của tôi cũng không được tạo sớm đủ trong quá trình để tất cả điều này hoạt động. Tôi đang ở cuối wits kết thúc tìm hiểu làm thế nào để nhanh chóng mà đậu bằng để các AdditionalBootstrapPropertySourceLocator. Bất kỳ ý tưởng? – RubesMN

+0

'DiscoveryClientConfigServiceBootstrapConfiguration' đã là' BootstrapConfiguration'. Tại sao bạn muốn thêm người khác? –

Các vấn đề liên quan