2015-01-21 29 views
8

Sto tentando di utilizzare spring-cloud-starter-zuul. Ho impostato Eureka e registrato un servizio semplice che ho scritto come client Eureka. Ho registrato due istanze su due host diversi con due nomi di applicazioni diversi, quindi sono due diversi servizi in Eureka. Il mio obiettivo è quello di garantire che se serviceA sta funzionando bene e il servizioB sta funzionando male, il fatto che il proxy al servizio A non sia influenzato dall'assenza di proxy al servizioB.Come ottenere zuul di spring-cloud per utilizzare un circuito diverso per servizi diversi

Se eseguo load test serviceA solo tramite zuul, sono in grado di mantenere il mio throughput 400 TPS senza problemi. Se poi inserisco il servizio B e lo sovraccarico completamente e lo faccio fuori tempo, mi aspetterei che il servizio A continui a 400 mentre il servizio B è in difficoltà, ma invece il servizioA scende a meno di 50 TPS e ha un sacco di errori come bene.

Sembra che tutti i RibbonCommands generati da RibbonRoutingFilter condividano lo stesso circuito in hystrix, il che non ha senso per me. Cercando in RibbonRoutingFilter dove crea RibbonCommand, non vedo alcun modo per configurarlo per usarne uno diverso.

In RibbonRoutingFilter:

RibbonCommand command = new RibbonCommand(restClient, verb, uri, 
      convertHeaders(headers), convertHeaders(params), requestEntity); 

mi hanno confermato che il restClient è diverso per serviceâ e serviceB, così stanno usando la propria configurazione del pool di connessione come ho specificato nel file application.yml, ma ci è ancora una tonnellata di contaminazione incrociata nella qualità del servizio tra serviceA e serviceB.

Sembra che ci sia un altro costruttore per RibbonCommand che accetta un "commandKey" come primo parametro e quello a cui faccio riferimento si limita semplicemente a delegare a quello con un valore commandKey di "default". Non vedo interruttori o opzioni per sovrascrivere quello in RibbonRoutingFilter. Per me questo compromette seriamente la redditività di Zuul quando viene utilizzato dal progetto spring-cloud.

C'è un modo per me di configurare questo fuori dalla scatola in modo che ogni servizio abbia il proprio circuito?

parti applicabili della mia pom:

<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-parent</artifactId> 
     <version>1.0.0.RC1</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter</artifactId> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-zuul</artifactId> 
    </dependency> 

application.yml:

ribbon: 
    ConnectTimeout: 5000 
    ReadTimeout: 5000 
    MaxAutoRetries: 0 
    MaxAutoRetriesNextServer: 0 
    OkToRetryOnAllOperations: false 
    MaxHttpConnectionsPerHost: 200 
    MaxTotalHttpConnections: 1000 
echo1: 
    ribbon: 
    ActiveConnectionsLimit: 200 
echo2: 
    ribbon: 
    ActiveConnectionsLimit: 400 
spring: 
    application: 
    name: SpringCloudProxywall 
server: 
    port: 8080 
zuul: 
    routes: 
    echo1: 
     path: /echo1/** 
     serviceId: echo1 
     stripPrefix: false 
    echo2: 
     path: /echo2/** 
     serviceId: echo2 
     stripPrefix: false 

La mia classe di applicazione:

@Configuration 
@ComponentScan 
//@EnableCircuitBreaker <-- is already included in EnableZuulProxy 
@EnableZuulProxy 
@EnableTurbine 
@EnableHystrixDashboard 
@EnableAutoConfiguration 
public class SpringCloudProxywallApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(SpringCloudProxywallApplication.class, args); 
    } 
} 

risposta

5

Penso che se si utilizza uno snapshot che è già l'impostazione predefinita (circuito diverso per back-end): https://github.com/spring-cloud/spring-cloud-netflix/issues/160.

+0

Grazie per la risposta. Cercando di convalidare questo. Aggiornato all'istantanea, ha dovuto aggiungere esplicitamente la dipendenza di avvio-avvio-attuatore-molla (non necessario in RC1.) Senza altre modifiche al codice o alla configurazione, non delegherà al mio servizio downstream l'eccezione "com.netflix.client .ClientException: Load Balancer non ha server disponibile per client: echo2 ". Eureka è attiva (anche riavviata) e mostra tutti i servizi con un'istanza registrata e posso accedere ai servizi in modo indipendente. Continuerò a giocarci. – digitaljoel

+0

Hai le dipendenze di eureka? Ne hai bisogno in modo che '@ EnableDiscoveryClient' sappia che tipo di scoperta di servizi fare. –

+0

duh, la seconda volta che mi ha morso. Non avevo bisogno di alcuna di queste dipendenze in modo esplicito con RC1, quindi non ci ho nemmeno pensato. Grazie. – digitaljoel

Problemi correlati