com.netflix.discovery.shared.transport.TransportException:无法在任何已知服务器上执行请求

时间:2017-09-09 13:26:18

标签: java spring-boot microservices

我对微服务非常陌生,并尝试从链接运行代码: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

我没有在系统上安装任何特殊内容。请告诉我我需要安装什么?

enter image description here

12 个答案:

答案 0 :(得分:18)

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

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

答案 1 :(得分:5)

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

eureka:
  client:
    register-with-eureka: false

答案 2 :(得分:4)

您需要创建另一个微服务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客户端。一旦您的注册表启动,您将不会遇到此异常。

答案 3 :(得分:3)

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

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

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

1)defaultZone地址不正确,可能是拼写错误或之后的空格:

2)在Eureka服务器上实现的Spring安全性要求每个请求都发送一个有效的CSRF令牌。尤里卡客户通常不会拥有有效的跨站点请求伪造(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

答案 4 :(得分:1)

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

    SELECT EMPLOYEE, CATEGORY, STATUS 
      FROM EMPLOYMENT 
      WHERE CATEGORY = 1 AND STATUS LIKE '%A%' 
and employee in (select EMPLOYEE from EMPLOYMENT where 
           CATEGORY = 2 AND STATUS = 'B')

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

server.port=8761

确保启用了EurekaServer,例如使用spring boot在主类上编写如下。

eureka.client.register-with-eureka=false

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

答案 5 :(得分:1)

如果在没有用户名和密码的情况下部署/运行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

答案 6 :(得分:1)

如果您拼写了defaultZone值中的任何内容,都会引发类似错误。例如:有人将尤里卡拼写成euraka。仔细检查。

defaultZone : http://localhost:8761/eureka

答案 7 :(得分:1)

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

application.properties(client-app)

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

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

答案 8 :(得分:0)

确保您的功能区客户端正确

package com.in28minutes.microservices.currencyconversionservice;

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name="curreenter code herency-exchange-service")
@RibbonClient(name="currency-exchange-service") 
public interface CurrencyExchangeServiceProxy { 
    @GetMapping("/currency-exchange/from/{from}/to/{to}")
    public CurrencyConversionBean retrieveExchangeValue
        (@PathVariable("from") String from, @PathVariable("to") String to); //mention correct pathvariables
}

答案 9 :(得分:0)

在ZuulLoggingFiler.java中查找filterType()。我有同样的问题。然后我看到我的过滤器返回null。所以我将其更改为“ post”并且有效。

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

对我来说,它在连接到互联网后就可以正常工作了,因为它需要首次下载一些依赖项。