spring-cloudnetflix-eurekaminishift

Spring client cannot register with Eureka (MiniShift)


My Spring Eureka server YAML config. is this

spring:
  application:
    name: discovery-service

eureka:
  instance:
    hostname: spring-cloud-gateway.discovery.svc    # it should be service url in openshift cluster.
  client:
    eureka-server-connect-timeout-seconds: 5
    enabled: true
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
  port: 8761

I use the server URL which is displayed on the OpenShift console.

selectors:
    app=spring-cloud-gateway, deploymentconfig=spring-cloud-gateway 
Type:
    ClusterIP
IP:
    172.30.167.146
Hostname:
    spring-cloud-gateway.discovery.svc 
Session affinity:
    None

The logs showing the eureka server status is this.

2019-08-21 09:01:00.921  INFO 7 --- [      Thread-11] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2019-08-21 09:01:00.991  INFO 7 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8761 (http) with context path ''
2019-08-21 09:01:00.998  INFO 7 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8761
2019-08-21 09:01:01.007  INFO 7 --- [           main] c.o.g.DiscoveryServiceApplication        : Started DiscoveryServiceApplication in 56.204 seconds (JVM running for 66.164)
2019-08-21 09:02:00.839  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:03:00.839  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:04:00.841  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 1ms
2019-08-21 09:05:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 2ms
2019-08-21 09:06:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:07:00.843  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:08:00.851  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 8ms
2019-08-21 09:09:00.856  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:10:00.860  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:10:59.206  WARN 7 --- [eerNodesUpdater] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2019-08-21 09:11:00.865  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2019-08-21 09:12:00.866  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2019-08-21 09:13:00.885  INFO 7 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 18ms

The REST endpoint client YAML config. is this.

spring:
  application:
    name: second-service
server:
  port: 8087

eureka:
  instance:
    preferIpAddress: false
  client:
    service-url:
      defaultZone: http://spring-cloud-gateway.discovery.svc:8761/eureka/

And it doesn't seem to register.

        2019-08-21 09:46:12.416 ERROR 7 --- [tbeatExecutor-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error. 

endpoint=DefaultEndpoint{ serviceUrl='http://spring-cloud-gateway.discovery.svc:8761/eureka/ }
    com.sun.jersey.api.client.ClientHandlerException: org.apache.http.conn.ConnectTimeoutException: Connect to spring-cloud-gateway.discovery.svc:8761 timed out
        at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.9.8.jar!/:1.9.8]
        at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.1.jar!/:1.19.1]
        at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.19.1.jar!/:1.19.1]

I tried to check the Web ui of the eureka server using the exposed URL (http://spring-cloud-gateway-discovery.192.168.42.79.nip.io/eureka) but I get this page back.

enter image description here

NAME                                            HOST/PORT                                             PATH      SERVICES               PORT       T
ERMINATION   WILDCARD
route.route.openshift.io/spring-cloud-gateway   spring-cloud-gateway-discovery.192.168.42.79.nip.io             spring-cloud-gateway   8080-tcp    
             None
NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/spring-cloud-gateway   ClusterIP   172.30.167.146   <none>        8080/TCP   23h

Is there a problem with the server or client ?

The eureka server is part of project-1 and the rest service client is part of project-2. That is how I set it up in the Openshift console. Is that a problem ? I didn't think so.

Update : I moved everything into the same project but it is still showing an error.

2019-08-22 06:45:39.412  WARN 7 --- [tbeatExecutor-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution 
failed with message: org.apache.http.conn.ConnectTimeoutException: Connect to spring-cloud-gateway.discovery.svc:8761 timed
 out
2019-08-22 06:45:39.413 ERROR 7 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SE
COND-SERVICE/spring-cloud-gateway-5-bh8rj:second-service:8087 - was unable to send heartbeat!
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

Solution

  • Your error log says 'timed out' and 'unable to send heartbeat', this could be an issue of client registry, caused by running docker containers to start your services with port specified in your yml/properties file.

    I encountered the same issue when I deploy my microservices onto Cloud Foundry, although I can successfully run them locally. I guess the root cause is the same.

    Solution: use secure/nonSecure port instead of 'server.port'.

    Here is the example (using nonSecure port), good luck.

    You can try to find out the details at http://spring-cloud-gateway.discovery.svc/eureka/apps if you still have connection issue between eureka server and client.

    Eureka Server:

    spring:
      application:
        name: discovery-service
    
    eureka:
      instance:
        hostname: spring-cloud-gateway.discovery.svc
        nonSecurePortEnabled: true
        nonSecurePort: 80
        homePageUrl: http://${eureka.instance.hostname}/
        statusPageUrl: http://${eureka.instance.hostname}/actuator/info/
        healthCheckUrl: http://${eureka.instance.hostname}/actuator/health/
      client:
        fetch-registry: false
        register-with-eureka: false
        service-url:
          defaultZone: http://${eureka.instance.hostname}/eureka/
    
    

    Eureka Client:

    spring:
      application:
        name: second-service
    
    eureka:
      instance:
        nonSecurePortEnabled: true
        nonSecurePort: 80
        hostname: <your_client_host> # or you can use preferIpAddress: true
        homePageUrl: http://${eureka.instance.hostname}/
      client:
        service-url:
          defaultZone: http://spring-cloud-gateway.discovery.svc/eureka/