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().
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. –
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
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