com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
在调试eureka服务器和客户端时,经常会出现这个错误,具体报错信息如下:
2019-03-23 14:53:23.041 WARN 58097 — [tbeatExecutor-0] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with message: A message body reader for Java class com.netflix.appinfo.InstanceInfo, and Java type class com.netflix.appinfo.InstanceInfo, and MIME media type text/html was not found
2019-03-23 14:53:23.041 ERROR 58097 — [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-CLIENT/10.17.34.12:eureka-client:9000 - was unable to send heartbeat!
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
at
com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator
3.
e
x
e
c
u
t
e
(
E
u
r
e
k
a
H
t
t
p
C
l
i
e
n
t
D
e
c
o
r
a
t
o
r
.
j
a
v
a
:
92
)
a
t
c
o
m
.
n
e
t
f
l
i
x
.
d
i
s
c
o
v
e
r
y
.
s
h
a
r
e
d
.
t
r
a
n
s
p
o
r
t
.
d
e
c
o
r
a
t
o
r
.
S
e
s
s
i
o
n
e
d
E
u
r
e
k
a
H
t
t
p
C
l
i
e
n
t
.
e
x
e
c
u
t
e
(
S
e
s
s
i
o
n
e
d
E
u
r
e
k
a
H
t
t
p
C
l
i
e
n
t
.
j
a
v
a
:
77
)
a
t
c
o
m
.
n
e
t
f
l
i
x
.
d
i
s
c
o
v
e
r
y
.
s
h
a
r
e
d
.
t
r
a
n
s
p
o
r
t
.
d
e
c
o
r
a
t
o
r
.
E
u
r
e
k
a
H
t
t
p
C
l
i
e
n
t
D
e
c
o
r
a
t
o
r
.
s
e
n
d
H
e
a
r
t
B
e
a
t
(
E
u
r
e
k
a
H
t
t
p
C
l
i
e
n
t
D
e
c
o
r
a
t
o
r
.
j
a
v
a
:
89
)
a
t
c
o
m
.
n
e
t
f
l
i
x
.
d
i
s
c
o
v
e
r
y
.
D
i
s
c
o
v
e
r
y
C
l
i
e
n
t
.
r
e
n
e
w
(
D
i
s
c
o
v
e
r
y
C
l
i
e
n
t
.
j
a
v
a
:
846
)
a
t
c
o
m
.
n
e
t
f
l
i
x
.
d
i
s
c
o
v
e
r
y
.
D
i
s
c
o
v
e
r
y
C
l
i
e
n
t
3.execute(EurekaHttpClientDecorator.java:92) at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89) at com.netflix.discovery.DiscoveryClient.renew(DiscoveryClient.java:846) at com.netflix.discovery.DiscoveryClient
3.execute(EurekaHttpClientDecorator.java:92)atcom.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)atcom.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)atcom.netflix.discovery.DiscoveryClient.renew(DiscoveryClient.java:846)atcom.netflix.discovery.DiscoveryClientHeartbeatThread.run(DiscoveryClient.java:1399)
at java.util.concurrent.Executors
R
u
n
n
a
b
l
e
A
d
a
p
t
e
r
.
c
a
l
l
(
E
x
e
c
u
t
o
r
s
.
j
a
v
a
:
511
)
a
t
j
a
v
a
.
u
t
i
l
.
c
o
n
c
u
r
r
e
n
t
.
F
u
t
u
r
e
T
a
s
k
.
r
u
n
(
F
u
t
u
r
e
T
a
s
k
.
j
a
v
a
:
266
)
a
t
j
a
v
a
.
u
t
i
l
.
c
o
n
c
u
r
r
e
n
t
.
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
.
r
u
n
W
o
r
k
e
r
(
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
.
j
a
v
a
:
1149
)
a
t
j
a
v
a
.
u
t
i
l
.
c
o
n
c
u
r
r
e
n
t
.
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor
RunnableAdapter.call(Executors.java:511)atjava.util.concurrent.FutureTask.run(FutureTask.java:266)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

报错信息截图:
问题分析:
服务端报错:
可能时服务端像自己注册了,需要关闭服务端向自己注册
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka/
这里需要注意一下,配置文件中idea提示会出现default-zone这种形式,也会报错改为defaultZone
客户端报错:二个原因
1 、可能是服务端没有跑起来
2、 defaultZone: 配置的URL有问题
3、可能是服务端的端口被占用
针对第2种情况,
一、你需要认真检查一下 defaultZone: 的配置,和服务端的配置是否一直,
二、 或者是Spring2.0以后默认开的安全验证,你需要手动关闭,关闭方法为添加一个配置方法。
/**
* 高版本的丢弃了
*
* security:
* basic:
* enabled: true
* 配置,应该使用以下方式开启
* @param http
* @throws Exception
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// Configure HttpSecurity as needed (e.g. enable http basic).
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
http.csrf().disable();
//注意:为了可以使用 http://
u
s
e
r
:
{user}:
user:{password}@
h
o
s
t
:
{host}:
host:{port}/eureka/ 这种方式登录,所以必须是httpBasic,
// 如果是form方式,不能使用url格式登录
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
然后添加对应的@EnableWebSecurity依赖即可
org.springframework.boot
spring-boot-starter-security