2015-06-03 8 views
9

Vogliamo utilizzare HTTPS per le nostre comunicazioni con microservizi basate su Feign e Ribbon. I servizi sono basati su avvio primaverile e tomcat è impostato correttamente. Le istanze sono registrate con l'URL HTTPS e securePort abilitato su Eureka. Tuttavia, quando chiamiamo un altro microservizio tramite Feign, la barra sottostante non riconosce il protocollo e ricade su HTTP. Potrei risolvere il problema con l'aggiunta del protocollo per l'annotazione FeignClient in questo modo:Nuvole primaverili: nastro e HTTPS

@FeignClient("https://users") 

Ma sembra che il proxy Zuul e la Hystrix/turbina che sono anche utilizzando del nastro hanno internamente lo stesso problema fallback HTTP. Esiste un modo per configurare Ribbon centralmente per utilizzare HTTPS come predefinito o utilizzare l'impostazione securePort securePort dell'istanza di eureka registrata?

Eureka configurazione dell'istanza:

eureka.instance.hostname=localhost 
eureka.instance.securePort = ${server.port} 
eureka.instance.securePortEnabled = true 
eureka.instance.nonSecurePortEnabled = false 
eureka.instance.metadataMap.hostname = ${eureka.instance.hostname} 
eureka.instance.metadataMap.securePort = ${server.port} 
eureka.instance.homePageUrl = https://${eureka.instance.hostname}:${server.port}/ 
eureka.instance.statusPageUrl = https://${eureka.instance.hostname}:${server.port}/admin/info 

Con queste impostazioni Sembra a Eureka come il servizio viene eseguito su HTTPS. Il proxy Zuul funziona bene, ma usa l'URL HTTP per chiamare il servizio. È necessario abilitare SSL in primavera Boots Tomcat integrato, fornendo un certificato server in un archivio di chiavi:

server.ssl.key-store=server.jks 
server.ssl.key-store-password=<pw> 
server.ssl.keyStoreType=jks 
server.ssl.keyAlias=tomcat 
server.ssl.key-password=<pw> 

Tomcat che funziona solo su HTTPS e la porta HTTP è bloccata, ma di quello che ottiene: localhost:8081 failed to respond perché un URL HTTP è usato per chiamare il servizio. Impostando ribbon.IsSecure=true l'URL del servizio utenti viene generato correttamente, ma il loadbalancer Ribbon non riesce a cercare il servizio utenti in Eureka: Load balancer does not have available server for client: users. Ho anche provato a impostare users.ribbon.IsSecure=true solo nel proxy zuul, ma ho ancora lo stesso errore.

Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: user 
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:468) 
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) 
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) 
at rx.Observable$1.call(Observable.java:145) 
at rx.Observable$1.call(Observable.java:137) 
at rx.Observable$1.call(Observable.java:145) 
at rx.Observable$1.call(Observable.java:137) 
at rx.Observable.unsafeSubscribe(Observable.java:7304) 
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber$1.call(OperatorRetryWithPredicate.java:112) 
at rx.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:81) 
at rx.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.schedule(TrampolineScheduler.java:59) 
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:77) 
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:45) 
at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:41) 
at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:30) 
at rx.Observable$1.call(Observable.java:145) 
at rx.Observable$1.call(Observable.java:137) 
at rx.Observable$1.call(Observable.java:145) 
at rx.Observable$1.call(Observable.java:137) 
at rx.Observable$1.call(Observable.java:145) 
at rx.Observable$1.call(Observable.java:137) 
at rx.Observable.subscribe(Observable.java:7393) 
at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:441) 
at rx.observables.BlockingObservable.single(BlockingObservable.java:340) 
at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:102) 
at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:81) 
at org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand.forward(RibbonCommand.java:129) 
at org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand.run(RibbonCommand.java:103) 
at org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand.run(RibbonCommand.java:1) 
at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:298) 
+0

Se si utilizza 'securePort' di EUREKA, che dovrebbe essere il porto registrato con Eureka. – spencergibb

+0

Confermo il commento di spencergibb: non abbiamo alcun problema con l'inoltro ZUUL ai servizi che ascoltano 443 (assicurati di aver abilitato la porta sicura nel tuo client con 'eureka.instance.securePortEnabled = true') Tuttavia, mi chiedo se tu non dovrebbe sempre utilizzare "http" anziché "https" nell'annotazione @FeignClient, indipendentemente dalla reale porta in ascolto delle istanze. –

+0

Suppongo che il servizio sia registrato correttamente con eureka. Stiamo utilizzando le seguenti proprietà: 'eureka.instance.securePort = $ {} server.port eureka.instance.securePortEnabled = true eureka.instance.nonSecurePortEnabled = false' ma ancora ottenere' com.netflix.zuul.exception .ZuulException: errore di inoltro causato da: com.sun.jersey.api.client.ClientHandlerException: org.apache.http.NoHttpResponseException: : 8081 non ha risposto " –

risposta

4

abbiamo risolto il problema di proxy Zuul ora impostando

ribbon.IsSecure=true 
eureka.instance.secureVirtualHostName=${spring.application.name} 

in modo che tutti i servizi sono anche nelle host virtuali sicure piscina in com.netflix.discovery.shared.Applications. Questo aiuta il processo di scoperta a trovare le istanze in eureka.

Tuttavia, il cruscotto Hystrix ha ancora un problema simile

+0

in cui dovrebbero essere aggiunti queste 2 proprietà? Ho aggiunto queste 2 proprietà alla Spring Boot App che è abilitata HTTPS e registrata su Eureka. Quando Zuul tenta di instradare la richiesta, sembra che Zuul stia ancora provando a usare l'url HTTP per questo. Causato da: org.apache.http.ProtocolException: il server non è riuscito a rispondere con una risposta HTTP valida \t all'indirizzo org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:151) ~ [httpclient-4.3. 6.jar: 4.3.6] – yathirigan

+0

Ho aggiunto queste 2 proprietà anche al file yaml dell'applicazione Zuul Route, ma con lo stesso problema. org.apache.http.ProtocolException: il server non è riuscito a rispondere con una risposta HTTP valida – yathirigan

0

Ho lo stesso problema cercando di configurare delega Zuul di utilizzare del nastro per la connessione a servizi di micro esecuzione su https: RibbonRoutingFilter sta esaminando requestURI e creare RestClient quando viene eseguito il metodo eseguito. Ho configurato Eureka per funzionare su http però. È il microservizio https sottostante registrato su Eureka non accessibile dalla barra multifunzione.

http funziona perfettamente con semplici rotte zuul impostate.

+0

hai risolto questo problema? – yathirigan

+1

sì, questo è stato risolto specificando ribbon isSecure e implementando un socketfactory personalizzato per accettare il certificato desiderato. ' esempio: securePort: $ {} server.port secureVirtualHostName: $ {} spring.application.name metadatamap: instanceId: "$ {} spring.application.name: $ {spring.application.instance_id: $ {}} server.port" preferIpAddress: true securePortEnabled: true nonSecurePortEnabled: true nastro: isSecure: true CustomSSLSocketFactoryClassName: YourCustomSocketFactory ' – blindstack

Problemi correlati