问题
turbine.instanceUrlSuffix
或 turbine.instanceUrlSuffix.default
配置不生效.
经过排查, 竟然是因为没有依赖 spring-cloud-starter-netflix-hystrix-dashboard
.
turbine 在处理配置的时候, 除了 TurbineProperties
中定义的属性以外, 其他的属性是不能从配置文件获取的. 如果需要获取, 则需依赖其他的包. 也就是说单独使用 turbine, 部分配置是无效的. 例如 “turbine.instanceUrlSuffix”, “InstanceDiscovery.impl” 等.
以下是排查思路:
如果 pom.xml
沒有依賴(注意一定要在 spring-cloud-starter-netflix-turbine
之前), turbine.instanceUrlSuffix
就不会生效:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
SpringClusterMonitor.java 中有一段代码:
private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory
.getInstance().getStringProperty("turbine.instanceUrlSuffix",
"actuator/hystrix.stream");
获取不到我们自己配置的 turbine.instanceUrlSuffix
, 就会用默认的 actuator/hystrix.stream
.
为什么依赖了 spring-cloud-starter-netflix-hystrix-dashboard
我们的配置就生效了?
因为 spring-cloud-starter-netflix-hystrix-dashboard
中依赖了 spring-cloud-starter-netflix-archaius
.
如果我们不依赖 spring-cloud-starter-netflix-hystrix-dashboard
, 而是直接依赖 spring-cloud-starter-netflix-archaius
, 也是可以的.
关键点在spring-cloud-starter-netflix-archaius
的依赖包 spring-cloud-netflix-archaius
. turbine
就会使用这个包注入的配置类的实例.
@Lazy(false)
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ ConcurrentCompositeConfiguration.class,
ConfigurationBuilder.class })
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public class ArchaiusAutoConfiguration {
...
@Bean
public static ConfigurableEnvironmentConfiguration configurableEnvironmentConfiguration(
ConfigurableEnvironment env, ApplicationContext context) {
Map<String, AbstractConfiguration> abstractConfigurationMap = context
.getBeansOfType(AbstractConfiguration.class);
List<AbstractConfiguration> externalConfigurations = new ArrayList<>(
abstractConfigurationMap.values());
ConfigurableEnvironmentConfiguration envConfig = new ConfigurableEnvironmentConfiguration(
env);
configureArchaius(envConfig, env, externalConfigurations);
return envConfig;
}
/**
* EnvironmentConfiguration wrapper class providing further configuration possibilities.
*
* @author Spencer Gibb
*/
public class ConfigurableEnvironmentConfiguration extends AbstractConfiguration {
private final ConfigurableEnvironment environment;
public ConfigurableEnvironmentConfiguration(ConfigurableEnvironment environment) {
this.environment = environment;
}
@Override
protected void addPropertyDirect(String key, Object value) {
}
@Override
public boolean isEmpty() {
return !getKeys().hasNext(); // TODO: find a better way to do this
}
@Override
public boolean containsKey(String key) {
return this.environment.containsProperty(key);
}
@Override
public Object getProperty(String key) {
return this.environment.getProperty(key);
}
总结
在包 spring-cloud-starter-netflix-turbine
前依赖包 spring-cloud-starter-netflix-hystrix-dashboard
, 或 spring-cloud-starter-netflix-archaius
就可以了.