Spring 通过 Eureka 服务器将 server.contextPath 设置为 URL 至 hystrix.stream 启动
Spring Boot with server.contextPath set vs. URL to hystrix.stream via Eureka Server
我有 Eureka Server 和 Turbine 实例 运行 以及一些连接到它的发现客户端。一切正常,但如果我注册了一个设置了 server.contextPath
的发现客户端,它不会被 InstanceMonitor
识别,并且 Turbine 流无法组合其 hystrix.stream
.
在 Eureka/Turbine 服务器的日志中是这样的:
2015-02-12 06:56:23.265 INFO 1 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Hosts up:3, hosts down: 0
2015-02-12 06:56:23.266 INFO 1 --- [ Timer-0] c.n.t.monitor.instance.InstanceMonitor : Url for host: http://user-service:8887/hystrix.stream default
2015-02-12 06:56:23.268 ERROR 1 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Could not initiate connection to host, giving up: []
2015-02-12 06:56:23.269 WARN 1 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Stopping InstanceMonitor for: user-service default
com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: []
at com.netflix.turbine.monitor.instance.InstanceMonitor.init(InstanceMonitor.java:318)
at com.netflix.turbine.monitor.instance.InstanceMonitor.access0(InstanceMonitor.java:103)
at com.netflix.turbine.monitor.instance.InstanceMonitor.call(InstanceMonitor.java:235)
at com.netflix.turbine.monitor.instance.InstanceMonitor.call(InstanceMonitor.java:229)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
它尝试从 http://user-service:8887/hystrix.stream
获取 hystrix 流,其中正确的 URL 包括 sever.contextPath 应该是 http://user-service:8887/uaa/hystrix.stream
该客户的 application.yml
包含:
server:
port: 8887
contextPath: /uaa
security:
ignored: /css/**,/js/**,/favicon.ico,/webjars/**
basic:
enabled: false
我的问题是: 我应该向这个用户服务发现客户端添加一些额外的配置选项以注册正确的 hystrix.stream URL 位置吗?
我还没有深入研究,如果找到问题,我会在回答该问题之前通知您。
当前解决方案
使用 server.contextPath
和 management.context-path
时出现一个问题。当两者都设置好后,涡轮机流将在 ${HOST_URL}/${server.contextPath}/${management.context-path}/hystrix.stream
上提供服务。在那种情况下,我不得不放弃使用 server.contextPath
(我用控制器中的前缀 @RequestMapping
替换了它)。
现在,当您使用 management.context-path
时,您的 hystrix.stream 将由使用它作为前缀的 URL 提供服务。在这种情况下,您必须遵循 Spencer 的建议并设置
turbine.instanceUrlSuffix=/{PUT_YOUR_MANAGEMENT_CONTEXT_PATH_HERE}/hystrix.stream
当然,这个 management.context-path
必须为所有 Discovery Client 设置相同的值 - 使用 Spring Cloud Config http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
可以轻松完成
您可以设置turbine.instanceUrlSuffix.<CLUSTERNAME>=/uaa/hystrix.stream
。其中 <CLUSTERNAME>
是 turbine.aggregator.clusterConfig
中设置的值。 Turbine 1 wiki 中的所有配置选项都有效。您不需要将端口添加到后缀,因为 Spring Cloud Netflix Turbine 添加来自 eureka 的端口。
我有 Eureka Server 和 Turbine 实例 运行 以及一些连接到它的发现客户端。一切正常,但如果我注册了一个设置了 server.contextPath
的发现客户端,它不会被 InstanceMonitor
识别,并且 Turbine 流无法组合其 hystrix.stream
.
在 Eureka/Turbine 服务器的日志中是这样的:
2015-02-12 06:56:23.265 INFO 1 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Hosts up:3, hosts down: 0
2015-02-12 06:56:23.266 INFO 1 --- [ Timer-0] c.n.t.monitor.instance.InstanceMonitor : Url for host: http://user-service:8887/hystrix.stream default
2015-02-12 06:56:23.268 ERROR 1 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Could not initiate connection to host, giving up: []
2015-02-12 06:56:23.269 WARN 1 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Stopping InstanceMonitor for: user-service default
com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: []
at com.netflix.turbine.monitor.instance.InstanceMonitor.init(InstanceMonitor.java:318)
at com.netflix.turbine.monitor.instance.InstanceMonitor.access0(InstanceMonitor.java:103)
at com.netflix.turbine.monitor.instance.InstanceMonitor.call(InstanceMonitor.java:235)
at com.netflix.turbine.monitor.instance.InstanceMonitor.call(InstanceMonitor.java:229)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
它尝试从 http://user-service:8887/hystrix.stream
获取 hystrix 流,其中正确的 URL 包括 sever.contextPath 应该是 http://user-service:8887/uaa/hystrix.stream
该客户的 application.yml
包含:
server:
port: 8887
contextPath: /uaa
security:
ignored: /css/**,/js/**,/favicon.ico,/webjars/**
basic:
enabled: false
我的问题是: 我应该向这个用户服务发现客户端添加一些额外的配置选项以注册正确的 hystrix.stream URL 位置吗?
我还没有深入研究,如果找到问题,我会在回答该问题之前通知您。
当前解决方案
使用 server.contextPath
和 management.context-path
时出现一个问题。当两者都设置好后,涡轮机流将在 ${HOST_URL}/${server.contextPath}/${management.context-path}/hystrix.stream
上提供服务。在那种情况下,我不得不放弃使用 server.contextPath
(我用控制器中的前缀 @RequestMapping
替换了它)。
现在,当您使用 management.context-path
时,您的 hystrix.stream 将由使用它作为前缀的 URL 提供服务。在这种情况下,您必须遵循 Spencer 的建议并设置
turbine.instanceUrlSuffix=/{PUT_YOUR_MANAGEMENT_CONTEXT_PATH_HERE}/hystrix.stream
当然,这个 management.context-path
必须为所有 Discovery Client 设置相同的值 - 使用 Spring Cloud Config http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
您可以设置turbine.instanceUrlSuffix.<CLUSTERNAME>=/uaa/hystrix.stream
。其中 <CLUSTERNAME>
是 turbine.aggregator.clusterConfig
中设置的值。 Turbine 1 wiki 中的所有配置选项都有效。您不需要将端口添加到后缀,因为 Spring Cloud Netflix Turbine 添加来自 eureka 的端口。