今天在進行高可用的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 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
背景,發現服務注冊成功:
在浏覽器通路http://localhost:8783/hi/david,服務正常: