Spring Cloud实战小贴士:turbine如何聚合设置了context-path的hystrix数据
之前在spring for all社區(qū)看到這樣一個(gè)問(wèn)題:當(dāng)actuator端點(diǎn)設(shè)置了context-path之后,turbine如何聚合數(shù)據(jù)?首先,我們要知道actuator端點(diǎn)設(shè)置了context-path是什么意思?也就是說(shuō),此時(shí)spring boot actuator的端點(diǎn)都有了一個(gè)前綴,比如:
| management.context-path=/xxx |
如果設(shè)置了上面的參數(shù),那個(gè)對(duì)于收集hystrix數(shù)據(jù)的端點(diǎn)將變?yōu)?#xff1a;/xxx/hystrix.stream,如果我們還是拿上一篇Spring Cloud構(gòu)建微服務(wù)架構(gòu):Hystrix監(jiān)控?cái)?shù)據(jù)聚合【Dalston版】中構(gòu)建你的turbine應(yīng)用,那么將會(huì)看到如下錯(cuò)誤:
| INFO 7812 --- [ Timer-0] c.n.t.monitor.instance.InstanceMonitor : Url for host: http://172.15.0.18:9020/hystrix.stream default ERROR 7812 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Could not initiate connection to host, giving up: [{"timestamp":1499941336284,"status":404,"error":"Not Found","message":"No message available","path":"/hystrix.stream"}] WARN 7812 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Stopping InstanceMonitor for: 172.15.0.18:9020 default com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: [{"timestamp":1499941336284,"status":404,"error":"Not Found","message":"No message available","path":"/hystrix.stream"}] at com.netflix.turbine.monitor.instance.InstanceMonitor.init(InstanceMonitor.java:318) ~[turbine-core-1.0.0.jar:na] at com.netflix.turbine.monitor.instance.InstanceMonitor.access$100(InstanceMonitor.java:103) ~[turbine-core-1.0.0.jar:na] at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:235) [turbine-core-1.0.0.jar:na] at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:229) [turbine-core-1.0.0.jar:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91] |
從上述錯(cuò)誤中我們可以知道,turbine在收集的時(shí)候由于訪(fǎng)問(wèn)的是/hystrix.stream,而此時(shí)收集端點(diǎn)卻是/xxx/hystrix.stream,所以報(bào)了404錯(cuò)誤。
那么我們要如何解決呢?通過(guò)之前的配置內(nèi)容,我們可能找不到相關(guān)的配置信息,所以只能遍歷一下源碼,最后找到這個(gè)類(lèi):org.springframework.cloud.netflix.turbine.SpringClusterMonitor。它的具體內(nèi)容如下:
| public static InstanceUrlClosure ClusterConfigBasedUrlClosure = new InstanceUrlClosure() { private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory .getInstance().getStringProperty("turbine.instanceUrlSuffix", "hystrix.stream"); private final DynamicBooleanProperty instanceInsertPort = DynamicPropertyFactory .getInstance().getBooleanProperty("turbine.instanceInsertPort", true); public String getUrlPath(Instance host) { if (host.getCluster() == null) { throw new RuntimeException( "Host must have cluster name in order to use ClusterConfigBasedUrlClosure"); } // find url String key = "turbine.instanceUrlSuffix." + host.getCluster(); DynamicStringProperty urlClosureConfig = DynamicPropertyFactory.getInstance() .getStringProperty(key, null); String url = urlClosureConfig.get(); if (url == null) { url = this.defaultUrlClosureConfig.get(); } if (url == null) { throw new RuntimeException("Config property: " + urlClosureConfig.getName() + " or " + this.defaultUrlClosureConfig.getName() + " must be set"); } // find port and scheme String port; String scheme; if (host.getAttributes().containsKey("securePort")) { port = host.getAttributes().get("securePort"); scheme = "https"; } else { port = host.getAttributes().get("port"); scheme = "http"; } if (host.getAttributes().containsKey("fusedHostPort")) { return String.format("%s://%s/%s", scheme, host.getAttributes().get("fusedHostPort"), url); } // determine if to insert port String insertPortKey = "turbine.instanceInsertPort." + host.getCluster(); DynamicStringProperty insertPortProp = DynamicPropertyFactory.getInstance() .getStringProperty(insertPortKey, null); boolean insertPort; if (insertPortProp.get() == null) { insertPort = this.instanceInsertPort.get(); } else { insertPort = Boolean.parseBoolean(insertPortProp.get()); } // format url with port if (insertPort) { if (url.startsWith("/")) { url = url.substring(1); } if (port == null) { throw new RuntimeException( "Configured to use port, but port or securePort is not in host attributes"); } return String.format("%s://%s:%s/%s", scheme, host.getHostname(), port, url); } //format url without port return scheme + "://" + host.getHostname() + url; } }; |
從上述源碼中,我們可以找到這個(gè)參數(shù)turbine.instanceUrlSuffix,由此該問(wèn)題就迎刃而解了,我們只需要在turbine應(yīng)用的配置文件中增加如下配置信息,就能正確的收集之前配置了management.context-path=/xxx的微服務(wù)的hystrix數(shù)據(jù)了。
| turbine.instanceUrlSuffix=/xxx/hystrix.stream |
相關(guān)閱讀
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)注冊(cè)與發(fā)現(xiàn)(Eureka、Consul)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)消費(fèi)者(基礎(chǔ))
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)消費(fèi)者(Ribbon)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)消費(fèi)者(Feign)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式配置中心
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)容錯(cuò)保護(hù)(hystrix服務(wù)降級(jí))
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)容錯(cuò)保護(hù)(hystrix依賴(lài)隔離)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):服務(wù)容錯(cuò)保護(hù)(hystrix斷路器)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):Hystrix監(jiān)控面板
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):Hystrix監(jiān)控?cái)?shù)據(jù)聚合
- 更多Spring Cloud內(nèi)容…
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud实战小贴士:turbine如何聚合设置了context-path的hystrix数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Cloud构建微服务架构:
- 下一篇: Spring Cloud构建微服务架构: