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)
Wenn Sie EUREKAs verwenden 'securePort' sollte, dass der Port mit Heureka registriert sein. – spencergibb
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. –
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 ' –