5

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

  1. 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 Eureka
  2. myapp-config-service: máy chủ dịch vụ một mùa xuân đám mây cấu hình
  3. myapp-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-eurekaeureka-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 

myapp-service-test' s application.yml:

eureka: 
    client: 
     serviceUrl: 
      defaultZone: http://${SERVICE_REGISTRY_HOST}:${SERVICE_REGISTRY_PORT}/eureka/ 
    instance: 
     preferIpAddress: true 

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

+0

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)? –

+0

Đó 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

+0

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

Trả lời

8

Bạn cần dịch vụ eurekaUrl trong bootstrap.yml (cũng như id dịch vụ của máy chủ cấu hình).

+0

Bạn có thể hiển thị cấu hình được cập nhật của mình không? – islandguy

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