【问题标题】:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known servercom.netflix.discovery.shared.transport.TransportException:无法在任何已知服务器上执行请求
【发布时间】:2018-02-18 05:58:27
【问题描述】:

我对微服务非常陌生,并尝试从链接运行代码:https://dzone.com/articles/advanced-microservices-security-with-spring-and-oa。当我简单地运行代码时,我看到以下错误出现。

有什么问题?

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:111) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1030) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:944) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1468) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient$CacheRefreshThread.run(DiscoveryClient.java:1435) [eureka-client-1.4.12.jar:1.4.12]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_144]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_144]

2017-09-09 18:53:11.909 ERROR 16268 --- [tbeatExecutor-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error

我没有在系统上安装任何特殊的东西。请让我知道我需要安装什么?

【问题讨论】:

    标签: java spring-boot microservices


    【解决方案1】:

    在 application.properties 中添加以下行解决了它:

    server.port=8761

    eureka.client.register-with-eureka=false

    eureka.client.fetch-registry=false

    第一个是可选的。

    另外两个属性用来告诉Eureka Server“嘿,你是这个上下文中唯一的Eureka Server,不要试图去寻找其他的Eureka Server”

    如果我们不提及这些,我们的 Eureka Server 会尝试在其他 Eureka Server 上查找并注册自己,最终会抛出 Transport Exception。

    【讨论】:

      【解决方案2】:

      我遇到了同样的错误。就我而言,在我的客户端应用程序的application.properties 文件中,我拼错了defaultZone 单词。我写了default-zone,但它必须是defaultZone

      客户端应用 application.properties:

      eureka.client.service-url.defaultZone=http://localhost:8030/eureka/
      

      主机名和端口可能因您的情况而异。

      【讨论】:

        【解决方案3】:

        依赖版本:

        • 春季启动2.5.6
        • 春云2020.0.4

        尤里卡服务器应用

        application.yaml

        server:
          port: 8010
        eureka:
          client:
            fetch-registry: false
            register-with-eureka: false
            service-url:
              defaultZone: http://localhost:8010/eureka
        

        MyEurekaClientApplication.java

        @EnableEurekaServer
        @SpringBootApplication
        public class MyEurekaServerApplication {
            public static void main(String[] args) {
                SpringApplication.run(MyEurekaServerApplication.class, args);
            }
        }
        

        尤里卡客户端应用

        application.yaml

        eureka:
          client:
            service-url:
              defaultZone: http://localhost:8010/eureka
        

        如果你使用default-zone而不是defaultZone,那么Eureka Client AppEureka Server上注册时会抛出异常。

        MyEurekaClientApplication.java

        @EnableEurekaClient
        @SpringBootApplication
        public class MyEurekaClientApplication {
            public static void main(String[] args) {
                SpringApplication.run(MyEurekaClientApplication.class, args);
            }
        }
        

        【讨论】:

          【解决方案4】:

          如果您在 defaultZone 的值中拼错任何内容,也会引发类似的错误。例如:有人将 eureka 拼错为 euraka。仔细检查一下。

          defaultZone : http://localhost:8761/eureka
          

          【讨论】:

            【解决方案5】:

            当我的 Eureka 客户端(即微服务尝试向 Eureka Server 注册自己)时,我遇到了同样的错误。

            客户端注册eureka服务失败注册失败无法在任何已知服务器上执行请求

            出现此错误消息是因为以下两种可能性。

            1) defaultZone 地址不正确,可能是拼写错误,或者:后面的空格缺失。

            2) 在 Eureka 服务器上实现的 Spring 安全性要求每个请求都发送一个有效的 CSRF 令牌。 Eureka 客户端通常不会拥有有效的跨站请求伪造 (CSRF) 令牌。因此,您需要为 /eureka/** 端点禁用此要求。

            在使用以下代码行禁用 CSRF 令牌后,我的 Eureka 客户端成功地将它们自己注册到 Eureka Server。

            @EnableWebSecurity
            class WebSecurityConfig extends WebSecurityConfigurerAdapter {
            
                @Override
                protected void configure(HttpSecurity http) throws Exception {
                    http.csrf().ignoringAntMatchers("/eureka/**");
                    super.configure(http);
                }
            }
            

            下面还有来自 spring 文档的链接。

            https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_securing_the_eureka_server

            【讨论】:

            • 您能告诉我们您尝试过的 Spring Boot 和 Spring Cloud 版本吗?我有同样的问题,罪魁祸首是弹簧安全。我已经尝试过您的解决方案,但没有区别。我已经看过文档和github.com/spring-cloud/spring-cloud-netflix/issues/2754。没有不同。顺便说一句,我的spring-boot 版本是:2.5.2 和spring-cloud 版本是:2020.0.3
            • @MortezaBandi 我的固定解决方案是使用 spring-boot 2.2.6.RELEASE 和 spring-cloud Hoxton.SR3
            【解决方案6】:

            对我来说它在连接到互联网后工作,因为它需要第一次下载一些依赖项。

            【讨论】:

              【解决方案7】:

              检查你的 eureka 服务器的 URL 和端口号 在“eureka.client.serviceUrl.defaultZone”属性中提供。

              【讨论】:

                【解决方案8】:

                如果您的 eureka 服务器在没有用户名和密码的情况下部署/运行,请使用以下属性。

                spring.application.name=Hello-World
                eureka.client.serviceUrl.defaultZone=http://eurekaserver:password@localhost:9100/eureka
                server.port=9200
                eureka.client.fetch-registry=true
                

                如果您的 eureka 服务器使用用户名和密码部署/运行,请使用以下属性。

                spring.application.name=Hello-World
                eureka.client.serviceUrl.defaultZone=http://eurekaserverusername:eurekaserverpassword@localhost:9100/eureka
                server.port=9200
                eureka.client.fetch-registry=true
                

                【讨论】:

                  【解决方案9】:

                  在 ZuulLoggingFiler.java 中查找 filterType()。我有同样的问题。然后我看到我的过滤器返回 null。所以我把它改成了“post”,它起作用了。

                  @Override
                  public String filterType() {
                      // TODO Auto-generated method stub
                      return "post";
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    我发现我必须将这两个应用程序添加到appllication.properties,它才能工作。只有一个是不够的。

                    eureka.client.register-with-eureka=false
                    
                    eureka.client.fetch-registry=false
                    

                    【讨论】:

                    • 这帮助我解决了我的问题,感谢@xuezhongyu01
                    • 谢谢...这是正确答案...eureka.client.fetch-registry=false 将此行包含在我的尤里卡微服务中。
                    • 是的,但这实质上使该客户端无法被发现。那是理想的吗?也许对于这种情况......对我来说,它本质上是:1)首先启动@EnableEurekaServer应用程序; 2) 之后启动任何@EurekaDiscoveryClient 应用程序。这主要是一个时间问题(尝试连接,失败,再试,失败,再试,成功)
                    • 澄清一下,上面的两个属性是在eureka服务器内部使用的,而不是客户端。这可以防止服务器自行注册。
                    • 感谢 eureka.client.register-with-eureka=false 解决了我的问题。
                    【解决方案11】:

                    发生这种情况是因为它正在尝试连接到任何已知服务器,因此要停止该错误,已知服务器是端口 8761 上的 eureka 服务器,这是其默认端口,您必须使用以下内容更新 application.properties

                    server.port=8761
                    

                    为避免 eureka 自行注册,请将其添加到 application.properties

                    eureka.client.register-with-eureka=false
                    

                    确保 EurekaServer 已启用,例如使用 spring boot 你在主类上编写以下内容。

                    @EnableEurekaServer
                    

                    请原谅我使用 .properties 文件提供解决方案,但这是我使用的,但 .yml 配置不应有太大不同。

                    【讨论】:

                      【解决方案12】:

                      您需要创建另一个微服务 Eureka Registry Server。它是 SpringBoot 应用程序的主类,应该有 @EnableEurekaServer 注释。

                      然后在您的 Eureka 客户端中,您必须在 appliation.yml 中提及注册表服务器 URL,如下所示:

                      spring:
                        application:
                          name: stock-service
                      
                      server:
                        port: 8083
                      
                      
                      eureka:
                        client:
                          registerWithEureka: true
                          fetchRegistry: true
                          serviceUrl:
                            defaultZone: http://localhost:8084/eureka/
                        instance:
                          hostname: localhost
                      

                      defaultzone 应该保存你的 Eureka Registry 的值。

                      完成所有这些配置后,您需要启动 Eureka Registry 微服务,然后您就可以启动 Eureka 客户端。注册表启动后,您将不会遇到此异常。

                      【讨论】:

                        【解决方案13】:

                        此特定消息只是一个警告。您的应用程序正在尝试向 Eureka 注册,但 Eureka 没有响应。您可以启动 Eureka 实例或通过将以下内容添加到 application.yml 来禁用自动注册。

                        eureka:
                          client:
                            register-with-eureka: false
                        

                        【讨论】:

                        • 哦,我想我的 Windows 盒子上没有安装 Eureka?那是问题吗?我需要安装它吗?
                        • 您的工作可能不需要它。只需禁用它,这样您就不会每 5 秒看到一条消息。如果您想了解有关 Eureka 的更多信息,请从这里开始 (spring.io/guides/gs/service-registration-and-discovery)
                        猜你喜欢
                        • 2020-04-03
                        • 2018-12-24
                        • 1970-01-01
                        • 2021-04-19
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-02-16
                        • 1970-01-01
                        相关资源
                        最近更新 更多