I am facing problem while running Eureka server example to understand peer awareness concept. I have following Eureka service:
package com.micro.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableDiscoveryClient
@EnableEurekaServer
public class EurekaServerMicroServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerMicroServiceApplication.class, args);
}
}
application.yml
---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
bootstrap.yml
spring:
application:
name: eureka
etc/hosts
127.0.0.1 peer1
127.0.0.1 peer2
localhost peer1
localhost peer2
When I am running this Eureka service, I am continuously getting following exception:
2016-03-26 12:19:57.708 ERROR 4940 --- [ 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: connect
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.7.jar:1.3.7]
at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.jar:1.19]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.jar:1.19]
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.19.jar:1.19]
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:509) ~[jersey-client-1.19.jar:1.19]
at com.netflix.discovery.DiscoveryClient.getUrl(DiscoveryClient.java:1802) [eureka-client-1.3.7.jar:1.3.7]
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1546) [eureka-client-1.3.7.jar:1.3.7]
at com.netflix.discovery.DiscoveryClient.makeRemoteCallWithFollowRedirect(DiscoveryClient.java:1460) [eureka-client-1.3.7.jar:1.3.7]
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1443) [eureka-client-1.3.7.jar:1.3.7]
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1394) [eureka-client-1.3.7.jar:1.3.7]
2016-03-26 12:23:09.963 ERROR 4940 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA/KHUJEMA-PC:eureka - was unable to send heartbeat!
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
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.7.jar:1.3.7]
at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.jar:1.19]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.jar:1.19]
I am successfully able to run Eureka service with single instance. I am only facing issues for two instances. Following demo example from github: [ https://github.com/rcapraro/spring-cloud-sample][1]
What I also noticed in logs is tomcat embeded server is getting started on port-8080 instead of 8761/8762, not sure why?
Please help!
Try removing the @EnableDiscoveryClient from your Application.java. Mine looks like this:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
If Eureka
is still starting on 8080 most-likely you are not passing the active Spring
profile.
Each instance would need to be started as:
java -Dspring.profiles.active=peer1 target/<artifact>.jar
and
java -Dspring.profiles.active=peer2 target/<artifact>.jar
BTW, I would suggest to start instances in a different way, I don't think this scales very well, what if you need to start a 3rd instance? With this setup you probably need to modify application.yml
to add a 3rd profile, see the issue?
I recently blogged about Microservices Registration and Discovery using Spring Cloud Eureka Ribbon and Feign where I covered running Eureka
in standalone
and peerAware
modes using Spring
profiles. In the peerAware
profile, I pass the location of the other Eureka
instances using a VM argument, so no need to change the code to start new instances. It also covers load-balancing requests using Feign
, Ribbon
and RestTemplate
and the clients are implemented using Jersey
1 and Spring
REST.
I had the same issue,searched a lot with no luck!
Finally, I just modified profiles to profile, it surprisingly worked:
spring:
profile: peer1
Rather than:
spring:
profiles: peer1
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.