设置 server.contextPath 的 Spring Boot 与通过 Eureka Server 到 hystrix.stream 的 URL

Posted

技术标签:

【中文标题】设置 server.contextPath 的 Spring Boot 与通过 Eureka Server 到 hystrix.stream 的 URL【英文标题】:Spring Boot with server.contextPath set vs. URL to hystrix.stream via Eureka Server 【发布时间】:2015-04-12 20:08:18 【问题描述】:

我有运行 Turbine 实例的 Eureka Server 和一些连接到它的发现客户端。一切正常,但如果我注册了一个设置了server.contextPath 的发现客户端,它不会被InstanceMonitor 识别,并且涡轮流无法组合它的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.access$100(InstanceMonitor.java:103)
    at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:235)
    at com.netflix.turbine.monitor.instance.InstanceMonitor$2.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.contextPathmanagement.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 必须为所有发现客户端设置相同的值 - 可以使用 Spring Cloud Config http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html 轻松完成

【问题讨论】:

【参考方案1】:

您可以设置turbine.instanceUrlSuffix.<CLUSTERNAME>=/uaa/hystrix.stream。其中<CLUSTERNAME>turbine.aggregator.clusterConfig 中设置的值。 Turbine 1 wiki 中的所有配置选项都有效。您不需要将端口添加到后缀,因为 Spring Cloud Netflix Turbine 从 eureka 添加端口。

【讨论】:

嗨,Spencer,感谢您的回答,我得尽快检查一下。快速提问 - 它是否涵盖一种情况,我有几个正在运行的实例,每个实例都有不同的上下文路径集? 应该是,用不同的<CLUSTERNAME>。 嗨 Spencer,我根据你的建议找到了解决我遇到的问题的方法。问题在于,如果要创建 hystrix.stream 的 url,server.contextPathmanagement.context-path 会混合在一起。我不得不放弃使用server.contextPath,我在最初的帖子中对此进行了描述。查看更多信息。谢谢!

以上是关于设置 server.contextPath 的 Spring Boot 与通过 Eureka Server 到 hystrix.stream 的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Nacos配置及常见问题

nacos切换mysql8.0数据库

在wildfly上运行war spring roo 2.0.0 RC1

spring-boot中如何配置tomcat访问日志的位置和名称?

springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下

将应用程序上下文路径附加到 Spring Boot 应用程序中的超链接