0

我正在查看Spring Boot/Cloud和Netflix FW(Eureka,Ribbon)。我正在通過此示例工作:Spring Cloud/Netflix負載平衡OSS

https://spring.io/blog/2015/07/14/microservices-with-spring 基本上它是關於一些使用Eureka Service Registry的小型Spring Boot微服務。

我現在想要啓動幾個相同服務的實例(在本例中是AccountService,位於不同的端口上)。我讀過的所有東西(上面的文章,http://callistaenterprise.se/blogg/teknik/2015/04/10/building-microservices-with-spring-cloud-and-netflix-oss-part-1/等)表明,如果我這樣做,所有實例都會冗餘地註冊到Eureka,並且當我調用服務時,將應用客戶端負載平衡,並且動態選擇要調用的服務。

但是,這不會發生什麼。當我啓動第一個服務實例時,它會被註冊並顯示在Eureka儀表板中。當我在不同的端口上啓動相同的服務時,它也會註冊,但它似乎代替了以前的服務實例:Eureka儀表板仍然只顯示一個實例,其中可用區域= 1(應該是2?)以及對此服務的所有調用由二審處理。當我查詢註冊表時,僅應用此實例。

當我停止第二個實例時,經過一段時間尤里卡切換回第一個,它仍然有效。所以它似乎保留所有實例,但只使用最新註冊的實例。

我錯過任何重要的東西嗎?我認爲所有的實例應該同時使用?

========== 應用程序屬性是(這些都是基本持平,從春網站爲例):

EurekaServer

eureka: 
    instance: 
    hostname: localhost 
    client:  
    registerWithEureka: false 
    fetchRegistry: false 

server: 
    port: 1111  

spring: 
    thymeleaf: 
    enabled: false 

AccountsServer

spring: 
    application: 
    name: accounts-service 
    freemarker: 
    enabled: false   
    thymeleaf: 
    cache: false    
    prefix: classpath:/accounts-server/templates/  

eureka: 
    client: 
    serviceUrl: 
     defaultZone: http://localhost:1111/eureka/ 

server: 
    port: 4444 # HTTP (Tomcat) port, for the second instance this is changed to a different port 
+0

你可以從客戶端和服務器發佈你的application.properties嗎? –

回答

4

@dshuld如果您使用的是天使版本系列或版本1.0.x,您需要讓每個實例都有一個唯一的ID。請參閱docs here。例如:

eureka: 
    instance: 
    metadataMap: 
     instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}} 

對於Brixton發行版(1.1.x),它應該有一個合理的默認值。

+0

這正是我所需要的,謝謝一大堆! – dschuld

0

我認爲,既然您正在使用stat您AccountsServer IC端口號,尤里卡只能註冊一個實例...
你可以做這樣的事情在客戶端

server: 
    compression.enabled: true 
    port: 0 

(在這種情況下,我使用YAML來配置,而不是屬性)

在網關上,你應該指定要負載平衡器,就像

@Autowired 
private LoadBalancerClient loadBalancer; 
.... 
private String getUrl(){ 
    return loadBalancer.choose("your-service-name").getUri().toString(); 
} 

我做過類似的東西,如果你有興趣,你可以去看看here

+0

正如我在這個問題中寫的,第二個實例是從一個不同的端口開始的。而且我也嘗試了LoadBalancerClient.choose()方法,但同時也只給了我一個實例,從來沒有其他的實例。 – dschuld

+0

哦,對不起,我沒有看到。如果您等待1或2分鐘會發生什麼?客戶端可能找到2個實例嗎? –

+0

不,它只發現最近註冊的實例...當我停止該實例時,它會切換回首先註冊的實例 – dschuld