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