2017-07-19 126 views
0

我有一個作爲Eureka客戶端的Spring Boot應用程序。該應用程序需要通過REST調用另一個微服務,並且我希望使用Feign進行此調用。我遇到的問題是,我的應用程序正試圖在Eureka中查找服務名稱,當它僅在我的應用程序yaml文件中定義時。Feign客戶端通過Eureka在yaml中優先化URL

對於難以理解的解釋,我表示歉意,希望下面的代碼片段有助於澄清。

假死客戶端:

@FeignClient("foo") 
@Component 
public interface FooServiceProxy{ 
    @RequestMapping(value = "/balance", method = RequestMethod.POST, produces = "application/json") 
    ServiceResponse execute(ServiceRequest serviceRequest); 
} 

在我的控制器誰調用這個假死客戶端時,FooServiceProxy使用@Autowired定義:

@Autowired 
private FooServiceProxy fooServiceProxy; 

我YAML文件如下:

spring: 
    application: 
     name: app-name 

server: 
port: 8080 

foo: 
    ribbon: 
     listOfServers: http://hostname:8081/balance 

eureka: 
    client: 
    fetchRegistry: false 
    serviceUrl: 
     defaultZone: http://eurekasrver:8761/eureka/ 

我的問題是,在運行時,引發以下錯誤: java.lang.RuntimeException:com.netflix.client.ClientException:負載均衡器沒有可用的客戶端服務器:foo

有趣的是,如果我從應用程序中刪除@EnableEurekaClient註釋,則一切正常。我相信我理解這個問題,而不是在yaml文件中查找foo的服務器,因爲應用程序是Eureka客戶端,Feign直接找Eureka查找服務器ip,然後失敗,因爲找不到任何服務器。儘管似乎理解了這個問題,但我一直無法在網上找到解決方案或自己想一個解決方案。

任何幫助將不勝感激。 謝謝!

回答

0

關於這個問題,你應該考慮到,當尤里卡在你的類路徑上時,所有功能區配置都由尤里卡收費,所以它會使用尤里卡服務器的列表。

Spring Cloud使用@RibbonClient配置功能區使用的類型,例如服務器列表。如果你在類路徑中有尤里卡,默認情況下它使用尤里卡服務器列表(因此你需要使用該標誌來禁用尤里卡)。 評論說spencergibb https://github.com/spring-cloud/spring-cloud-netflix/issues/564

您可以通過添加NIWSServerListClassName配置嘗試之一:

`someservice.ribbon: 
    NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList 
    listOfServers: server1:80` 

或者嘗試在這個問題提出的解決方案https://github.com/spring-cloud/spring-cloud-netflix/issues/564