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)
Se si utilizza 'securePort' di EUREKA, che dovrebbe essere il porto registrato con Eureka. – spencergibb
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. –
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 " –