Tôi đang phát triển một ứng dụng dịch vụ vi mô Spring Cloud Eureka. Tôi muốn các dịch vụ của tôi kết nối với dịch vụ cấu hình thông qua phương thức đầu tiên của Eureka. Microservices được đóng gói như các container docker và được triển khai thông qua docker-compose. Ứng dụng này được sáng tác bởi:Spring Cloud Config Phương pháp tiếp cận đầu tiên của Eureka không hoạt động
myapp-service-registry
: một dịch vụ dịch vụ đăng ký thực hiện với mùa xuân đám mây Eurekamyapp-config-service
: máy chủ dịch vụ một mùa xuân đám mây cấu hìnhmyapp-service-test
: Một ví dụ microservice mà nên cố gắng để lấy dữ liệu cấu hình của nó từ dịch vụ cấu hình bằng cách kết nối với điều này thông qua phương pháp đầu tiên của Eureka.
Kết nối với dịch vụ cấu hình không thành công như được mô tả bên dưới. Trước hết một số dữ liệu cấu hình:
Đây là myapp-service-registry
: s 's application.yml
server:
port: ${PORT:8761}
eureka:
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
Ở đây myapp-config-service
' application.yml
:
server:
port: ${MYAPP_CONFIG_SERVICE_PORT:8888}
spring:
cloud:
config:
server:
git:
uri: ${MYAPP_CONFIG_SERVICE_GIT_URI}
config:
name: myapp-config-service
# eureka service registry client
eureka:
client:
serviceUrl:
defaultZone: http://${SERVICE_REGISTRY_HOST}:${SERVICE_REGISTRY_PORT}/eureka/
instance:
preferIpAddress: true
Config server và client được khởi tạo như trong configserver-eureka
và eureka-first
các mẫu trong https://github.com/spring-cloud-samples/tests:
myapp-config-service
's bootstrap.yml
là:
spring:
application:
name: myapp-config-service
cloud:
config:
discovery:
enabled: true
Và myapp-service-test
' s application.yml
:
eureka:
client:
serviceUrl:
defaultZone: http://${SERVICE_REGISTRY_HOST}:${SERVICE_REGISTRY_PORT}/eureka/
instance:
preferIpAddress: true
Và myapp-service-test
's bootstrap.yml
:
spring:
application:
name: myapp-service-test
cloud:
config:
discovery:
enabled: true
serviceId: myapp-config-service
Tiếp theo là biến docker-compose.yml
(env được thay thế bằng giá trị thực tế khi khởi chạy):
myapp-service-registry:
image: myapp/myapp-service-registry:0.0.1
ports:
- ${EUREKA_PORT}:${EUREKA_PORT}
# myapp-config-service
myapp-config-service:
image: myapp/myapp-config-service:0.0.1
volumes:
- ${MYAPP_DATA_FOLDER}/config:/var/opt/myapp/config
environment:
MYAPP_CONFIG_SERVICE_PORT: ${MYAPP_CONFIG_SERVICE_PORT}
SERVICE_REGISTRY_HOST: ${MYAPP_STAGING_IP}
SERVICE_REGISTRY_PORT: ${EUREKA_PORT}
MYAPP_CONFIG_SERVICE_GIT_URI: ${MYAPP_CONFIG_SERVICE_GIT_URI}
ports:
- ${MYAPP_CONFIG_SERVICE_PORT}:${MYAPP_CONFIG_SERVICE_PORT}
# myapp-service-test
myapp-service-test:
image: myapp/myapp-service-test:0.0.1
environment:
SERVICE_REGISTRY_HOST: ${MYAPP_STAGING_IP}
SERVICE_REGISTRY_PORT: ${EUREKA_PORT}
ports:
- ${MYAPP_SERVICE_TEST_TWO_PORT}:8080
Tôi có thể kiểm tra xem Eureka có hoạt động không bằng cách kết nối trình duyệt với http://[...MACHINE-IP...]:8761/ và xem bảng điều khiển Eureka. Tương tự như vậy, tôi kiểm tra xem dịch vụ cấu hình có đang hoạt động và trả lời http:///[...MACHINE-IP...]:8888/myapp-config-service hay không; Với cấu hình trên, mặt khác, myapp-dịch vụ-test treo lúc khởi động với các bản ghi sau:
-02-03 08:26:45.191 INFO 1 --- [ main] e.f.s.two.TestServiceApplication : Starting TestServiceApplication v0.0.1 on b1bc37422027 with PID 1 (/app.jar started by root in /)
2016-02-03 08:26:45.223 INFO 1 --- [ main] e.f.s.two.TestServiceApplication : No active profile set, falling back to default profiles: default
2016-02-03 08:26:45.448 INFO 1 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]4d97e82d: startup date [Wed Feb 03 08:26:45 UTC 2016]; root of context hierarchy
2016-02-03 08:26:46.382 INFO 1 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2016-02-03 08:26:46.442 INFO 1 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [class org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$6b65138e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2016-02-03 08:26:47.089 INFO 1 --- [ main] o.s.c.n.eureka.InstanceInfoFactory : Setting initial instance status as: STARTING
2016-02-03 08:26:48.231 INFO 1 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using encoding codec LegacyJacksonJson
2016-02-03 08:26:48.237 INFO 1 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using decoding codec LegacyJacksonJson
2016-02-03 08:26:49.171 INFO 1 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using encoding codec LegacyJacksonJson
2016-02-03 08:26:49.171 INFO 1 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using decoding codec LegacyJacksonJson
2016-02-03 08:26:49.496 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Disable delta property : false
2016-02-03 08:26:49.497 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Single vip registry refresh property : null
2016-02-03 08:26:49.497 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Force full registry fetch : false
2016-02-03 08:26:49.498 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Application is null : false
2016-02-03 08:26:49.502 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Registered Applications size is zero : true
2016-02-03 08:26:49.503 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Application version is -1: true
2016-02-03 08:26:49.503 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server
2016-02-03 08:26:49.720 WARN 1 --- [ main] com.netflix.discovery.DiscoveryClient : Can't get a response from http://localhost:8761/eureka/apps/
<...>
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.jar!/:1.19]
at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123) ~[jersey-client-1.19.jar!/:1.19]
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.3.4.jar!/:1.3.4]
<...>
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_66-internal]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_66-internal]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_66-internal]
<...>
2016-02-03 08:26:49.747 ERROR 1 --- [ main] com.netflix.discovery.DiscoveryClient : Can't contact any eureka nodes - possibly a security group issue?
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
<...>
2016-02-03 08:26:49.770 ERROR 1 --- [ main] com.netflix.discovery.DiscoveryClient : DiscoveryClient_MYAPP-SERVICE-TEST/b1bc37422027:myapp-service-test - was unable to refresh its cache! status = java.net.ConnectException: Connection refused
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
<...>
2016-02-03 08:26:49.785 WARN 1 --- [ main] com.netflix.discovery.DiscoveryClient : Using default backup registry implementation which does not do anything.
2016-02-03 08:26:49.810 INFO 1 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 10
2016-02-03 08:26:49.818 INFO 1 --- [ main] c.n.discovery.InstanceInfoReplicator : InstanceInfoReplicator onDemand update allowed rate per min is 4
2016-02-03 08:26:50.443 WARN 1 --- [ main] lientConfigServiceBootstrapConfiguration : Could not locate configserver via discovery
java.lang.RuntimeException: No matches for the virtual host name :myapp-config-service
at com.netflix.discovery.DiscoveryClient.getNextServerFromEureka(DiscoveryClient.java:782) ~[eureka-client-1.3.4.jar!/:1.3.4]
at org.springframework.cloud.netflix.config.DiscoveryClientConfigServiceBootstrapConfiguration.refresh(DiscoveryClientConfigServiceBootstrapConfiguration.java:71) [spring-cloud-netflix-core-1.1.0.M3.jar!/:1.1.0.M3]
<...>
2016-02-03 08:26:50.470 INFO 1 --- [ main] e.f.s.two.TestServiceApplication : Started TestServiceApplication in 7.101 seconds (JVM running for 9.329)
. ____ _ __ _ _
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ))))
' |____| .__|_| |_|_| |_\__, |////
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.1.RELEASE)
2016-02-03 08:26:50.773 INFO 1 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2016-02-03 08:26:51.015 WARN 1 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/myapp-service-test/default":Connection refused; nested exception is java.net.ConnectException: Connection refused
<...>
2016-02-03 08:26:54.856 ERROR 1 --- [pool-5-thread-1] com.netflix.discovery.DiscoveryClient : Can't contact any eureka nodes - possibly a security group issue?
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
<...>
2016-02-03 08:26:57.272 WARN 1 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testTwoServiceController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: java.lang.String myapp.services.two.TestServiceController.message; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'message' in string value "${message}"
2016-02-03 08:26:57.281 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Stopping service Tomcat
2016-02-03 08:26:57.299 ERROR 1 --- [ main] o.s.boot.SpringApplication : Application startup failed
Lưu ý rằng nếu tôi không thực hiện một cách tiếp cận Eureka-đầu tiên (và thiết spring.cloud. config.uri trực tiếp trong dịch vụ bootstrap.yml
), dịch vụ đăng ký với Eureka, tìm máy chủ cấu hình và hoạt động chính xác (tôi có thể xem dịch vụ đã đăng ký trong bảng điều khiển của Eureka và có thể kiểm tra các thuộc tính cấu hình đó được đọc chính xác).
Bạn cần dịch vụ eurekaUrl trong bootstrap.yml không phải bạn (cũng như id dịch vụ của máy chủ cấu hình)? –
Đó là nó! Bằng cách di chuyển cấu hình eureka trong myapp-service-test từ application.yml thành bootstrap.yml, dịch vụ tìm kiếm mọi thứ một cách chính xác. Nghĩ lại thì, nó khá hợp lý ...Tôi đã bỏ lỡ nó vì trong phiên bản đầu tiên của dịch vụ thử nghiệm (không có máy chủ cấu hình), đăng ký eureka đã hoạt động nếu được định cấu hình trong application.yml. Sau đó, tôi chỉ không nhận thấy rằng cùng phải được chuyển đến boostrap.yml vì nó có mà tôi cấu hình spring.cloud.config.discovery, quá. Rất cám ơn, – chrx
Bạn đã sử dụng phiên bản nào của Spring để làm việc này? Tôi có thể làm cho nó hoạt động với Spring Boot: 1.3.1.RELEASE và Cloud: Brixton.BUILD-SNAPSHOT nhưng có thiết lập RELEASE (không SNAPSHOT) hoạt động không? – Rob