天天看點

配置高可用Eureka Server遇到的神坑:無法注冊服務

今天在進行高可用的Eureka Server注冊中心的配置時,遇到一個神坑。

拓撲圖

廢話不多說,直接上拓撲圖:

配置高可用Eureka Server遇到的神坑:無法注冊服務

Eureka Server配置

pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
           

開啟注解:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerHaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerHaApplication.class, args);
    }
}
           

配置檔案application.yml:

---
server:
  port: 
spring:
  profiles: peer1
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:/eureka/,http://peer3:/eureka/

---
server:
  port: 
spring:
  profiles: peer2
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:/eureka/,http://peer3:/eureka/

---
server:
  port: 
spring:
  profiles: peer3
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
      defaultZone: http://peer1:/eureka/,http://peer2:/eureka/
           

在IDEA中,分别通過設定不同的

Program arguments

參數為

--spring.profiles.active=peer1

--spring.profiles.active=peer2

--spring.profiles.active=peer3

啟動這三個注冊中心服務。

通路http://peer1:8771/,

Eureka Server

配置成功,如下所示:

配置高可用Eureka Server遇到的神坑:無法注冊服務

Eureka Client配置

pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
           

開啟注解:

@EnableEurekaClient
@RestController
@SpringBootApplication
public class EurekaHiHaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaHiHaApplication.class, args);
    }

    /** 擷取端口号 */
    @Value("${server.port}")
    String port;

    /**
     * 定義一個簡單接口
     * @param name
     * @return
     */
    @GetMapping("/hi/{name}")
    public String home(@PathVariable String name){
        return "hi " + name + ",I am from port :" + port;
    }
}
           

配置檔案application.yml:

server:
  port: 
spring:
  application:
    name: service-hi-ha
eureka:
  client:
    service-url:
      default-zone: http://peer1:8771/eureka/
           

啟動報錯:

-- ::  INFO  --- [           main] com.netflix.discovery.DiscoveryClient    : Getting all instance registry info from the eureka server
-- :: ERROR  --- [           main] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:) ~[jersey-apache-client4-.jar:]
    at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:) ~[jersey-client-.jar:]
    ...
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:_131]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:) ~[na:_131]
    ...
    ...  common frames omitted

-- ::  WARN  --- [           main] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failed with message: java.net.ConnectException: Connection refused: connect
-- :: ERROR  --- [           main] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICE-HI-HA/DESKTOP-J0FACQ:service-hi-ha: - was unable to refresh its cache! status = Cannot execute request on any known server

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:) ~[eureka-client-.jar:]
    ...
    at pers.hanchao.springclouddemo.eurekahiha.EurekaHiHaApplication.main(EurekaHiHaApplication.java:) [classes/:na]

-- ::  WARN  --- [           main] com.netflix.discovery.DiscoveryClient    : Using default backup registry implementation which does not do anything.
-- ::  INFO  --- [           main] com.netflix.discovery.DiscoveryClient    : Starting heartbeat executor: renew interval is: 
-- ::  INFO  --- [           main] c.n.discovery.InstanceInfoReplicator     : InstanceInfoReplicator onDemand update allowed rate per min is 
-- ::  INFO  --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp  with initial instances count: 
-- ::  INFO  --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application service-hi-ha with eureka with status UP
-- ::  INFO  --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=, current=UP, previous=STARTING]
-- ::  INFO  --- [nfoReplicator-] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICE-HI-HA/DESKTOP-J0FACQ:service-hi-ha:: registering service...
-- ::  INFO  --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s):  (http)
-- ::  INFO  --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 
-- ::  INFO  --- [           main] p.h.s.eurekahiha.EurekaHiHaApplication   : Started EurekaHiHaApplication in  seconds (JVM running for )
-- :: ERROR  --- [nfoReplicator-] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:) ~[jersey-apache-client4-.jar:]
    ...
    at java.lang.Thread.run(Thread.java:) [na:_131]
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:_131]
    ...
    ...  common frames omitted

-- ::  WARN  --- [nfoReplicator-] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failed with message: java.net.ConnectException: Connection refused: connect
-- ::  WARN  --- [nfoReplicator-] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICE-HI-HA/DESKTOP-J0FACQ:service-hi-ha: - registration failed Cannot execute request on any known server

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:) ~[eureka-client-.jar:]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:) ~[eureka-client-.jar:]
    ...
    at java.lang.Thread.run(Thread.java:) [na:_131]

-- ::  WARN  --- [nfoReplicator-] c.n.discovery.InstanceInfoReplicator     : There was a problem with the instance info replicator

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:) ~[eureka-client-.jar:]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:) ~[eureka-client-.jar:]
    ...
    at java.lang.Thread.run(Thread.java:) [na:_131]

           

錯誤解決

通過報錯資訊,可知,

Eureka Client

找不到

Eureka Server

的配置,但是我檢查各項配置沒有問題。

最終,我将 橫線命名 修改為 駝峰命名 ,問題解決:

修改

Eureka Client

的配置檔案

application.yml

:

server:
  port: 
spring:
  application:
    name: service-hi-ha
eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8771/eureka/
           

重新啟動,進入

Eureka Server

背景,發現服務注冊成功:

配置高可用Eureka Server遇到的神坑:無法注冊服務

在浏覽器通路http://localhost:8783/hi/david,服務正常:

配置高可用Eureka Server遇到的神坑:無法注冊服務

繼續閱讀