我正在寻找分布式弹簧配置的解决方案。我想把它存放在zookeeper中。 https://github.com/spring-cloud/spring-cloud-zookeeper确实具有该功能,但显然需要使用spring-boot
。
我是否可以在spring-boot
答案 0 :(得分:0)
答案 1 :(得分:0)
它不需要你使用Spring Boot,它只是提供自动配置,以防你做决定使用Spring Boot。换句话说,如果您没有使用Spring Boot,则不会自动应用任何配置,您必须自己提供配置。
Zookeeper是一个不错的选择,去吧。
修改强> 要在没有Spring Boot的情况下使用Zookeeper,您需要手动或通过导入Spring Boot将为您隐式导入的自动配置类来注册相应的bean。这个经验法则通常适用于所有启用Spring Boot的模块。
在您的情况下,您很可能只需要导入ZookeeperConfigBootstrapConfiguration
和ZookeeperConfigAutoConfiguration
。这些类可以在spring-cloud-zookeeper-config
模块中找到,因此不需要Spring Boot依赖项。
或者,您应该查看这些类及其@Import
并手动声明bean。
答案 2 :(得分:0)
我找到了一个使用spring-cloud-zookeeper而没有Spring Boot的解决方案,基于此处提供的想法https://wenku.baidu.com/view/493cf9eba300a6c30d229f49.html
首先,创建一个CloudEnvironement类,它将从Zookeeper创建一个PropertySource:
<强> CloudEnvironement.java 强>
public class CloudEnvironment extends StandardServletEnvironment {
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
super.customizePropertySources(propertySources);
try {
propertySources.addLast(initConfigServicePropertySourceLocator(this));
}
catch (Exception ex) {
logger.warn("failed to initialize cloud config environment", ex);
}
}
private PropertySource<?> initConfigServicePropertySourceLocator(Environment environment) {
ZookeeperConfigProperties configProp = new ZookeeperConfigProperties();
ZookeeperProperties props = new ZookeeperProperties();
props.setConnectString("myzookeeper:2181");
CuratorFramework fwk = curatorFramework(exponentialBackoffRetry(props), props);
ZookeeperPropertySourceLocator propertySourceLocator = new ZookeeperPropertySourceLocator(fwk, configProp);
PropertySource<?> source= propertySourceLocator.locate(environment);
return source ;
}
private CuratorFramework curatorFramework(RetryPolicy retryPolicy, ZookeeperProperties properties) {
CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
builder.connectString(properties.getConnectString());
CuratorFramework curator = builder.retryPolicy(retryPolicy).build();
curator.start();
try {
curator.blockUntilConnected(properties.getBlockUntilConnectedWait(), properties.getBlockUntilConnectedUnit());
}
catch (InterruptedException e) {
throw new RuntimeException(e);
}
return curator;
}
private RetryPolicy exponentialBackoffRetry(ZookeeperProperties properties) {
return new ExponentialBackoffRetry(properties.getBaseSleepTimeMs(),
properties.getMaxRetries(),
properties.getMaxSleepMs());
}
}
然后创建一个自定义的XmlWebApplicationContext类:当你的webapplication启动并替换Spring Boot的bootrap魔法时,它将允许从Zookeeper加载PropertySource:
MyConfigurableWebApplicationContext.java
public class MyConfigurableWebApplicationContext extends XmlWebApplicationContext {
@Override
protected ConfigurableEnvironment createEnvironment() {
return new CloudEnvironment();
}
}
最后,在 web.xml 文件中添加以下context-param,以便使用MyConfigurableWebApplicationContext类并引导您的CloudEnvironement。
<context-param>
<param-name>contextClass</param-name>
<param-value>com.kiabi.config.MyConfigurableWebApplicationContext</param-value>
</context-param>
如果您使用标准属性文件configurer,它仍应加载,以便您可以在本地文件和Zookeeper中同时拥有属性。
要实现这一切,您需要在类路径中使用spring-cloud-starter-zookeeper-config和curator-framework jar及其依赖性,如果您使用maven,则可以将以下内容添加到 pom.xml中强>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-zookeeper-dependencies</artifactId>
<version>1.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
</dependencies>