Cannot execute request on any known server

3,621 阅读1分钟

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.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$HeartbeatThread.run(DiscoveryClient.java:1399)
	at java.util.concurrent.Executors$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$Worker.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://${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://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
        // 如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

然后添加对应的@EnableWebSecurity依赖即可

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>