![](/img/trans.png)
[英]EurekaServer com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server on Docker
[英]com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
我對微服務非常陌生,並嘗試從鏈接運行代碼: 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
我沒有在系統上安裝任何特殊的東西。 請讓我知道我需要安裝什么?
我發現我必須將這兩個應用程序添加到 appllication.properties,它才能工作。只有一個是不夠的。
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
發生這種情況是因為它正在嘗試連接到任何已知服務器,因此要停止該錯誤,已知服務器是端口 8761 上的 eureka 服務器,這是其默認端口,您必須使用以下內容更新 application.properties
server.port=8761
為了避免尤里卡注冊自己,你把它添加到 application.properties
eureka.client.register-with-eureka=false
確保啟用了 EurekaServer,例如使用 spring boot,您在主類上編寫以下內容。
@EnableEurekaServer
請原諒我使用 .properties 文件提供解決方案,但這是我使用的,但 .yml 配置不應該有太大的不同。
您需要創建另一個微服務 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 客戶端。 一旦您的注冊表啟動,您將不會遇到此異常。
此特定消息只是一個警告。 您的應用程序正在嘗試向 Eureka 注冊,但 Eureka 沒有響應。 您可以啟動 Eureka 實例或通過將以下內容添加到 application.yml 來禁用自動注冊。
eureka:
client:
register-with-eureka: false
當我的 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 文檔的鏈接。
我得到了同樣的錯誤。 就我而言,在我的客戶端應用程序的application.properties
文件中,我拼錯了defaultZone
單詞。 我寫了default-zone
但它必須是defaultZone
。
客戶端應用application.properties
:
eureka.client.service-url.defaultZone=http://localhost:8030/eureka/
根據您的情況,主機名和端口可能會有所不同。
如果您的 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
依賴版本:
2.5.6
2020.0.4
: 2020.0.4application.yaml
server:
port: 8010
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://localhost:8010/eureka
MyEurekaServerApplication.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 App在Eureka Server上注冊時會引發異常。
MyEurekaClientApplication.java
@EnableEurekaClient
@SpringBootApplication
public class MyEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(MyEurekaClientApplication.class, args);
}
}
在 ZuulLoggingFiler.java 中查找 filterType()。 我有同樣的問題。 然后我看到我的過濾器返回 null。 所以我將其更改為“發布”並且它起作用了。
@Override
public String filterType() {
// TODO Auto-generated method stub
return "post";
}
檢查“eureka.client.serviceUrl.defaultZone”屬性中提供的 eureka 服務器的 URL 和端口號。
當您在 defaultZone 的值中拼錯任何內容時,將引發類似的錯誤。 例如:有人將 eureka 拼錯為 euraka。 仔細檢查一下。
defaultZone : http://localhost:8761/eureka
確保您的功能區客戶端正確無誤
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
}
對我來說,它在連接到互聯網后工作,因為它需要第一次下載一些依賴項。
在 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。
嘗試在要與命名服務器連接的微服務中添加此屬性:
eureka.instance.hostname=localhost
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.