2015-06-03 24 views
9

Wir wollen HTTPS für unsere Microservices-Kommunikation basierend auf Feign und Ribbon verwenden. Die Dienste basieren auf Spring Boot und Tomcat ist korrekt eingerichtet. Die Instanzen sind mit der HTTPS-URL registriert und Secure Port ist auf Eureka aktiviert. Wenn wir jedoch über Feign einen anderen Microservice anrufen, erkennt das zugrundeliegende Ribbon das Protokoll nicht und greift auf HTTP zurück. Ich konnte dieses Problem lösen, indem das Protokoll zu der FeignClient Anmerkung wie folgt ergänzt:Spring Cloud: Ribbon und HTTPS

@FeignClient("https://users") 

Aber es scheint, dass der Zuul-Proxy und die Hystrix/Turbine, die auch Band intern verwendet wird, haben das gleiche HTTP Ausweich Problem. Gibt es eine Möglichkeit, Ribbon zentral zu konfigurieren, um HTTPS als Standard zu verwenden oder verwenden Sie die securePort Einstellung der registrierten Eureka-Instanz?

Eureka Beispiel-Konfiguration:

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 

Mit diesen Einstellungen in Eureka wie der Dienst aussieht läuft auf HTTPS. Der Zuul-Proxy funktioniert problemlos, verwendet jedoch die HTTP-URL, um den Dienst aufzurufen. Sie müssen aktivieren Sie SSL in Spring Boots eingebettet Tomcat durch ein Serverzertifikat in einem Schlüsselspeicher bereitstellt:

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 als läuft nur auf HTTPS und der HTTP-Port gesperrt ist, aber als ich: localhost:8081 failed to respond weil eine HTTP-URL verwendet, um den Dienst anzurufen. Durch die Einstellung ribbon.IsSecure=true wird die Benutzer-Service-URL korrekt generiert, aber der Ribbon-Loadbalancer kann den Benutzer-Service in Eureka nicht suchen: Load balancer does not have available server for client: users. Ich habe auch versucht, users.ribbon.IsSecure=true in den zuul Proxy nur zu setzen, aber immer noch den gleichen Fehler.

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

Wenn Sie EUREKAs verwenden 'securePort' sollte, dass der Port mit Heureka registriert sein. – spencergibb

+0

Ich bestätige Spencergibb's Kommentar: Wir haben kein Problem mit ZUUL Weiterleitung an Dienste hören 443 (stellen Sie sicher, dass Sie den sicheren Port in Ihrem Client mit 'eureka.instance.securePortEnabled = true' aktiviert) Allerdings frage ich mich, ob Sie sollte nicht immer "http" anstelle von "https" in Ihrer @FeignClient-Annotation verwenden, unabhängig vom tatsächlichen Port, den Ihre Instanzen hören. –

+0

Der Dienst ist bei Eureka korrekt registriert, denke ich. Wir werden mit den folgenden Eigenschaften: 'eureka.instance.securePort = $ {} server.port eureka.instance.securePortEnabled = true eureka.instance.nonSecurePortEnabled = false' aber noch immer' zu .ZuulException: Weiterleitungsfehler verursacht durch: com.sun.jersey.api.client.ClientHandlerException: org.apache.http.NoHttpResponseException: : 8081 konnte nicht antworten ' –

Antwort

4

Wir lösten das zuul Proxy-Problem jetzt durch

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

Einstellung so, dass alle Dienste in com.netflix.discovery.shared.Applications auch in den sicheren virtuellen Hosts Pool sind. Dies hilft dem Erkennungsprozess, die Instanzen in Eureka zu finden.

jedoch das Hystrix Armaturenbrett hat noch ein ähnliches Problem

+0

wo sollten diese zwei Eigenschaften hinzugefügt werden? Ich habe diese 2 Eigenschaften der Spring Boot App hinzugefügt, die HTTPS aktiviert und für Eureka registriert ist. Wenn Zuul versucht, die Anfrage dorthin zu leiten, sieht es so aus, als ob Zuul immer noch versucht, die HTTP-URL dafür zu verwenden. Veranlasst von: org.apache.http.ProtocolException: Der Server konnte nicht mit einer gültigen HTTP-Antwort antworten \t unter org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:151) ~ [httpclient-4.3. 6.jar: 4.3.6] – yathirigan

+0

Ich habe diese 2 Eigenschaften auch der yaml-Datei meiner Zuul Route-Anwendung hinzugefügt, aber immer noch mit demselben Problem. org.apache.http.ProtocolException: Der Server konnte nicht mit einer gültigen HTTP-Antwort antworten – yathirigan

0

Ich habe das gleiche Problem Zuul Proxy zu konfigurieren versuchen Band zu verwenden, um Mikro-Dienste auf https laufen zu verbinden: RibbonRoutingFilter bei RequestURI suchen und RestClient erstellen, wenn laufen Verfahren ausgeführt wird. Ich habe Eureka so konfiguriert, dass es auf http läuft. Es ist der auf Eureka registrierte https-Microservice, auf den Ribbon nicht zugreifen kann.

http funktioniert perfekt mit einfachen zuul Routen eingerichtet.

+0

hast du dieses Problem gelöst? – yathirigan

+1

Ja, dies wurde gelöst, indem Ribbon isSecure angegeben wurde und eine benutzerdefinierte socketfactory implementiert wurde, um das gewünschte Zertifikat zu akzeptieren. ' Beispiel: Secure: $ {} server.port secureVirtualHostName: $ {} spring.application.name metadatamap: instanceId:„$ {spring.application.name}: $ {spring.application.instance_id: $ {server.port}}“ preferIpAddress: true securePortEnabled: true nonSecurePortEnabled: false Band: IsSecure: true CustomSSLSocketFactoryClassName: YourCustomSocketFactory ' – blindstack

Verwandte Themen