gpt4 book ai didi

Spring Cloud : Ribbon and HTTPS

转载 作者:IT老高 更新时间:2023-10-28 13:47:20 25 4
gpt4 key购买 nike

我们希望使用 HTTPS 进行基于 Feign 和 Ribbon 的微服务通信。这些服务基于 Spring Boot,并且正确设置了 tomcat。这些实例使用 HTTPS URL 注册,并且在 Eureka 上启用了securePort。但是,当我们通过 Feign 调用另一个微服务时,底层的 Ribbon 无法识别协议(protocol)并回退到 HTTP。我可以通过将协议(protocol)添加到 FeignClient 注释来解决这个问题,如下所示:

    @FeignClient("https://users")

但似乎 Zuul 代理和 Hystrix/Turbine 也在内部使用 Ribbon 有相同的 HTTP 回退问题。有什么方法可以集中配置 Ribbon 以使用 HTTPS 作为默认值或使用注册的 eureka 实例的 securePort 设置?

Eureka 实例配置:

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

通过这些设置,它在 Eureka 中看起来就像服务在 HTTPS 上运行一样。 Zuul 代理运行良好,但使用 HTTP URL 调用服务。您必须通过在 keystore 中提供服务器证书来在 Spring Boots 嵌入式 Tomcat 中启用 SSL:

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 仅在 HTTPS 上运行并且 HTTP 端口被阻止,但我得到: localhost:8081 failed to respond 因为 HTTP URL 用于调用服务。通过设置 ribbon.IsSecure=true 可以正确生成用户服务 url,但是 Ribbon 负载均衡器无法在 Eureka 中查找用户服务:负载均衡器没有可用于客户端的服务器:用户。我还尝试仅在 zuul 代理中设置 users.ribbon.IsSecure=true,但仍然出现相同的错误。

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)

最佳答案

我们现在通过设置解决了zuul代理问题

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

以便所有服务也在 com.netflix.discovery.shared.Applications 中的安全虚拟主机池中。这有助于发现过程在 eureka 中找到实例。

不过,Hystrix 的仪表盘还是有类似的问题

关于 Spring Cloud : Ribbon and HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30622904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com